reading-portolan
Use when exploring, querying, analyzing, or visualizing data from a Portolan catalog (STAC-based cloud-native geospatial data).
Skill by portolan-sdi
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.
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.
About
Use cases: data
Reviews
Write a reviewNo 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
- 0.637score
portolan-bootstrap
portolan-sdi
Build a complete, well-documented Portolan catalog from a data source.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
enrich-metadata
portolan-sdi
Fill a collection's metadata.yaml from the open data portal record that lists the same data, when the data came from a source with no metadata of its own…
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
catalog-grader
portolan-sdi
Grade a published Portolan catalog from A+ to F and explain each finding with evidence.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
portolan-thumbnails
portolan-sdi
Generate framed, checked thumbnails from Portolan collections using chiitiler (MapLibre GL Native).
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
portolan-migrate
portolan-sdi
Bring an existing non-compliant catalog or published dataset into Portolan compliance without rebuilding it.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
customize-portolan-browser
portolan-sdi
Adapt a portolan-browser checkout into a publisher-branded interface for one existing Portolan catalog.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
git-backed-catalog
portolan-sdi
Create, maintain, or contribute to a Portolan catalog whose metadata is stored in a git repository, with CI that validates each change.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
portolan-cli
portolan-sdi
Use when publishing, managing, or converting cloud-native geospatial data catalogs with the Portolan CLI.
SkillAFreshness: A★ 11Claude Code +9 - 0.626score
report-catalog-issue
portolan-sdi
Report a problem with a catalog registered in the Portolan registry by opening a catalog feedback issue against it.
SkillAFreshness: A★ 11Claude Code +9 - 0.626score
sourcecoop
portolan-sdi
Upload geospatial data to Source Cooperative with proper metadata and READMEs using Portolan CLI.
SkillAFreshness: A★ 11Claude Code +9 - 0.621score
register-catalog
portolan-sdi
Submit a Portolan catalog to the registry by following the registry README.
SkillAFreshness: A★ 11Claude Code +9 - 0.618score
good
portolan-sdi
Fixture skill with no defects.
SkillAFreshness: A★ 11Claude Code +9
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
- Repository
- github.com/portolan-sdi/portolan-skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from portolan-sdi
- 0.637score
portolan-thumbnails
portolan-sdi
Generate framed, checked thumbnails from Portolan collections using chiitiler (MapLibre GL Native).
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
enrich-metadata
portolan-sdi
Fill a collection's metadata.yaml from the open data portal record that lists the same data, when the data came from a source with no metadata of its own…
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
catalog-grader
portolan-sdi
Grade a published Portolan catalog from A+ to F and explain each finding with evidence.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
portolan-bootstrap
portolan-sdi
Build a complete, well-documented Portolan catalog from a data source.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
portolan-cli
portolan-sdi
Use when publishing, managing, or converting cloud-native geospatial data catalogs with the Portolan CLI.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
git-backed-catalog
portolan-sdi
Create, maintain, or contribute to a Portolan catalog whose metadata is stored in a git repository, with CI that validates each change.
SkillAFreshness: A★ 11Claude Code +9
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.
Cite this page
reading-portolan skill. Agent Mart. https://agentmart.dev/skills/portolan-sdi-reading-portolan (last updated 2026-10-24)