Terrain Viewer

Changelog

What shipped, and when — the TL;DR of every release

Full commit-level detail lives in CHANGELOG.md on GitHub — this page is just the user-facing TL;DR of each release, the same list shown in the app's own Settings → What's New.

2026-08-21Live Lighting Rework: Native-Sharpness Phong & Matcap

  • Live Phong/Matcap rework (renderers now labeled Live vs Legacy): per-fragment normals straight from the float DEM on MapLibre's own 128×128 drape mesh — native-hillshade sharpness. Phong composites true albedo over the basemap/hypso stack (hidden surfaces handled, specular-only no longer dims the map) with a camera-headlamp light anchor; Matcap gets correct camera anchoring at every bearing and per-fragment depth (no more summits flickering behind neighboring tiles). Also fixed: tile-seam streaks, high-pitch near-camera tile dropouts, endless tile refetch on hi-dpi. New featured bookmarks (Amazon Rivers, Willamette River) with fresh thumbnails.
  • Shareable BYOD links — a URL referencing a sample-library source id (e.g. ?sourceB=custom-ign-lidarhd-dtm-wms-raw) now auto-adds it to a fresh visitor's Bring-Your-Own-Data list instead of showing an empty pane, and the new ?addSources=id1,id2 param prepopulates several terrain/basemap samples at once without selecting any of them.

2026-08-20Historical Fixes, Matcap Rework, Docs Restructure

  • Bug fixes — historical-satellite whole-earth default camera now applies; terrain mode gates the timeline to the Raster Basemap viz mode being active; matcap's screen-locked bright blob replaced by a proper view-space lookup; endless lighting-tile refetch on hi-dpi viewports fixed (dpr-aware tile selection).
  • Match Colors re-applies instantly in RGB; Bookmarks gets list/grid toggles (sidebar + gallery modal); the guided tour now wraps up with Keyboard Shortcuts and docs links.
  • Docs — new Export & Share, Projects, Open In, Streaming & Storage Settings, and River-REM pages; nav regrouped (Features vs Advanced Features; Dev gets Custom Protocols + Historical groups).

2026-08-19Docs Site Expansion and Open-In Additions

  • Docs site expansion — dozens of new or re-shot real screenshots across Visualization Modes, the full guided-tour Walkthrough, Split & Compare, and more; new user-facing pages (Walkthrough, Tools, Frescoes & Artifact Scans) in the Features guide; new developer documentation (Lighting Effects, Terrain Analysis Pipeline, ESRI Wayback).
  • New Open In destinations (Iconem River-REM, Google Maps 3D, Google Earth Historical/3D), a ?startTour=true deep link to launch the guided tour directly, plus assorted fixes (lightbox caption links, changelog date-key collisions, KaTeX formula layout).

2026-08-16Terrain Camera Fixes, Terrain Sources Docs, and Favicon Polish

  • Camera sync fixes — DEM tiles arriving after terrain turns on, pane resizes, and the padding easeTo all leave the elevation reference stale. Re-anchored on idle via recalculateZoomAndCenter (holds camera position, solves for the new center/zoom — nothing moves on screen), guarded by a 1 m epsilon so padding changes and mode switches don't nudge the focus point. The view you last touched is authoritative; the others are copied wholesale from it.
  • Elevation is now a synced camera parameter — a terrain camera has a sixth parameter beyond center/zoom/bearing/pitch/roll (the elevation of the point it looks at), and it wasn't being forwarded in split/overlay. MapLibre freezes it for the whole drag on the moved view while re-resolving it live on every jumpTo to the others, so the panes drifted vertically apart for the duration of a drag and snapped back on release. The moved view's elevation is now forwarded explicitly.
  • Fixed several camera-reset edge cases: MapLibre's easeTo leaves _elevationFreeze stuck on unless freezeElevation is passed (suppressing per-frame reclamp and leaving panes in asymmetric internal state after whichever one you'd last dragged); ground-clamping bookkeeping was keyed by view id which outlives the map instance (a remounted pane stayed permanently clamped); programmatic camera commands now stand down while a pointer is held (previously jumpTo/easeTo's Map#stop() silently ate a press-and-hold gesture).
  • Panel open/close now animated (padding, pane rects, gutter, borders ease over 200ms); sidebar/timeline avoidance padding extended to lone view, single-row/column grids, and Overlay panes; Map B defaults to AWS terrain (no API key); new Terrain Sources docs page; favicon shape reactive to live app mode.

2026-08-16Guided Product Tour

  • New guided product tour (Compass icon in Settings, or auto-starts on first visit): a branching walkthrough covering the shared basics, then either the Terrain visualization tools or Historical Satellite imagery mode, chosen at a fork partway through.
  • Each branch ends with a Tools step listing that mode's map-based utilities (Drawing, Elevation Picker, Sun/Shadow Calculator beta, Animation, Source Info — the historical branch's subset excludes the terrain-only ones).

2026-08-14Docs Site, Featured Bookmarks, and Tells Freeze Fixes

  • Added a documentation site, live-linked from the app general settings.
  • Featured bookmarks: a curated "Featured" strip of starter viewpoints (different terrain shapes, visualization combinations, and a historical-imagery example) now sits above your own saved bookmark list.
  • Mound detector (Tells): new Frozen/Live toggle — pin the currently-detected candidates in place so panning/zooming doesn't keep re-querying and recomputing them.
  • Visiting historical-satellite.iconem.com now lands you straight in Historical Imagery mode, with its own clock-shaped favicon (matching the timeline toggle's own icon) instead of the terrain mountain.
  • In split/grid compare mode, clicking a basemap's name (not just its per-view toggle) now sets that source on every active view at once.

2026-08-11Histogram Color Matching in Compare and Blend

  • Match Colors via Histogram Matching: automatically recolors every other view onto View A's color histogram, so two different imagery sources (or two dates of the same source) no longer look noticeably darker/bluer/warmer next to each other when compared or blended.
  • Five color spaces to choose from: RGB is instant (a live CSS filter); HSL/HSV/LAB/LCH are slower but can match more subtle color differences. Ported from Iconem/historical-satellite's standalone histogram-matching demo.

2026-08-10N-Map Grid, Overlay blend, and export historical imagery

  • N-Map Grid mode: in addition to 2x1, can now also do 3x1, 4x1, or 2 rows, 2x2 up to 4x2. Gains a Grid shape, now supporting up to 8 synced map views, not just a 2-way split.

    Comparing basemap sources side-by-side in grid mode

  • Compare and Blend's Split Mode: Off/Side/Overlay, where gutter can be horizontally dragged for clip ratio, or the pill vertical position controls map view B transparency

  • Blend Mode for overlaid Map View: Multiply, Difference, Soft-Light etc. Dropdown now exposes every CSS blend mode, not just a curated handful.

  • Export historical GeoTIFFs across a date range, with an option to generate ready-to-run gdal_translate scripts.

  • Optional colored map borders and a capture-date pill make it easy to tell which pane is which.

2026-08-07Historical Satellite Imagery Timeline, Terrain vs Historical Mode Picker

  • New "Historical Imagery" mode: scrub a real per-tile capture-date timeline bottom panel, across ESRI Wayback, Google Earth Historical, Landsat/Sentinel (HLS), Planet, and Bing.

    Scrubbing the historical timeline across capture dates

  • Mode Picker: Terrain vs Historical switches the whole sidebar between Terrain Viewer and a simplified Historical Imagery layout.

  • Every historical basemap source feeds real attribution, including dynamically-resolved provider/date info for Wayback, Google Earth Historical, and Bing.

  • The light-direction XY pad itself gained a full bidirectional datetime binding: drag it and it back-solves the closest matching day-of-year/time-of-day (and the sliders still drive it forward as before), hatching every position the sun can't physically reach at the current latitude (a real day/night-boundary constraint).

  • Sun Shadow Calculator: new Reverse mode: click a shadow to back-solve the light direction and time of day, knowing building height. Also see the standalone sun-position estimator tool.

2026-07-31Draw export split, Colorramp Editor, Bookmarks Gallery

  • TerraDraw export split mode: button with a "split by layer" option.
  • Colorramp editor: A live session-only for quick, non-persisted ramp-stop edits.
  • Bookmarks gallery now flattens into one continuous grid by default.

2026-07-30COG GSD surfacing & Foldable Bookmarks Tree

  • COG sources now auto-show their inferred native resolution and ground-sample distance.
  • Bookmarks: drag-and-drop reordering, collapsible project folders, fold/expand-all, and an edit mode to keep the everyday view uncluttered.

2026-07-28Whole-Project Export, Hard Shadows & Sun Shadow Calculator

  • Whole-project import/export in one file (terrain/basemap sources, bookmarks, drawings, settings, with zip to embed vector drawings/local COGs as an option).
  • Hard Shadows: a new visualization mode casting real hard shadows from the shared light direction, independent of the Sun Shadow Calculator tool.
  • Sun Shadow Calculator: pick a point + an object's height, get its shadow at the current sun position.
  • SVF/Openness gain faster precision, plus a new Principal Components (PCA) relief-mode family (Blobness, Eigenvalue Ratio, Dominant Orientation, Shape Index).
  • Terrain Analysis's Settings description split into 3 subheadings (Surface derivatives, Neighborhood statistics, Principal Components) to match.

2026-07-28Bookmarks & Feature Iterator

  • View bookmarks: save/restore full viewport + viz state, sidebar list + gallery.
  • Feature Iterator: step through a drawn/imported layer's features one at a time (select, delete, arrow-key nav, fly-to-next).
  • A compute-time estimate now shows for slow modes (SVF, Openness, Local Dominance) while their tiles are still loading.

2026-07-28Linked Terrain/Basemap Sources & Non-Geo Mode

  • Linked terrain/basemap source pairing: for paired datasets like a fresco's DTM plus its own albedo photo, picking one auto-selects the other. Part of this app's non-geo mode, a complementary viewer to RTI/PTM tools like OpenLime (not a replacement) for viewing normal-map/albedo photogrammetry data as if it were terrain. See issue #1 for the feature-parity tracker, and a real example on OpenLime itself for comparison.

2026-07-27Contours extended, Local Persistence, Routing & New Tools

  • Contours extended to local/BYOD COG sources via a dedicated worker, plus line-weight and color controls.
  • Local COG files and vector layers now survive a reload via OPFS persistence.
  • Routing mode for Elevation Picker: a BRouter/Valhalla road-following route (foot/cycle/vehicle profiles) between two picked points instead of a straight line, with a routed elevation profile along it.
  • New tools: Source Info panel (states which underlying provider a composited Mapterhorn/AWS tile actually came from, not just the mosaic's name), Plane Slicer (choose Local Relief Model or raw altitude as the reference plane; Contours share the same choice), Local Dominance relief mode (later sped up via pyramid octaves).
  • Shared custom colorramp editor extended across every viz mode.
  • A cancel button for DTM export appears after ~1.5s if the export is still running.

2026-07-27RiverREM

  • The footer's "Also see" links now explicitly describe RiverREM (repo), a separate app built for a similar use case, on rivers instead of terrain: draw or import a river centerline (or fetch one from OSM via Overpass/QLever, the longest named waterway, or all matches), smooth/interpolate its water-surface elevation (WSE) along that line, then de-trend the DEM against it (REM = DEM − WSE) to get a Relative Elevation Model highlighting fluvial terraces a flat elevation map hides, pure client-side, or server-based via OpenTopography's Python RiverREM.

2026-07-22Matcap/Phong Lighting Rebuilt as Live WebGL Shaders

  • Matcap/Phong lighting was rebuilt as live WebGL shaders, then reverted the same morning to a GPU-accelerated raster-tile approach after the WebGL version proved unstable; native MapLibre Hillshade was restored as its own mode alongside it.

2026-07-21Theme Editor

  • New standalone Theme Editor: live Tailwind v4/shadcn theming with tweakcn/shadcnstudio presets.

2026-07-18Relief Visualization Split & Sidebar Labels

  • Relief Visualization split into its own separate group (Sky View Factor SVF, Openness) from Terrain-analysis (Curvature, TPI, Roughness, Det-Hessian, Blobness).

    Sky-View Factor relief visualization

  • Relief Visualization and Terrain Analysishave a Basic/Advanced collapse toggle to either just activate/deactivate the additional sub-modes, or go further and edit their symbology.

  • Keyboard shortcuts: Shift-tap to peek at the raster basemap, Ctrl-tap to hide every overlay down to just the basemap. See all keyboard shortcuts in the dedicated section of General Settings modal.

  • Labeled Sources / Options / Detectors / Tools sidebar dividers for scanning a long control panel.

2026-07-18TerraDraw Multi-Layer Drawing

  • TerraDraw becomes multi-layer: drawing and GeoJSON import now target whichever layer is active.

2026-07-15Local COG (BYOD) Terrain Sources

  • Local COG (BYOD) terrain sources: load a .cog.tif straight off disk, no upload.
  • Viz-mode tile caching: an LRU of finished viz-mode tile bytes that makes re-toggling a mode instant instead of recomputing it.

2026-07-12Mound Local Tops Detector Beta

  • Experimental "Tells" archaeological mound detector, gated behind a Beta toggle: flags candidate mounds by finding local extrema/maxima of the LRM, then veto-filters them by Blobness, Plan Curvature/Divergence, and Det-Hessian to reject saddles and ridges.

2026-07-11Terrain Analysis: Curvature Suite Expanded

  • Terrain-analysis suite: Profile curvature (rate of slope change along the steepest-descent direction, i.e. flow acceleration) and Plan curvature (rate of aspect change across contours, i.e. flow convergence/divergence), plus TPI and Roughness; Det-Hessian and Blobness followed.

2026-07-10Local Relief Model (LRM) Relative Elevation to neighborhood

  • Local Relief Model (LRM): a new relief mode isolating local bumps from the regional trend. This is compute-optimized by subtracting the elevation tiles altitude at native viewport resolution from the bi-linearly interpolated trend, requested from a lower resolution version of the pyramid. User can control how many levels lower, and sees the resulting gaussian mean scale he chooses.

2026-07-09Client-Side DSM Export, Project Presets, Basemap Overlays & Elevation Picker

  • Client-side GeoTIFF export without Titiler, and shareable per-project embed configs.
  • Project embed presets: ?project= links can seed a fully preconfigured view:
  • Basemap overlays (samples ships demo radar, trails, stamen watercolor) that layer on top of any basemap instead of replacing it.
  • Elevation Picker: click-to-sample elevation at point or delta between two-points

2026-07-08Slope Visualization Mode

  • Slope visualization mode: launched as a PlanTopo server-hosted overlay (computed offline from Mapterhorn), upgraded to a client-side "Slope and More" v2: a custom MapLibre protocol computed directly from whichever terrain source is active (BYOD included), rather than PlanTopo's own fixed dataset. Later grew into the full curvature/TPI/roughness/LRM/Tells suite above.

Slope-angle visualization mode

2026-07-07NextGIS QMS, Photon Geocoder, Animation Pose via URL & TileJSON

  • NextGIS QMS search: search and add basemaps directly from NextGIS QuickMapServices public catalog;
  • Switched search location geocoder to Photon geocoder.
  • Camera/animation poses are now URL-shareable.
  • Added TileJSON data source type
  • Added new colorramps CET/SDR ramps

2026-02-19Light-Direction Spherical Control via XYPad

  • Light-direction control for Hillshade via XYPad: drag a 2D pad to set illumination azimuth/elevation, instead of two separate sliders.

Dragging the XYPad to set light azimuth/elevation

2026-02-19Animation, Video Export & Minimap

  • Animation Capabilities, with keyframe-based (Complete vs Smooth) video export.
  • Video export tries MediaBunny first (real muxed MP4/H.264 via WebCodecs), falling back to raw WebCodecs (H.264, no muxing) if MediaBunny throws, then all the way to MediaRecorder (WebM) if the browser lacks WebCodecs entirely.
  • Minimap with main viewport footprint/frustum bbox shown, fully configurable.
  • Finer Terrarium quantization (4mm vs. TerrainRGB 10cm) shipped as a High-Precision toggle.

2026-02-18Drawing Tools via TerraDraw, Sources Samples & Contours Consolidation

  • Drawing Tools via TerraDraw: draw shapes, points, and more; import/export geojson features.
  • Load Sample buttons added to the terrain/basemap source pickers with a variety of nation-wide sources.
  • Contours reworked and consolidated into their own "Contours & GeoGrid" section.
  • Fold/expand-all for every sidebar section, with collapsed state now persisted via jotai atomWithStorage.

2026-02-13BYOD Basemaps & WMS/DTM-DSM Sources

  • BYOD basemaps TMS, WMS, COG, finalized as their own custom-source type via custom protocol, alongside the existing BYOD terrain sources.
  • WMS raw-elevation support (e.g. IGN France) now stream as MapLibre raster-dem via a custom MapLibre protocol. Standalone demo: maplibre-raster-dem-wms-float32-generic.html.
  • DTM-DSM LidarHD selector in samples
  • Graticule layer
  • Share section

2025-11-18cpt-city Colorramp Library

  • Adding a large open-license colorramp library, cpt-city, with classic, topo, topobath, top qgis, and temp groups.

2025-11-14Geomatico COG Protocol vs. Titiler

  • Offer the choice to stream COG via Geomatico's native MapLibre COG-protocol vs. Titiler. The direct client protocol avoids Titiler's rate limiting and is faster (no middleware hop), but is less permissive: it only reads COGs already in Web Mercator (EPSG:3857), where Titiler can reproject on the fly server-side.

2025-11-07BYOD (Bring Your Own Data) Terrain Sources

  • Bring Your Own Data (BYOD) Terrain sources let users import their own TMS, COG remote endpoint terrain sources.

2025-11-04Initial Launch, Viz Modes, Shareable URLs & Split Mode

  • Initial launch with all user-controls on one foldable, sidebar control panel. UI transparency on slider change enables better-feedback, 2D/3D/Globe map projection modes.
  • Terrain visualization modes: Hillshade (Combined, Standard, Aspect Multidir colors, Igor, Basic), Hypsometric color-relief, Raster Basemap
  • Sources for Terrain (Terrarium /TerrainRGB): Mapterhorn, Mapbox, Maptiler. AWS Terrain Tiles.
  • Source for Raster Basemaps: Google, Bing, ESRI, Mapbox, Here, OSM
  • Shareable URLs, State persisted to URL via nuqs so any shared url results in visually the exact same map.
  • Split Mode: A/B side-by-side comparison, originally built for comparing the same location's resolution/quality across different terrain sources (Mapterhorn vs. Mapbox/MapLibre terrain-RGB vs. AWS Terrain Tiles).