Skip to content
Agentmart
Submit a tool

reading-portolan

Use when exploring, querying, analyzing, or visualizing data from a Portolan catalog (STAC-based cloud-native geospatial data).

Skill by portolan-sdi

IndexedApache-2.0★ 11
Write a review

Chalk Labs

Need help deploying reading-portolan?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/portolan-sdi-reading-portolan

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Use when exploring, querying, analyzing, or visualizing data from a Portolan catalog (STAC-based cloud-native geospatial data). Covers AGENTS.md and STAC metadata, assets by role, DuckDB queries over GeoParquet and Parquet, COGs, cross-dataset joins, partitioned collections, and interactive maps with PMTiles and MapLibre.

Use cases: data

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Node.js package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/reading-portolan

What's inside

Skill name
reading-portolan
Description
Use when exploring, querying, analyzing, or visualizing data from a Portolan catalog (STAC-based cloud-native geospatial data). Covers AGENTS.md and STAC metadata, assets by role, DuckDB queries over GeoParquet and Parquet, COGs, cross-dataset joins, partitioned collections, and interactive maps with PMTiles and MapLibre.
License
Apache-2.0
Instructions
356 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts
  • Instructions call the network

Files (5)

  • SKILL.md
  • map-inline.html · reference/
  • map-multi.js · reference/
  • map-style.html · reference/
  • style-default.json · reference/

SKILL.md (first lines)

<!-- drift: depends-on: portolan-spec -->

# Reading Portolan Data

A Portolan catalog is a STAC catalog served as static files from object storage. Vector data is GeoParquet paired with PMTiles. Raster data is Cloud Optimized GeoTIFF (COG). Tabular data is plain Parquet with no geometry column. There is no API server. You read the JSON, then query the files in place with DuckDB or rasterio.

The [Portolan specification](https://github.com/portolan-sdi/portolan-spec) is ground truth. Read `specs/portolan/core.md` and `specs/portolan/formats.md` at tag v0.2.0 when this skill and a catalog disagree. Rule ids such as `PORTO-CORE-061` point into `specs/portolan/requirements.yaml`.

## Step 1: Detect the environment

Check what is installed before you suggest a tool.

```bash
duckdb --version
python -c "import duckdb; print(duckdb.__version__)"
python -c "import geopandas; print(geopandas.__version__)"
python -c "import rasterio; print(rasterio.__version__)"
python -c "import rioxarray; print('rioxarray ok')"
gpio --version
ogr2ogr --version
```

| Installed | Vectors and tables | Rasters |
|---|---|---|
| DuckDB | `read_parquet` with the `spatial` and `httpfs` extensions. Best choice. | Not applicable |
| GeoPandas only | `gpd.read_parquet()` | Not applicable |
| rioxarray | Not applicable | `rioxarray.open_rasterio()`. Best choice. |
| rasterio only | Not applicable | `rasterio.open()` |
| Nothing | Suggest DuckDB | Suggest rioxarray |

If nothing is installed, explain the options and offer to guide an install. Respect a no. Every tool above reads remote files by HTTP range request, so nobody needs to download a whole file first.

Install a current DuckDB with the `spatial` extension.

## Step 2: Read the metadata

### Catalog Layout

```
catalog-root/
├── catalog.json                 # Root STAC Catalog
├── AGENTS.md                    # Agent guide, linked as rel: agents
├── README.md                    # Human guide, linked as rel: describedby
└── {collection_id}/
    ├── collection.json          # Extent, providers, license, assets, links
    ├── AGENTS.md
    ├── README.md
    ├── {data}.parquet           # data asset
    ├── {data}.pmtiles           # rel: pmtiles link
    ├── thumbnail.png            # thumbnail asset
    ├── styles/default.json      # style asset with the default role
    └── {item_id}/{item_id}.json # one directory per item, when items exist
```

Each catalog and each collection includes an `AGENTS.md` and a `README.md` (PORTO-CORE-061, PORTO-CORE-062). A `versions.json` beside them is a CLI artifact, not part of the specification. Ignore it when you read data. There is no `llms.txt` in the specification.

### Crawl the catalog

Start at `catalog.json`. Follow every link with `rel: child`. A child with `"type": "Catalog"` is a sub-catalog, so recurse into it. A child with `"type": "Collection"` is a dataset. Build the full inventory before you answer a question.

```bash
BASE=https://example.com/catalog
curl -s $BASE/catalog.json | jq -r '.links[] | select(.rel=="child") | .href'
```

### Read AGENTS.md first

Every collection links its `AGENTS.md` with `rel: agents` and its `README.md` with `rel: describedby`. Read `AGENTS.md` before you write a query. It lists the join keys, the coordinate system, the useful aggregations, and the data quality traps. The README documents the schema and the provenance.

```bash
COLL=$BASE/collection-id
curl -s $COLL/collection.json \
  | jq -r '.links[] | select(.rel=="agents" or .rel=="describedby") | .href'
curl -s $COLL/AGENTS.md
```

### Read collection.json

```bash
curl -s $COLL/collection.json | jq '{
  id, title, license, updated,
  spec: [.stac_extensions[] | select(test("portolan-sdi.org/portolan"))],
  bbox: .extent.spatial.bbox,
  time: .extent.temporal.interval,
  providers: [.providers[] | {name, roles}],
  via: [.links[] | select(.rel=="via" or .rel=="canonical") | .href],
  pmtiles: [.links[] | select(.rel=="pmtiles") | {href, layers: .["pmtiles:layers"]}],
  assets: (.assets | to_entries | map({key, href: .value.href, type: .value.type, roles: .value.roles})),
  glob: .["partition:glob"],
  columns: [.["table:columns"][]? | {name, type}]
}'
```

Each field reports the following:

- `stac_extensions` carries `https://schemas.portolan-sdi.org/portolan/v0.2.0/schema.json`. That URI is the only signal of the specification version (PORTO-CORE-006).
- `license` is an SPDX identifier, or `other` with a `rel: license` link (PORTO-CORE-058, PORTO-CORE-059). Report it before you redistribute anything.
- `providers` lists at least one `producer` and exactly one `host`, last (PORTO-CORE-047). When the producer and the host are the same organization, the catalog is official. When they differ, the catalog is a mirror.
- A mirror has a `via` link (`text/html`) to the original source (PORTO-CORE-053). It has a `canonical` link when the source publishes its own STAC (PORTO-CORE-054). It sets top-level `updated` to the last sync time (PORTO-CORE-057). Compare `updated` with the source when freshness matters.
- `table:columns` documents the columns with names, types, and descriptions. Read it before `DESCRIBE`.
- `partition:glob` is present only on a partitioned collection. See Step 4.

### Find assets by role

An asset key means nothing. Filter on `roles` (PORTO-CORE-027). Each asset has a `type` and at least one role (PORTO-CORE-025).

| Role | What it is | Media type |
|---|---|---|
| `data` | The primary GeoParquet, Parquet, or COG | `application/vnd.apache.parquet` or `image/tiff; application=geotiff; profile=cloud-optimized` |
| `collection-mirror` | `items.parquet`, a stac-geoparquet copy of the items | `application/vnd.apache.parquet` |
| `style` | A MapLibre GL style. One also carries `default`. | `application/vnd.mapbox.style+json` |
| `visual` | The PMTiles file, when it is also a distribution asset | `application/vnd.pmtiles` |
| `thumbnail` | Preview image | `image/png`, `image/jpeg`, or `image/webp` |
| `source` | The upstream original a mirror converted from | Any |

```bash
curl -s $COLL/collection.json \
  | jq -r '.assets | to_entries[] | select(.value.roles | index("data")) | .value.href'
```

From portolan-sdi/portolan-skills, Apache-2.0.

More from portolan-sdi/portolan-skills

Signals

Stars
11
Forks
3
Open issues
5
Last commit (this folder)
Sep 7, 2026 (1 month ago)
Last release
Oct 6, 2026 (24 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
Apache-2.0
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from portolan-sdi

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get reading-portolan running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying reading-portolan?

CallGet help
Cite this page

reading-portolan skill. Agent Mart. https://agentmart.dev/skills/portolan-sdi-reading-portolan (last updated 2026-10-24)