sourcecoop
Upload geospatial data to Source Cooperative with proper metadata and READMEs using Portolan CLI.
Skill by portolan-sdi
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-sourcecoop
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
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/sourcecoop
What's inside
- Skill name
sourcecoop- Description
- Upload geospatial data to Source Cooperative with proper metadata and READMEs using Portolan CLI.
- License
- Apache-2.0
- Instructions
- 297 lines in SKILL.md · view on GitHub
Before installing
- Instructions read files in your home folder (~/.ssh, ~/.aws…)
Files (1)
- SKILL.md
SKILL.md (first lines)
<!-- drift: depends-on: portolan-cli, rashid, portolan-spec, source-coop-cli -->
# Source Cooperative Upload Skill
You are helping a user publish a Portolan catalog to [Source Cooperative](https://source.coop), an open data commons for geospatial data. This skill covers the upload path. To build the catalog from a data source, use the `portolan-bootstrap` skill first, then return here.
The [Portolan spec](https://github.com/portolan-sdi/portolan-spec) is ground truth. The CLI and the validator implement it. Run `portolan <cmd> --help` for the flags of any command below. Do not restate the help text in your answers.
## Prerequisites
Source Cooperative serves its object storage through a data proxy at `data.source.coop`. The [`source-coop` CLI](https://github.com/source-cooperative/source-coop-cli) authenticates you against the proxy and issues temporary S3 credentials. Check for it first:
```bash
source-coop --version
```
This skill describes version 0.3.0. An older version does not refresh expired credentials. Install it with Homebrew, or with the installer script the CLI README documents:
```bash
brew install source-cooperative/tap/source-coop
```
You also need a Source Cooperative account with write access to the repository. The user without access requests it at hello@source.coop.
## Workflow Overview
1. Gather the organization and product names.
2. Log in with `source-coop`, set the remote and the endpoint in `.env`, and export the credentials.
3. Initialize the catalog with a license.
4. Add files.
5. Write metadata: contact, license, providers, `source_url`.
6. Generate READMEs and write `AGENTS.md`.
7. Run the validator locally.
8. Push, then probe the published host.
## Step 1: Gather Information
Ask the user for:
1. The Source Cooperative organization slug (required). Examples: `nlebovits`, `radiant-mlhub`, `vida`.
2. The product name (optional). Defaults to the current directory name.
The proxy addresses the account as the bucket and the repository as the key prefix. Build the remote URL from them:
```
s3://{org}/{product}/
```
The same URL form works for every storage region. Source Cooperative stores repositories in more than one region, such as `us-west-2`, `ca-central-1`, and an Azure region in West Europe. The proxy finds the region of the repository. The remote contains no region.
Do not use a regional bucket such as `s3://us-west-2.opendata.source.coop/{org}/{product}/` or `s3://ca-central-1.opendata.source.coop/{org}/{product}/`. The `source-coop` credentials are valid only at the proxy. AWS rejects them at a regional bucket with `InvalidAccessKeyId`.
## Step 2: Log in and set the remote
`source-coop login` opens a browser for the OAuth2 authorization code flow. It caches the temporary credentials and a refresh token in the OS keyring:
```bash
source-coop login
```
`login` receives the OAuth2 redirect on a local port. On a machine with no browser, forward a port over SSH and give the same port to `login`:
```bash
ssh -L 8400:127.0.0.1:8400 user@server
source-coop login --port 8400
```
Run the second command on the server. Open the URL that it prints in a local browser.
### The remote
The remote is the destination that `portolan push` writes to. The proxy addresses the account as the bucket and the repository as the key prefix. `portolan push` reads the destination from `PORTOLAN_REMOTE` when you give it no argument.
The CLI refuses to store `remote`, `profile`, `region`, and `s3_endpoint` in `.portolan/config.yaml`. That file is pushed with the catalog. Put the remote and the proxy endpoint in `.env` at the catalog root. `portolan push` excludes `.env` from the upload.
```bash
cat > .env << 'EOF'
PORTOLAN_REMOTE=s3://{org}/{product}/
PORTOLAN_S3_ENDPOINT=https://data.source.coop
EOF
portolan config list
```
`config list` shows `remote` and `s3_endpoint` with `(from env)`. Without the endpoint, the push goes to AWS and fails with `InvalidAccessKeyId`.
### The credentials
`portolan push` reads the credentials from the `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN` environment variables. Export them in the shell you push from:
```bash
eval "$(source-coop creds --format env)"
```
The credentials expire, and the shell keeps the old values. `source-coop creds` refreshes expired credentials from the cached refresh token. When an upload fails with `AccessDenied` or `403 Forbidden`, run the `eval` line again.
Do not set `PORTOLAN_PROFILE`, and do not pass `--profile` to `portolan push`. portolan-cli 0.8.0 reads a named profile only from `~/.aws/credentials`. It ignores `credential_process` and `endpoint_url` in `~/.aws/config`. A profile name other than `default` also discards the credentials that the `eval` line set. The push then finds no credentials and stalls against the instance metadata service at `169.254.169.254`.
### The AWS profile for other tools
The aws CLI, boto3, rclone, and DuckDB run `credential_process` from `~/.aws/config`. The [Source Cooperative docs](https://docs.source.coop/upload-with-the-cli) give this profile:
```ini
[profile source-coop]
credential_process = source-coop creds
endpoint_url = https://data.source.coop
```
`portolan push` does not use this profile. Use it to list the prefix and to confirm what the push wrote:
```bash
aws s3 ls s3://{org}/{product}/ --profile source-coop --recursive
```
## Step 3: Initialize Catalog
`portolan init` requires a license. With `--auto` and no `--license`, it exits with `PRTLN-VAL004`. Every collection inherits the catalog license, and `portolan add` refuses a collection without one.
```bashFrom portolan-sdi/portolan-skills, Apache-2.0.
More from portolan-sdi/portolan-skills
- 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.637score
portolan-bootstrap
portolan-sdi
Build a complete, well-documented Portolan catalog from a data source.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
reading-portolan
portolan-sdi
Use when exploring, querying, analyzing, or visualizing data from a Portolan catalog (STAC-based cloud-native geospatial data).
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.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)
- Oct 15, 2026 (14 days ago)
- Last release
- Oct 6, 2026 (23 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
Cite this page
sourcecoop skill. Agent Mart. https://agentmart.dev/skills/portolan-sdi-sourcecoop (last updated 2026-10-24)