GeoLibre is a free and open-source, lightweight, cloud-native GIS platform for visualizing, exploring, and analyzing geospatial data. It runs in the web browser, on the desktop, on mobile, and inside Jupyter notebooks, while keeping your data local and private.
v2.5.0 is about meeting you where your work already lives: open your QGIS and ArcGIS Pro projects directly, talk to your team on the map itself, explore hyperspectral imagery as a 3D cube, work in discrete global grids, and run sharing and live collaboration on your own server.
By the numbers
| Pull requests merged | 121 |
| Issues closed | 52 |
| Contributors | 14 (12 of them first-time contributors) |
Released 8 days after v2.4.0. Thank you to everyone who filed an issue, reviewed a PR, or sent a fix.
Live collaboration and commenting
This release turns collaboration from a live-session-only experiment into something a team can actually run and keep.
Anchored comments on a project (#1518, #1607). Pin a comment to any map location or to a specific feature, reply in a thread, resolve and reopen it, and delete it when it is done. Comments render as pins on the map with a dockable Comments panel beside them, so you can filter, jump to, and work through feedback without leaving the map. They are saved with the project, so a review conversation survives closing the app, and they travel with the .geolibre.json file to whoever you send it to. The panel is opt-in from Settings (#1638), so a solo project stays uncluttered.
Comments sync live. In a collaboration session, adding, replying, resolving, and deleting all fan out to every participant in real time, and respect the host's per-participant edit permissions. Comment mutations are validated and rate-limited on the relay (#1629), and comments, dashboard widgets, and legend entries are scrubbed when the layer they point at is removed (#1627), so a session cannot be poisoned by stale or oversized state.
Self-hostable sharing and collaboration (#1685, #1686, #1687, #1690). Sharing and live sessions no longer require Cloudflare or our hosted service. This release adds a documented projects and identity API with a FastAPI reference implementation, plus a plain Node collaboration relay, both Docker-deployable. A published web container can be pointed at your own endpoints at runtime, with no rebuild, which makes GeoLibre viable for classrooms, workshops, and organizations that cannot send project data off-premises. See Collaboration and the server API reference.
Credentials never leave with the project (#1680, #1702, #1704). Project credentials and per-layer connection records are redacted on every egress path (share, export, publish), so shared and self-hosted projects cannot leak a token that was only ever meant to sit on your machine.
Other highlights
- QGIS and ArcGIS Pro project import (#1562, #1637). Open a
.qgs,.qgz,.aprx, or.mapxand get the layers, nested groups, visibility, order, styling, and saved map view rebuilt in GeoLibre, with a per-layer report of anything that had to be skipped. - Discrete global grids (#1650, #1710). Three new DGGS plugins (A5, DGGRID, DGGAL) render and identify cells over the current view, joined by DGGS Generator, Binning, and Compact processing tools.
- Hyperspectral data you can read (#1708, #1713, #1719, #1723). Local NetCDF and HDF grids are colormapped in the browser and fitted to the camera, an RGB band combination is picked by wavelength, and a 3D image cube view renders the scene as a volume with draggable slice cuts.
- Spectral profiles from a click. Identify a pixel to chart its spectrum against wavelength, compare up to six sampled points marked on the map in their chart colors, and export as PNG or CSV.
- Smart styling on add (#1519, #1530, #1536). Every new layer arrives with its own color and geometry-appropriate sizing, a Style suggestions strip offers one-click renderers derived from the layer's own attributes, and vector-tile layers can now be classified by their tile attributes.
- Quick analysis (#1523). Buffer, centroids, convex hull, bounding box, and isochrones straight from the map right-click and layer menus, with defaults filled in and every run saved to Processing History.
- Autosave, crash recovery, and project history (#1522), plus project duplication and templates (#1528), an Elements panel for managing every annotation from one list (#1524), and a Layer Library that saves a configured layer for re-adding to any later project (#1520).
- Geocode a CSV at import time (#1526). Pick the address columns and each row is geocoded through your provider, with unmatched rows kept as null-geometry features so you can see and fix them.
- KML/KMZ throughout. KML and KMZ export (#1566), Super-Overlay import (#1598), preserved custom icons and formatted descriptions, and TIFF-backed ground overlays.
- Nested layer groups (#1589), multi-layer selection and group moves (#1610), and field-level visibility that hides attributes and excludes them on share and export (#1676).
- Typed embed SDK (#1525):
@geolibre/embed, a richer embed protocol, and a viewer embed preset. - Mobile and platforms. GeoLibre Desktop is now on the Mac App Store, Android GPS streams at the GNSS rate with precise accuracy and satellite count (#1554), and an NMEA receiver can be used as a position source.
- Internationalization. Thai joins the shipped locales, bringing all 16 non-English catalogs to 100% coverage.
What's Changed
- feat(style): classify vector-tile layers by tile attributes by @giswqs in #1536
- fix(ci): restore Claude PR review under subprocess env scrubbing by @giswqs in #1539
- docs: add the Google Play listing and refresh project status by @giswqs in #1545
- feat(processing): quick analysis from the map and layer menus by @giswqs in #1529
- feat(style): smart styling on add and a Style suggestions strip by @giswqs in #1530
- fix(ios): make the signed CI path work and document the real build recipe by @giswqs in #1546
- fix(mobile): correct the app name on iOS and collapse Style by default by @giswqs in #1551
- fix(ios): stamp a valid unique build number and declare export compliance by @giswqs in #1550
- fix(add-data): style the dialog's vector sources with initialLayerStyle by @giswqs in #1549
- fix(style): auto-fill proportional size range and show it in print legend by @dinesh-at-is in #1548
- feat(plugins): expose queryZarrLayer for click-to-value on native Zarr layers by @giswqs in #1557
- fix(ios): ship the real app icon instead of the Tauri placeholder by @giswqs in #1558
- fix(map): show a KMZ that spans the world instead of an empty globe by @giswqs in #1553
- feat(processing): pick a CRS from a searchable list on EPSG parameters by @giswqs in #1556
- feat: add project duplication, save as template, and open copy in gallery by @HarshShinde0 in #1532
- feat(print): support touch drag for print extent drawing by @Varshavia in #1533
- Display precise GPS accuracy and satellite count by @giswqs in #1559
- feat(processing): pick the Download OSM Vector area from the map by @giswqs in #1561
- fix(processing): correct the Download OSM Vector form (geolibre-wasm 1.4.2) by @giswqs in #1565
- feat: add KML and KMZ layer export by @giswqs in #1568
- fix(i18n): distinguish Chinese progress strings from action labels and unify "sidecar" by @ztcools in #1570
- fix(backend): gate PostGIS connections behind a host allowlist by @giswqs in #1571
- fix(desktop): install PostGIS sidecar runtime by @giswqs in #1579
- feat: add Elements panel & promote annotations to map elements #1524 by @HarshShinde0 in #1567
- Preserve KMZ custom icons and formatted descriptions by @giswqs in #1580
- feat(processing): enter distances in meters on WGS84 layers by @giswqs in #1560
- feat(browser): save a configured layer and re-add it from My Data by @giswqs in #1564
- feat: import QGIS project files by @giswqs in #1563
- feat(desktop): add a sandboxed Mac App Store build variant by @giswqs in #1581
- Keep KML icons independent from background controls by @giswqs in #1588
- fix(layers): hide control vectors with groups by @giswqs in #1590
- fix(layers): truncate long layer names by @giswqs in #1591
- Add nested layer groups by @giswqs in #1593
- fix(desktop): disable WebKit DMABUF for Nvidia by @giswqs in #1595
- fix: load vector URLs through native HTTP by @giswqs in #1596
- Convert Whitebox raster outputs to COGs by @giswqs in #1594
- fix(import): preserve QGIS source paths and group visibility by @ShiroKSH in #1584
- fix(workers): stop edge proxies from following off-origin redirects by @Ayush7614 in #1576
- test(import): fix stale QGIS nested group name expectation by @giswqs in #1597
- fix: keep project load, collab sync, and layer cleanup consistent by @Ayush7614 in #1575
- fix(sidecar): harden band-math eval, job caps, and result bounds by @Ayush7614 in #1574
- feat(dashboard): add selector widget type (issue #1381) by @bgoniasa in #1504
- feat: support KML Super-Overlay imports by @giswqs in #1599
- feat(python): add leafmap-parity data and layer helpers by @giswqs in #1600
- fix(desktop): route built-in GeoLens through native HTTP by @giswqs in #1601
- Add autosave, crash recovery, and project history by @giswqs in #1602
- feat: add ArcGIS Hub data plugin by @giswqs in #1603
- fix(settings): contain mobile dialog content by @giswqs in #1613
- feat(layers): move selected layers as a group by @giswqs in #1612
- Allow all values in categorized styles by @giswqs in #1609
- feat(add-data): geocode delimited-text addresses at import time by @shima78 in #1604
- Support inline GeoJSON styles in notebook bridge by @giswqs in #1619
- add map comments with collab sync by @HarshShinde0 in #1607
- Follow-up: notebook style review fixes by @giswqs in #1620
- feat: persist layer connections and add open data catalogs by @giswqs in #1614
- docs: quote pip extras install examples by @nyxst4ck in #1473
- fix(gps): stream Android fixes at GNSS rate and keep follow mode reachable by @giswqs in #1623
- feat: add NMEA receiver position source to GPS Tracking by @giswqs in #1624
- fix: render KMZ ground overlays whose image is a TIFF by @giswqs in #1622
- fix(gps): close NMEA connection lifecycle races by @giswqs in #1626
- fix: add notebook layer read-back by @giswqs in #1621
- Add typed embed SDK and viewer preset by @giswqs in #1615
- i18n: fill 218 missing keys across all 15 non-English catalogs by @giswqs in #1635
- docs: fix stale content, cover shipped features, drop hardcoded versions by @giswqs in #1634
- fix(sidecar): bound Sedona SQL with a statement timeout by @Ayush7614 in #1630
- fix: clear select/load dialog layer ids when layers are removed by @Ayush7614 in #1628
- fix: scrub widgets, comments, and legend when layers disappear by @Ayush7614 in #1627
- docs: drop the deprecated CodeSandbox badge by @giswqs in #1636
- fix: make the Comments panel opt-in from Settings by @giswqs in #1638
- fix(ci): stop superseded Pages builds failing the PR preview deploy by @giswqs in #1640
- feat: import ArcGIS Pro projects from CIM JSON by @giswqs in #1637
- fix: resolve relative style/tileset URLs for OGC vector tiles by @giswqs in #1641
- fix: surface notebook runtime dir failures and reclaim port 8766 on Windows by @giswqs in #1644
- fix: keep the Vite dev watcher out of src-tauri by @giswqs in #1646
- fix: drop benign ResizeObserver loop errors from diagnostics by @giswqs in #1647
- fix(workers): harden Vite proxy and github-raw redirect fetches by @Ayush7614 in #1633
- docs: highlight the 1,000+ browser-based geoprocessing tools by @giswqs in #1648
- fix(sidecar): stop leaking raw vector and SQL errors to clients by @Ayush7614 in #1632
- fix(mas,ios): drop the network.server entitlement with Earth Engine sign-in by @giswqs in #1651
- Fix laggy globe dragging with atmospheric effects by @santiago-ramos-02 in #1653
- fix(backend): validate aspatial geopackage layer writes & add test co… by @RohithPariki in #1654
- docs: add the Mac App Store listing and its limitations by @giswqs in #1656
- fix(mas): build JupyterLite so the Notebook panel is not a second map by @giswqs in #1658
- fix(attributes): make web URLs clickable by @giswqs in #1659
- fix(collab): validate and rate-limit comment mutations by @Ayush7614 in #1629
- docs: add Europa, Callisto, and Charon basemap screenshots by @giswqs in #1661
- fix(sidecar): cap concurrent ML segmentation proxy requests by @Ayush7614 in #1631
- chore(deps): clear the four transitive advisories failing the audit gate by @giswqs in #1688
- feat: add DGGS plugin by @thangqd in #1650
- fix: resolve SedonaDB thread pool leak on sql timeout by @RohithPariki in #1663
- fix(shell): recover a drop overlay that outlived its drag by @giswqs in #1683
- feat(share): point the app at a self-hosted share/collab server at runtime by @giswqs in #1687
- feat(server): add a self-hostable projects API and collaboration relay by @giswqs in #1690
- chore(deps-dev): bump undici from 7.29.0 to 8.9.0 by @dependabot[bot] in #1696
- chore(deps): bump the actions-minor-patch group with 2 updates by @dependabot[bot] in #1693
- chore(deps): bump the npm-minor-patch group across 1 directory with 15 updates by @dependabot[bot] in #1697
- feat(i18n): add Thai (th) translation catalog by @Navavit in #1698
- Show every category in the print layout legend by @giswqs in #1699
- fix: keep KMZ icons above lower layers by @giswqs in #1701
- fix: replace jupyter relay dispatch with broadcast to fix broken active notebooks by @RohithPariki in #1691
- fix: redact project credentials on egress by @giswqs in #1702
- fix: redact credentials from a layer's connection record by @giswqs in #1704
- feat(export): Exclude hidden fields from vector data by @RohithPariki in #1705
- feat(processing): add DGGS processing by @thangqd in #1710
- feat(netcdf): fit, colormap, and band combination for local grids by @giswqs in #1708
- fix(ci): opt in to fork PR checkout so Claude review stops failing by @giswqs in #1715
- chore(rearrange dggs processing) by @thangqd in #1714
- feat(netcdf): mark sampled pixels and float the spectral profile by @giswqs in #1713
- fix(layers): hide control-rendered rasters with their group by @giswqs in #1720
- feat(netcdf): add a 3D image cube view for hyperspectral grids by @giswqs in #1719
- fix(vector): stream large local vector files through DuckDB by @giswqs in #1716
- feat: CartoCiudad (IGN España) geocoding provider by @bgoniasa in #1712
- fix(legend): draw proportional size ramps with the layer's marker by @giswqs in #1722
- fix(netcdf): let an RGB composite be sampled like a single band by @giswqs in #1723
- refactor(netcdf): share the band label's coordinate rounding by @giswqs in #1724
- i18n: fill the 16 locale catalogs to 100% coverage by @giswqs in #1725
- fix(dev): answer the proxy guard's DNS lookup in the shape the connector asked for by @giswqs in #1726
- fix(stac): let a vector layer draw above STAC Search imagery by @giswqs in #1727
- fix(deps): patch the two high-severity audit findings without downgrading wrangler by @giswqs in #1729
- chore(release): v2.5.0 by @giswqs in #1728
- docs: add a platform comparison page by @giswqs in #1730
New Contributors
- @dinesh-at-is made their first contribution in #1548
- @HarshShinde0 made their first contribution in #1532
- @Varshavia made their first contribution in #1533
- @ztcools made their first contribution in #1570
- @ShiroKSH made their first contribution in #1584
- @Ayush7614 made their first contribution in #1576
- @shima78 made their first contribution in #1604
- @nyxst4ck made their first contribution in #1473
- @santiago-ramos-02 made their first contribution in #1653
- @RohithPariki made their first contribution in #1654
- @thangqd made their first contribution in #1650
- @Navavit made their first contribution in #1698
Full Changelog: v2.4.0...v2.5.0