What's Changed
- fix: support Add Vector Layer on Cesium by @giswqs in #2382
- feat: add getLayers/onLayersChanged to GeoLibreAppAPI by @Phichak-Kamin in #2386
- feat(style-import): paste a style from the layer menu and the Style panel by @clintonlunn in #2385
- Add optional Mapbox rendering engine by @giswqs in #2389
- fix(style-import): stop a hidden style layer deciding how the layer is drawn by @clintonlunn in #2388
- fix: render vector and raster plugins correctly in Mapbox by @giswqs in #2390
- fix: share basemap control with Mapbox and default to Streets by @giswqs in #2391
- fix: improve Add Data compatibility with Mapbox by @giswqs in #2392
- feat: support PMTiles, LiDAR and 3D Tiles on Mapbox by @giswqs in #2393
- chore(deps): bump anthropics/claude-code-action from 1.0.216 to 1.0.223 in the actions-minor-patch group by @dependabot[bot] in #2394
- chore(deps): bump the npm-minor-patch group with 33 updates by @dependabot[bot] in #2395
- fix(assistant): return the SQL table name from list_layers and key it by layer id by @giswqs in #2402
- fix(assistant): document add_geojson data-first in the run_python tool description by @giswqs in #2401
- fix(earthdata): make plainText() linear on whitespace runs and unclosed tags by @giswqs in #2403
- feat(assistant): explicit class breaks for apply_symbology, and report the stops applied by @giswqs in #2405
- feat: let plugins contribute guidance to the assistant system prompt by @giswqs in #2404
- feat(map): host the layer control on the Mapbox renderer by @giswqs in #2408
- Fix/stac paginated collections by @cedricbouffard in #2407
- feat(map): give the Mapbox renderer MapLibre's default controls by @giswqs in #2409
- feat(mapbox): host Deck.gl Layer, 3D Model and DuckDB on the Mapbox renderer by @giswqs in #2412
- chore(deps): bump geolibre-wasm to 1.5.3 for the big-endian GeoTIFF fix by @giswqs in #2416
- feat(mapbox): host Zarr layers on the Mapbox renderer by @giswqs in #2414
- fix(kml): stop time-animated KMZ placemarks from freezing the app by @giswqs in #2415
- chore(deps): patch npm audit advisories by @giswqs in #2417
- fix(add-data): enable KML / KMZ on the MapLibre and Mapbox renderers by @giswqs in #2418
- feat(mapbox): enable the Plugins menu on the Mapbox renderer by @giswqs in #2419
- feat(geo-editor): run the Geo Editor on the Mapbox renderer by @giswqs in #2422
- feat(overture): run Overture Maps on the Mapbox renderer by @giswqs in #2424
- feat(arcgis): add the ArcGIS Maps SDK for JavaScript as an optional CDN-loaded rendering engine by @giswqs in #2423
- feat(arcgis): add 3D scenes, terrain and extrusion to the ArcGIS renderer by @giswqs in #2429
- feat(flight-simulator): fly the Mapbox renderer's free camera by @giswqs in #2425
- feat(streetview): run Street View on the Mapbox renderer by @giswqs in #2426
- feat(swipe): run Layer Swipe on the Mapbox renderer by @giswqs in #2427
- feat(geoagent): run GeoAgent on the Mapbox renderer by @giswqs in #2428
- fix(swipe): stop a Mapbox basemap change orphaning the comparison pane by @giswqs in #2433
- test(e2e): stop the Mapbox DuckDB spec blocking on a WebGL context teardown by @giswqs in #2436
- test(e2e): budget the renderer swap so the DuckDB spec passes first try by @giswqs in #2437
- fix(mapbox): drop empty geometry layers and keep swipe sides across basemap changes by @giswqs in #2435
- fix(attribute-table): commit unsaved table drafts before saving edits to the source by @giswqs in #2441
- feat(vector): let the Buffer tool dissolve its result by @giswqs in #2440
- test(e2e): split the Playwright suite into a core gate and a nightly suite by @giswqs in #2442
- fix(search): navigate ArcGIS and Mapbox search results by @giswqs in #2443
- Add ArcGIS basemap picker and native layer control by @giswqs in #2444
- Support native ArcGIS heatmaps, clusters, patterns and feature altitude by @giswqs in #2445
- Render custom COG terrain in ArcGIS scenes by @giswqs in #2446
- Render COG imagery on ArcGIS maps and scenes by @giswqs in #2447
- Host deck.gl visualizations on ArcGIS maps and local scenes by @giswqs in #2449
- feat: render PMTiles and MBTiles archives with ArcGIS by @giswqs in #2451
- feat: render Zarr and NetCDF grids with ArcGIS by @giswqs in #2452
- feat: adapt data plugin controls to ArcGIS by @giswqs in #2458
- fix: preserve ArcGIS projects when the CDN is unavailable by @giswqs in #2459
- fix: preserve fieldwork controls and export point coordinates by @giswqs in #2461
- Add WCS 1.0 coverage discovery and numerical raster subsets by @giswqs in #2460
- feat(services): add a runtime-configured deployment service library (#2457) by @deniial00 in #2463
- feat: import raster TileJSON metadata through XYZ sources by @JPPereira93 in #2456
- feat: add OSM downloader web service by @giswqs in #2465
- fix(storymap): make handout HTML stripping linear by @giswqs in #2468
- fix: update GeoLibre Web launch link in mkdocs.yml by @giswqs in #2469
- refactor: clarify SQL table name sanitization by @giswqs in #2470
- docs: add rendering engines guide and renderer references by @giswqs in #2471
- chore: use native DGGS cellToParent by @thangqd in #2473
- feat(geolens): remember and auto-connect server by @giswqs in #2472
- fix: select and group GeoPackage layers on import by @giswqs in #2474
- fix: support story maps on Mapbox by @giswqs in #2478
- fix: restore raster layers on Mapbox by @giswqs in #2479
- fix: enable feature selection on Mapbox by @giswqs in #2480
- fix: defer Mapbox vector sources until materialized by @giswqs in #2481
- fix: support field collection on Mapbox by @giswqs in #2482
- Fix Mapbox engine parity gaps by @giswqs in #2483
- Fix map context menu across renderers by @giswqs in #2484
- Fix Mapbox status and diagnostics parity by @giswqs in #2485
- fix: gate MapLibre-only controls by renderer by @giswqs in #2486
- Fix Mapbox embed and notebook bridge events by @giswqs in #2487
- Fix Mapbox collaboration overlays by @giswqs in #2490
- Add multiple WFS and OGC API feature layers by @giswqs in #2491
- fix(map): align Mapbox identify popups with the shared popup module (#2475) by @giswqs in #2493
- Add native LandXML import by @giswqs in #2492
- refactor(map): share selection highlighting across engines (#2475) by @giswqs in #2494
- fix(map): keep Identify cursor consistent across renderers by @giswqs in #2495
- refactor(map): extract identify popup lifecycle into a shared module (#2475) by @giswqs in #2496
- fix(map): restore MapLibre identify selection on popup dismissal (#2475) by @giswqs in #2498
- fix(toolbar): one scrollable menu row on small screens by @giswqs in #2501
- fit(map): honor metadata/source bounds and guard fitBounds on Mapbox by @giswqs in #2503
- ci(review): allow a
claude-reviewlabel to trigger a review by @giswqs in #2508 - fix(3d-tiles): add 3D Tiles from the panel on the Cesium globe (#2505) by @giswqs in #2506
- docs(comparison): add Google Earth and Google Earth Pro by @giswqs in #2509
- feat(plugins): God's Eye View — USGS earthquakes + CelesTrak satellites as live CZML (issue #2462) by @giswqs in #2504
- feat(map): remember the last rendering engine across launches by @giswqs in #2510
- feat(plugins): IGN LiDAR HD Plugin by @semehdi in #2507
- feat(basemap): offer Cesium and Mapbox basemaps in the picker by @giswqs in #2511
- Complete God's Eye View Tier A feeds by @giswqs in #2512
- Refactor God's Eye View feed registry by @giswqs in #2515
- Add global God's Eye View feeds by @giswqs in #2516
- Add viewport-aware God's Eye View feeds by @giswqs in #2517
- God's Eye View: add live flight feeds by @giswqs in #2518
- feat(gods-eye-view): add public CCTV snapshots by @giswqs in #2519
- feat(gods-eye-view): add Ontario and DriveBC cameras by @giswqs in #2520
- feat(gods-eye-view): add Live Traffic NSW cameras by @giswqs in #2521
- feat(cctv): add Austin traffic cameras by @giswqs in #2522
- fix(project): stop counting God's Eye View feed toggles as credentials by @giswqs in #2523
- test(e2e): give the a11y sweep headroom over its own timeout by @giswqs in #2524
- feat(gods-eye-view): add live Entur transit by @giswqs in #2525
- fix(cesium): keep a refused Ion basemap from blanking the globe by @giswqs in #2526
- feat(gods-eye-view): add remaining transit providers by @giswqs in #2527
- Add Caltrans cameras to God's Eye View by @giswqs in #2528
- Restore compile-time exhaustiveness in the CCTV catalog proxy by @giswqs in #2529
- fix(lidar): stop point clouds from covering map control panels by @giswqs in #2532
- feat(raster): add opacity classes to continuous color ramps by @JPPereira93 in #2531
- perf(landxml): import TIN surfaces as one MultiPolygon and reproject by vertex by @giswqs in #2535
- feat(add-data): fill the OGC API - Features bbox from the map view by @giswqs in #2534
- feat(popup): configurable popup width and image height by @giswqs in #2537
- fix(lidar): restore auto-zoom on load and draw measure lines over point clouds by @giswqs in #2536
- fix(mapbox): inline live layer sources in story exports and fade chapters over their duration by @giswqs in #2539
- test(e2e): pin identify-restore camera suppression in the core suite (#2500) by @giswqs in #2538
- chore(deps): bump tauri-plugin-http from 2.6.0 to 2.6.1 in /apps/geolibre-desktop/src-tauri in the cargo-minor-patch group by @dependabot[bot] in #2541
- chore(deps): bump the actions-minor-patch group with 2 updates by @dependabot[bot] in #2542
- fix(mapbox): draw the extract box, offer Print Layout in the palette, gate terrain source and effects by @giswqs in #2540
- chore(deps): bump satellite.js from 6.0.2 to 7.1.0 by @dependabot[bot] in #2544
- chore(deps): bump the npm-minor-patch group across 1 directory with 23 updates by @dependabot[bot] in #2543
- fix(extent): draw the native rectangle when the SVG overlay opts out of a wide box by @giswqs in #2546
- chore(deps): bump geotiff-geokeys-to-proj4 from 2024.4.13 to 2026.8.16 by @dependabot[bot] in #2545
- fix: unbreak the nightly E2E full suite (Overture release discovery + Cesium token hint) by @giswqs in #2548
- fix(raster): require an explicit Load for sample datasets; drop the Mapbox corner patches by @giswqs in #2549
- feat(cesium): add Google Photorealistic 3D Tiles and Asset Depot samples to the Ion quick picks by @giswqs in #2551
- feat(assistant): voice command mode for the AI Assistant by @giswqs in #2550
- feat(plugins): expose moveLayerGroupToGroup and listLayerGroups on the plugin API by @giswqs in #2554
- fix(geolens): keep the partition suffix out of the vector-tile URL path by @giswqs in #2557
- feat(assistant): sub-second fast path for simple map commands via TypeSafe by @giswqs in #2556
- feat: draw WMS tiles from servers without EPSG:3857 in the desktop app by @aborruso in #2562
- feat(cad): render DXF/DWG coordinate Z values in 3D by @giswqs in #2567
- feat(assistant): semantic catalog selection for the Whitebox tool search by @giswqs in #2564
- fix: load and render 3D Tiles from tilesets like 3DBAG by @giswqs in #2568
- feat(processing): rank exact tool names first and search the Whitebox catalog by meaning by @giswqs in #2569
- feat(server-api): add scoped and expiring personal tokens by @deniial00 in #2565
- fix(3d-tiles): keep Google 3D Tiles detail when zooming in by @giswqs in #2571
- feat(data-url): open LiDAR point clouds from the ?data= deep link by @giswqs in #2570
- feat(mapbox): draw heatmap and cluster point renderers, name unported style settings by @giswqs in #2572
- feat(mapbox): group every visible layer's hits in Identify All by @giswqs in #2573
- fix(cesium): parity fixes for map preferences, tile templates, extrusion colors, and camera altitude (#2476) by @RohithPariki in #2497
- feat(mapbox): mount the map-area overlays on every renderer by @giswqs in #2575
- feat(mapbox): port label de-duplication and data-defined label overrides by @giswqs in #2574
- feat(mapbox): identify WMS, pixel and DuckDB layers; hover tips and photo popups by @giswqs in #2576
- feat(mapbox): enable the Print Layout atlas on the Mapbox renderer by @giswqs in #2578
- feat(mapbox): port marker icons, fill patterns, inverted fill, decorations and generators by @giswqs in #2579
- fix: keep the Time Slider and the map through a renderer swap by @giswqs in #2577
- fix(core): reject a non-raster type in addTileLayer by @giswqs in #2590
- fix(assistant): list a layer's fields when apply_symbology misses one by @giswqs in #2591
- fix(duckdb): decode DECIMAL cells into numbers by @giswqs in #2592
- fix(assistant): block whole-map mutations in run_maplibre_js by @giswqs in #2593
- fix(assistant): flag run_sql layers built from literal geometry by @giswqs in #2594
- feat(gods-eye-view): add keyless NASA FIRMS active fires by @giswqs in #2596
- feat(assistant): load plugin tools on demand past 12 of them by @giswqs in #2595
- fix(storymap): keep COG layers, markers, and popups in the HTML export by @giswqs in #2598
- feat(layers): sort a group's contents A to Z or Z to A by @giswqs in #2601
- chore(deps): bump cog-tiler-wasm to 0.3.8 by @giswqs in #2604
- feat(python): arm Identify, toggle controls, and set projection from Python by @giswqs in #2603
- chore(deps): bump cog-tiler-wasm to 0.4.0, whitebox-wasm to 0.6.0, maplibre-gl-raster to 0.14.15 by @giswqs in #2605
- chore(deps): bump maplibre-gl-raster to 0.14.15 by @giswqs in #2608
- feat(plugins): add a Satellite Embeddings plugin by @giswqs in #2602
- feat(server-api): add OAuth Authorization Code with S256 PKCE (stack 2/4) by @deniial00 in #2580
- feat(i18n): add Hebrew (he) locale by @reuvenc2121 in #2609
- feat(plugins): add a Fields of the World plugin by @giswqs in #2612
- Improve hover tooltip wrapping and width by @amit-spatial in #2611
- fix(3d-tiles): place 3D BAG on its footprint, keep it visible at pitch 0, add it as a sample by @giswqs in #2613
- fix(vector): guard voronoi envelope against antimeridian crossings and clamp to WGS84 bounds by @Wukeeeeee in #2614
- fix(arcgis): fix the likely bugs from the ArcGIS parity tracker (#2477) by @giswqs in #2615
- feat(arcgis): raster effects, blend modes and plugin gating (#2477) by @giswqs in #2616
- feat(arcgis): selection, facade events, story fades and more parity (#2477) by @giswqs in #2617
- feat(arcgis): identify popups, text markers and styled service layers (#2477) by @giswqs in #2618
- feat: GPS, comments, georeferencing and sample markers on every renderer (#2477) by @giswqs in #2619
- fix(desktop): allow plain-HTTP connections to local-network hosts by @giswqs in #2623
- feat(arcgis): icons, patterns and labels on vector tiles by @giswqs in #2625
- feat(arcgis): inverted fills, geometry generators, line decorations and label overrides by @giswqs in #2622
- feat(arcgis): scene zoom and bounds limits and a nautical scale bar by @giswqs in #2624
- feat(arcgis): Print Layout atlas on the ArcGIS renderer by @giswqs in #2626
- feat(arcgis): hover map tips and geotagged-photo popups by @giswqs in #2627
- perf(arcgis): index the synchronous feature pick used by hover tips by @giswqs in #2630
- feat(gods-eye-view): API key entry, TomTom live flow and AIS vessels by @giswqs in #2631
- feat(i18n): fill 224 missing keys across every locale by @giswqs in #2632
- fix(vector): guard simplify tolerance and empty-bounds in bounding_box, centroids, and buffer by @Wukeeeeee in #2628
- feat(web): OAuth sign-in for project Share and Gallery (stack 3/4) by @deniial00 in #2607
- feat(share): add access roles (view, comment, edit), link expiry, password protection, and share revocation (#1527) by @AyushDubey23 in #1534
- Add organization and group sharing with shared-update support by @HarshShinde0 in #1990
- perf(build): keep Cesium and MapLibre plugins off the boot path by @giswqs in #2634
- chore(tooling): fast type check, web CI gate and contributor files by @giswqs in #2637
- chore(lint): type-aware lint rules with a warning ratchet by @giswqs in #2640
- perf(ui): narrow layer subscriptions so layer edits stop re-rendering the app by @giswqs in #2639
- perf(build): stop plugin chunks from dragging shared libraries into boot by @giswqs in #2635
- refactor(desktop): split tauri-io into focused modules by @giswqs in #2641
- perf(project): reuse per-layer text when autosaving by @giswqs in #2636
- refactor(plugins): split maplibre-components into per-control modules by @giswqs in #2642
- refactor(shell): move DesktopShell effects into named hooks by @giswqs in #2648
- refactor(map): classify layer types once for all four renderers by @giswqs in #2638
- refactor(print): move PrintLayoutDialog to a reducer and per-element editors by @giswqs in #2649
- test(desktop): add a component test harness and panel tests by @giswqs in #2644
- refactor(style): split StylePanel into renderer sections by @giswqs in #2645
- refactor(layers): split LayerPanel into rows, actions and dialogs by @giswqs in #2647
- refactor(core): split the app store into slices by @giswqs in #2651
- chore(lint): add two eslint-plugin-jsx-a11y rules to the ratchet by @giswqs in #2652
- perf(build): lazy-load the remaining plugin libraries at startup by @giswqs in #2646
- refactor(map): break up the large layer-sync functions by @giswqs in #2650
- feat(assistant): add OpenRouter provider by @deniial00 in #2655
- fix(wcs): let WCS layers request EPSG:3857 and stop pre-rejecting CRSes by @giswqs in #2658
- feat(desktop): OAuth sign-in and session management (stack 4/4) by @deniial00 in #2653
- fix(zarr): keep Zarr request headers out of saved projects and reject failed NetCDF adds by @giswqs in #2660
- fix(file-io): settle cancelled file pickers, handle POSIX backslashes and Android photo picks by @giswqs in #2661
- fix(panels): open the Expression Builder for 3D tilesets and keep layer metadata live by @giswqs in #2662
- fix(map): stop KML circle churn on sync and report Cesium imagery failures by @giswqs in #2663
- fix(plugins): restore saved splats, apply STAC COG nodata, drop the dead COG add path by @giswqs in #2664
- fix(desktop): claim the OAuth callback scheme on Linux by @giswqs in #2669
- feat(stac): open a STAC catalog or API collection from a ?stac= link by @giswqs in #2668
- feat(assistant): discover models live for Google, Anthropic, OpenAI and Bedrock by @giswqs in #2659
- fix(planetary): load collections and search despite missing STAC CORS by @giswqs in #2674
- fix(desktop): open .geolibre files from a Linux file manager by @giswqs in #2672
- chore(deps): bump geolibre-wasm to 1.5.4 for the tool summary fixes by @giswqs in #2675
- feat(cesium): render Zarr layers on the 3D globe with zarr-cesium by @giswqs in #2673
- fix(raster): scale terrain gradients to metres for geographic-CRS DEMs by @Wukeeeeee in #2670
- perf(web): minify worker bundles and defer lazy dialogs until opened by @giswqs in #2676
- fix(desktop): drain Martin's output so large schemas can start by @giswqs in #2678
- feat(i18n): fill 127 missing sharing, OAuth and session keys across every locale by @giswqs in #2679
- chore(release): v3.1.0 by @giswqs in #2680
New Contributors
- @Phichak-Kamin made their first contribution in #2386
- @deniial00 made their first contribution in #2463
- @JPPereira93 made their first contribution in #2456
- @semehdi made their first contribution in #2507
- @reuvenc2121 made their first contribution in #2609
- @amit-spatial made their first contribution in #2611
- @Wukeeeeee made their first contribution in #2614
- @AyushDubey23 made their first contribution in #1534
Full Changelog: v3.0.0...v3.1.0