Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,40 @@ concurrency:
cancel-in-progress: false

jobs:
chrome-extension:
name: Build Chrome extension
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: "22"
package-manager-cache: false

- name: Install dependencies
run: npm ci

- name: Build Chrome extension
run: npm run build:chrome-extension

- name: Upload Chrome extension workflow artifact
uses: actions/upload-artifact@v7
with:
name: geolibre-chrome-extension
path: dist/geolibre-chrome-*.zip
if-no-files-found: error

- name: Attach Chrome extension to GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ github.event.release.tag_name }}
run: gh release upload "$TAG" dist/geolibre-chrome-*.zip

build:
name: Build ${{ matrix.name }}
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -51,8 +85,7 @@ jobs:
uses: actions/setup-node@v7
with:
node-version: lts/*
cache: npm
cache-dependency-path: package-lock.json
package-manager-cache: false

- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
Expand Down
2 changes: 2 additions & 0 deletions docs/user-guide/adding-data.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

The **Add Data** menu is the main way to bring layers into GeoLibre. It groups sources into Files, Web services, Cloud formats, 3D layers, and Databases. You can also drag files straight onto the map.

To collect supported dataset links from a catalog or other webpage and open several at once, use the [GeoLibre Chrome extension](chrome-extension.md).

![Add Data menu](https://data.geolibre.app/images/geolibre-add-data-menu.webp)

## Files
Expand Down
34 changes: 34 additions & 0 deletions docs/user-guide/chrome-extension.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Chrome Extension

The **Open data in GeoLibre** Chrome extension finds supported geospatial data links on the current webpage and opens the datasets you select together on one GeoLibre map.

![Select webpage datasets with the GeoLibre Chrome extension](https://assets.geolibre.app/images/geolibre-chrome.webp)

## Install the extension

Until the extension is available from the Chrome Web Store, install the packaged release manually:

1. Open the [latest GeoLibre release](https://github.com/opengeos/GeoLibre/releases/latest) and download the ZIP asset whose name starts with `geolibre-chrome-`.
2. Extract the ZIP archive to a folder you intend to keep. Chrome loads the extension from this folder, so do not delete it after installation.
3. Open `chrome://extensions` in Chrome.
4. Turn on **Developer mode**.
5. Select **Load unpacked** and choose the extracted `geolibre-chrome-<version>` folder.
6. Pin **Open data in GeoLibre** to the Chrome toolbar for convenient access.

To update a manually installed copy, download and extract the newer release asset, then select the extension's **Reload** button on `chrome://extensions`. If you extract it to a different folder, remove the old copy and load the new folder instead.

## Open datasets from a webpage

1. Visit a webpage or data catalog containing geospatial file links.
2. Select the GeoLibre icon in the Chrome toolbar.
3. Use **All**, **Vector**, or **Raster** to filter the discovered datasets.
4. Check one or more datasets. Nothing is selected by default.
5. Select **Open in GeoLibre** to load the selected datasets on the same map.

The extension recognizes GeoJSON and spatial JSON, GeoParquet and Parquet, PMTiles, GeoTIFF and Cloud-Optimized GeoTIFF, ZIP archives containing GeoJSON, JSON-LD download metadata, and existing GeoLibre data links. On Source Cooperative repository pages, it also reads the embedded inventory so datasets outside the currently visible list can be selected.

## Access and privacy

GeoLibre fetches selected links directly, so the source server must allow cross-origin requests (CORS). Complete HTTP(S) URLs, including signed query parameters, are forwarded to GeoLibre. Cookies and other browser-session credentials are not forwarded, so cookie-bound or session-authenticated links might fail. Temporary `blob:` URLs cannot be transferred.

The extension requests access only to the active tab when you open it. It does not store browsing history, send analytics, or run continuously in the background.
38 changes: 38 additions & 0 deletions extensions/geolibre-chrome/PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Privacy policy — Open data in GeoLibre

Last updated: August 15, 2026

Open data in GeoLibre does not independently collect, retain, or sell personal
information, browsing history, page contents, or usage analytics. It does
forward the complete dataset and style URLs that the user explicitly selects,
as described below.

The extension uses Chrome's `activeTab` permission to inspect links and
structured metadata on the current page only after the user clicks the
extension's toolbar icon. Inspection happens locally in the browser. Results
are held in memory only while the popup is open.

When the user chooses **Open in GeoLibre**, the complete selected HTTP(S)
dataset and style URLs are placed in the query string of a new
`https://web.geolibre.app/` tab. These URLs are forwarded verbatim and may
contain signed query parameters, access tokens, user identifiers, or other
personal data. Do not select a URL containing information you do not want to
send to GeoLibre.

The navigation request exposes its URL and the user's IP address to GeoLibre's
web-hosting infrastructure, where standard service logs may retain them. The
navigation may also appear in browser history. See the current
[GeoLibre privacy policy](https://geolibre.app/privacy/) for the service's data
practices. The extension itself does not retain the URLs after its popup closes.

The extension does not fetch or upload the datasets. GeoLibre requests them
directly from their original servers, subject to those servers' privacy
policies and CORS configuration. Cookies and other browser-session credentials
from the source page are not forwarded, although credentials embedded directly
in a selected URL are part of the URL and are forwarded.

The extension uses no remote code, advertising, analytics, tracking pixels,
cookies, accounts, or extension storage.

Questions may be submitted through the GeoLibre repository:
<https://github.com/opengeos/GeoLibre/issues>.
48 changes: 48 additions & 0 deletions extensions/geolibre-chrome/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Open data in GeoLibre

A Manifest V3 Chrome extension that finds supported geospatial dataset links on
the current page and opens selected files together in GeoLibre using repeated
`data` query parameters.

## Install locally

1. Open `chrome://extensions`.
2. Enable **Developer mode**.
3. Choose **Load unpacked**.
4. Select this `extensions/geolibre-chrome` directory.

The extension requests `activeTab` and `scripting` only. It scans a page after
you click its toolbar icon and does not retain page contents or browsing data.

## Package for the Chrome Web Store

From the repository root, run:

```bash
npm run build:chrome-extension
```

The versioned upload ZIP is written to `dist/`. Store listing copy and
permission explanations are in `STORE_LISTING.md`; the publishable privacy
policy source is in `PRIVACY.md`. The policy must be hosted at a public URL
before submitting the listing.

## Discovery

The scanner recognizes GeoJSON/JSON, GeoParquet/Parquet, PMTiles, GeoTIFF/COG,
and ZIP links in anchors, linked resources, selected data attributes, and
schema.org JSON-LD `contentUrl`/`downloadUrl` fields. Existing GeoLibre deep
links are unpacked, and a neighboring `name.style.json` or
`name.geolibre.style.json` link is paired with the matching dataset.

Source Cooperative repository pages receive additional handling: the extension
reads the complete embedded file inventory even when the visible table is
virtualized, canonicalizes links to `data.source.coop`, and removes duplicate
page/download links. The popup can filter discovered files by vector or raster
type without changing the current selection.

Remote servers must allow GeoLibre to fetch the selected URLs through CORS.
Complete HTTP(S) URLs, including signed query parameters, are forwarded to
GeoLibre. Cookies and other browser-session credentials are not forwarded, so
cookie-bound or session-authenticated links may fail. Temporary `blob:` and
browser-internal links cannot be transferred.
50 changes: 50 additions & 0 deletions extensions/geolibre-chrome/STORE_LISTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Chrome Web Store listing

## Name

Open data in GeoLibre

## Summary

Find geospatial datasets on a webpage and open selected files together in GeoLibre.

## Detailed description

Open data in GeoLibre turns dataset catalogs, documentation pages, and project
websites into launch points for an interactive map.

Click the extension icon to find supported data links on the current page,
filter them by vector or raster type, choose the files you need, and open them
together in GeoLibre. Supported links include GeoJSON, GeoParquet, PMTiles,
Cloud-Optimized GeoTIFF, and ZIP archives containing GeoJSON.

The extension also reads schema.org download metadata, understands existing
GeoLibre links, pairs matching GeoLibre style files, and discovers the complete
file inventory on virtualized Source Cooperative repository pages.

Privacy is deliberately narrow: the extension scans only the active page after
you click it. It stores no browsing data, runs no analytics, and requests no
permanent access to websites.

Dataset servers must allow browser access through CORS. Complete HTTP(S) URLs,
including signed query parameters, are forwarded to GeoLibre. Cookies and other
browser-session credentials are not forwarded, so cookie-bound or
session-authenticated links may fail. Temporary `blob:` links cannot be
transferred.

## Category

Developer Tools

## Language

English

## Permission justification

- `activeTab`: grants temporary access to the page only after the user invokes
the extension, so its dataset links can be inspected.
- `scripting`: injects the local, packaged dataset scanner into that active tab.

The extension does not request host permissions, storage, browsing history,
downloads, cookies, or remote code.
Binary file added extensions/geolibre-chrome/icons/geolibre-128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added extensions/geolibre-chrome/icons/geolibre-16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added extensions/geolibre-chrome/icons/geolibre-32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added extensions/geolibre-chrome/icons/geolibre-48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
26 changes: 26 additions & 0 deletions extensions/geolibre-chrome/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"manifest_version": 3,
"name": "Open data in GeoLibre",
"description": "Find geospatial datasets on the current page and open the selected files together in GeoLibre.",
"version": "0.1.0",
"homepage_url": "https://geolibre.app/",
"minimum_chrome_version": "105",
"permissions": ["activeTab", "scripting"],
"action": {
"default_title": "Open data in GeoLibre",
"default_popup": "popup.html",
"default_icon": {
"16": "icons/geolibre-16.png",
"32": "icons/geolibre-32.png"
}
},
"icons": {
"16": "icons/geolibre-16.png",
"32": "icons/geolibre-32.png",
"48": "icons/geolibre-48.png",
"128": "icons/geolibre-128.png"
},
"content_security_policy": {
"extension_pages": "script-src 'self'; object-src 'self'"
}
}
Loading
Loading