Agent skill

Arcgis To Portaljs

by datopian in datopian/portaljs

Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end.

MITAuto-check passedBackend & APIs

Install Arcgis To Portaljs

skills CLI
$ npx skills add datopian/portaljs --skill arcgis-to-portaljs -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install datopian/portaljs arcgis-to-portaljs --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/datopian/portaljs.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/arcgis-to-portaljs .claude/skills/arcgis-to-portaljs && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
arcgis-to-portaljs
GitHub stars
2.4k
Used in
1 other repo
Token cost
~2k tokens
SKILL.md length
739 words
Files
3 (incl. references)
Skills in repo
14
Repo updated
First seen
Licence
MIT

At a glance

Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end.

  • Works in 9 steps: Gather input — Hub URL, portal… → Check native tools (ogr2ogr, tippecanoe,… → Validate the portal directory and… → …
  • Sector ArcGIS Hub open-data portal onto PortalJS with no server-side compute
  • SKILL.md covers Overview, Prerequisites, Instructions and Output, plus 3 more sections
  • Calls brew, apt-get and git; reaches hub-lewisville.opendata.arcgis.com and streamwaterdata.co.uk

What it does

Arcgis To Portaljs is an agent skill from datopian/portaljs. Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end. Harvests the Hub /data.json (DCAT-US) inventory, exports every FeatureService layer through the ArcGIS REST query API with resultOffset paging, converts each to the serverless dual tier (PMTiles render + GeoParquet query) with tabular items to Parquet, pushes everything to Cloudflare R2 via Git LFS, appends dual-tier datasets.json entries, and writes a source-vs-derived parity report. Use to move a City or sector ArcGIS Hub open-data portal…

Its SKILL.md is about 2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/reference.md` and `references/sync-and-cutover.md`). Compatibility notes: Claude Code with PortalJS portals (Next.js 14, React 18/19, Node 18+). Requires native GDAL, tippecanoe, duckdb, and jq on the operator's machine (macOS or…

It sits in Backend & APIs, covering Serverless, DataFrames and Backend development. It works with Git, Cloudflare R2 and DuckDB. The repository describes itself as: 🌀 AI-native framework for building data portals. Scaffold a full portal from a brief and load datasets in minutes with agentic skills — any backend (CKAN, GitHub, Frictionless). The licence is MIT.

When your agent uses it

  • Sector ArcGIS Hub open-data portal onto PortalJS with no server-side compute
  • Tasks that involve Serverless
  • Tasks that involve DataFrames

Example prompts

  • “/arcgis-to-portaljs”

Requirements

  • Compatibility (from SKILL.md): Claude Code with PortalJS portals (Next.js 14, React 18/19, Node 18+). Requires native GDAL, tippecanoe, duckdb, and jq on the operator's machine (macOS or Linux/WSL). Runs from any project via the plugin, a personal install, or a portaljs clone.
  • Pre-approved tools (allowed-tools): Read, Write, Edit, Bash(ogr2ogr:*), Bash(ogrinfo:*), Bash(tippecanoe:*), Bash(duckdb:*), Bash(git:*), Bash(curl:*), Bash(jq:*), Bash(npx:*), Bash(node:*), Bash(mkdir:*), Bash(cp:*), Bash(wc:*), Bash(command:*), WebFetch

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Gather input — Hub URL, portal directory, project slug, optional flags (--limit,
  2. Check native tools (ogr2ogr, tippecanoe, duckdb + spatial, jq). Any missing →
  3. Validate the portal directory and confirm the geo showcase components exist.
  4. Harvest the Hub /data.json (reuse the portaljs-migrate DCAT-US map) and classify each
  5. Export each vector layer through the ArcGIS REST query API with resultOffset paging
  6. Convert each layer to the dual tier via the portaljs-add-geo recipe (PMTiles +
  7. Publish — bulk Git-LFS track + one push to R2 through Giftless, then append dual-tier
  8. Write arcgis-parity-report.md — record count, extent, attribute schema, and geometry
  9. Report the inventory, migrated datasets, R2 push, and parity summary.

What it can do on your machine

Read from SKILL.md and the folder at commit d5c096a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit
    • Bash(ogr2ogr:*)
    • Bash(ogrinfo:*)
    • Bash(tippecanoe:*)
    • Bash(duckdb:*)
    • Bash(git:*)
    • Bash(curl:*)
    • Bash(jq:*)

    …and 7 more on the same allowed-tools line.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • brew
    • apt-get
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • hub-lewisville.opendata.arcgis.com
    • streamwaterdata.co.uk

    Also links to:

    • developers.arcgis.com
    • github.com
    • duckdb.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Claude Code with PortalJS portals (Next.js 14, React 18/19, Node 18+). Requires native GDAL, tippecanoe, duckdb, and jq on the operator's machine (macOS or Linux/WSL). Runs from any project via the plugin, a personal install, or a portaljs clone.

    From compatibility in the SKILL.md frontmatter.

Context cost

Arcgis To Portaljs loads about 2k tokens when it runs, and up to ~7.1k if it reads all its reference files. Until then it costs about 144 tokens; SKILL.md has 739 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~144
When it runs · the whole SKILL.md, loaded when a task matches
~2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~7.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from datopian/portaljs at commit d5c096a, republished under its MIT licence (© datopian). 739 words, ~1,989 tokens.

Download SKILL.mdSave it as .claude/skills/arcgis-to-portaljs/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
arcgis-to-portaljs
description
Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end. Harvests the Hub /data.json (DCAT-US) inventory, exports every FeatureService layer through the ArcGIS REST query API with resultOffset paging, converts each to the serverless dual tier (PMTiles render + GeoParquet query) with tabular items to Parquet, pushes everything to Cloudflare R2 via Git LFS, appends dual-tier datasets.json entries, and writes a source-vs-derived parity report. Use to move a City or sector ArcGIS Hub open-data portal onto PortalJS with no server-side compute.
allowed-tools
Read, Write, Edit, Bash(ogr2ogr:*), Bash(ogrinfo:*), Bash(tippecanoe:*), Bash(duckdb:*), Bash(git:*), Bash(curl:*), Bash(jq:*), Bash(npx:*), Bash(node:*), Bash(mkdir:*), Bash(cp:*), Bash(wc:*), Bash(command:*), WebFetch
compatibility
Claude Code with PortalJS portals (Next.js 14, React 18/19, Node 18+). Requires native GDAL, tippecanoe, duckdb, and jq on the operator's machine (macOS or Linux/WSL). Runs from any project via the plugin, a personal install, or a portaljs clone.
version
0.1.0
author
Datopian <hello@datopian.com>
license
MIT
tags
portaljs, data-portal, migration, arcgis, geospatial, pmtiles

ArcGIS Hub → PortalJS

Overview

Migrate an entire ArcGIS Hub open-data site into a PortalJS Arc portal in one pass. Every Hub site is machine-readable — a DCAT-US catalog at /data.json, with every dataset backed by an ArcGIS REST FeatureService — so migration is a harvest → export → convert → publish → verify pipeline that runs almost fully automated on the operator's machine, no server-side compute. The tooling is the reusable arcgis-to-portaljs migrator: input is one Hub URL, output is a ready-to-deploy PortalJS catalog plus a parity report.

The skill is an orchestrator: it reuses the DCAT-US harvest from portaljs-migrate, the ogr2ogr/tippecanoe/duckdb dual-tier conversion from portaljs-add-geo, and the bulk Git-LFS → R2 push from portaljs-migrate. Its novel parts are the FeatureService REST export loop (paged features, not just a link) and the source-vs-derived parity report.

Prerequisites

  • A scaffolded PortalJS portal whose template ships components/MapPreview.tsx and components/GeoQuery.tsx (PR #1647 or later). Run portaljs-new-portal first if none.
  • Native CLIs: GDAL (ogr2ogr, ogrinfo), tippecanoe, duckdb (with spatial), and jq. macOS: brew install gdal tippecanoe duckdb jq; Debian/Ubuntu: apt-get install gdal-bin duckdb jq plus tippecanoe (apt or build from source); Windows via WSL. The skill hard-stops with the install hint if any is missing.
  • Arc credentials for the Git-LFS → R2 push (the token portaljs-deploy resolves), or an OSS self-hosted Giftless.

Instructions

The canonical, full step-by-step workflow is .claude/commands/arcgis-to-portaljs.md — the single source of truth. Read and follow it when executing. Summary:

  1. Gather input — Hub URL, portal directory, project slug, optional flags (--limit, --only, --dry-run, --namespace-mode). Interview if missing; never dead-end.
  2. Check native tools (ogr2ogr, tippecanoe, duckdb + spatial, jq). Any missing → print the per-OS install and stop.
  3. Validate the portal directory and confirm the geo showcase components exist.
  4. Harvest the Hub /data.json (reuse the portaljs-migrate DCAT-US map) and classify each item: vector (FeatureService), table, or non-data (web map / 3D / imagery → skipped). Under --namespace-mode owner, resolve namespaces through a publisher-normalization table with title-prefix fallback for broken {{source}} publishers (multi-publisher Hubs ship dirty publisher labels). Dedup near-duplicate hosted-view layers — but only after a mandatory live record-count check on BOTH twins: equal ⇒ dedup (keep the source layer, log the pair); different ⇒ keep both as distinct datasets. Consolidate per-year dataset series into one year-partitioned Parquet with legacy per-year view entries. Enrich from the AGOL item: sanitized metadata (license/description/dates), cleaned display title (cleanTitle — raw title still drives the slug), category (item categories → meaningful theme → keyword mapping), and a thumbnail snapshot into public/thumbnails/.
  5. Export each vector layer through the ArcGIS REST query API with resultOffset paging (f=geojson, outSR=4326); fall back to keyset paging on transfer limits; accept a customer File Geodatabase dump for very large layers.
  6. Convert each layer to the dual tier via the portaljs-add-geo recipe (PMTiles + GeoParquet); tabular items to Parquet. Preserve the native-CRS original.
  7. Publish — bulk Git-LFS track + one push to R2 through Giftless, then append dual-tier datasets.json entries (upsert on (namespace, slug)).
  8. Write arcgis-parity-report.md — record count, extent, attribute schema, and geometry validity, source vs derived, per dataset, plus the migrated/skipped/failed accounting.
  9. Report the inventory, migrated datasets, R2 push, and parity summary.
Show full SKILL.md (234 more words)Show less

Output

  • Created: data/<namespace>/<slug>.pmtiles, .parquet, and the original per vector dataset (all LFS-tracked → R2); Parquet + original per table; arcgis-parity-report.md.
  • Modified: datasets.json (one dual-tier entry per vector dataset, one resource entry per table); .gitattributes (LFS tracking).
  • Verified: the parity report compares each derived artifact to the live FeatureService.
  • Result: /@<namespace>/<slug> renders <MapPreview> + <GeoQuery> for each vector dataset with no page edits; the catalog lists everything migrated.

Error Handling

SymptomCauseFix
MISSING_INPUTNo Hub URL providedPass the site root (e.g. https://hub-lewisville.opendata.arcgis.com) and retry.
MISSING_TOOLSogr2ogr/tippecanoe/duckdb/jq (or duckdb spatial) absentPrint the per-OS install line and stop; re-run after installing.
NOT_A_PORTALTarget dir has no datasets.json / geo componentsRun portaljs-new-portal first, then re-run.
HARVEST_FAILED/data.json unreachable or not DCAT-USConfirm the site is an ArcGIS Hub and the feed loads in a browser.
EXPORT_FAILEDOne FeatureService layer errored or hit a hard transfer capLogged and skipped; try keyset paging or a customer FGDB dump for that layer.
LFS_PUSH_FAILEDMissing/expired Arc token or unset lfs.urlRe-mint the JWT (see portaljs-deploy); confirm git config lfs.url.

Examples

Example 1 — Migrate a City Hub (Lewisville)
/arcgis-to-portaljs https://hub-lewisville.opendata.arcgis.com slug=lewisville
Example 2 — Dry-run inventory + plan only (no writes)
/arcgis-to-portaljs https://streamwaterdata.co.uk --dry-run
Example 3 — Migrate a subset, one namespace per publisher
/arcgis-to-portaljs https://streamwaterdata.co.uk --only sewer-catchments,water-boundaries --namespace-mode owner

Resources

© datopian, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (references) in skills/arcgis-to-portaljs of datopian/portaljs.

  • SKILL.md
  • references/reference.md
  • references/sync-and-cutover.md

Open the folder on GitHubat commit d5c096a

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in datopian/portaljs, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Arcgis To Portaljs next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Arcgis To Portaljs compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Arcgis To Portaljs this skilldatopian/portaljs2.4k1 repos~2kAutomated safety check: PassMIT
API Surface Reviewpolarsource/polar10k—~1.3kAutomated safety check: PassMIT
S3 Exploreduckdb/duckdb-skills6031 repos~848Automated safety check: NotesMIT
Backend Guidelightly-ai/lightly-studio896—~1.2kAutomated safety check: PassApache-2.0
Config Breaking Changesaxelixlabs/axelix148—~2.6kAutomated safety check: PassLGPL-3.0
Nextjs Ssrasmyshlyaev177/test-proxy-recorder78—~4.5kAutomated safety check: PassMIT

Similar skills

  • API Surface Review

    polarsource/polar

    Review changes to Polar's API contract — Pydantic schemas, FastAPI endpoints, OpenAPI output and the generated SDKs.

    10k GitHub stars~1.3k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • S3 Explore

    duckdb/duckdb-skills

    Official

    Explore and query data on S3, Cloudflare R2, GCS, MinIO, or any S3-compatible storage.

    603 GitHub starsUsed in 1 repo~848 tokens
    Backend & APIsAuto-check: notes
  • Backend Guide

    lightly-ai/lightly-studio

    Read before adding or changing backend code in lightlystudio - FastAPI routes, services, resolvers, SQLModel tables, or database access.

    896 GitHub stars~1.2k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Config Breaking Changes

    axelixlabs/axelix

    Review configuration property changes in the Axelix project for breaking changes and migration-policy compliance.

    148 GitHub stars~2.6k tokensUpdated today
    Backend & APIsAuto-check passed
  • Nextjs Ssr

    asmyshlyaev177/test-proxy-recorder

    Tag server-side fetches with the x-test-rcrd-id session header so SSR is recorded under the correct Playwright test session.

    78 GitHub stars~4.5k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Runpod

    digitalsamba/claude-code-video-toolkit

    Cloud GPU processing via RunPod serverless. An agent skill from digitalsamba/claude-code-video-toolkit.

    2.2k GitHub stars~2.1k tokensUpdated yesterday
    Backend & APIsAuto-check: notes

More from datopian/portaljs

All 14 skills in this repo
  • Portaljs Add Chart

    datopian/portaljs

    Add a chart (line, bar, area, pie, or scatter) to a dataset's showcase in a PortalJS portal.

    2.4k GitHub starsUsed in 1 repo~1.1k tokens
    Auto-check passed
  • Portaljs Add Dataset

    datopian/portaljs

    Add a dataset (CSV, TSV, JSON, or GeoJSON) to an existing PortalJS portal.

    2.4k GitHub starsUsed in 1 repo~1.6k tokens
    Auto-check passed
  • Portaljs Add Dcat

    datopian/portaljs

    Make a PortalJS portal harvestable by national/EU/US open-data portals — emit standards-compliant DCAT catalog feeds (DCAT 2/3, DCAT-AP, DCAT-US, national profiles) in JSON-LD, Turtle, and RDF/XML…

    2.4k GitHub starsUsed in 1 repo~1.8k tokens
    Auto-check passed
  • Portaljs Add Geo

    datopian/portaljs

    Auto-ingest a geospatial file (GeoJSON, Shapefile, GeoPackage, KML/KMZ, FlatGeobuf, CSV-with-geometry) into a PortalJS portal on the user's own machine, with no server.

    2.4k GitHub starsUsed in 1 repo~1.7k tokens
    Auto-check passed
  • Portaljs Add Map

    datopian/portaljs

    Render a GeoJSON dataset on an interactive Leaflet map in the Views section of a dataset's showcase.

    2.4k GitHub starsUsed in 1 repo~1.3k tokens
    Auto-check passed
  • Portaljs Add Resource

    datopian/portaljs

    Add another file (resource) to an EXISTING dataset in a PortalJS portal — a data dictionary, methodology, or an additional data file.

    2.4k GitHub starsUsed in 1 repo~1.6k tokens
    Auto-check passed

Categories

Questions about Arcgis To Portaljs

What does Arcgis To Portaljs do?

Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end. Arcgis To Portaljs is an agent skill from datopian/portaljs. Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end.

When should I use Arcgis To Portaljs?

Arcgis To Portaljs fits situations like: sector ArcGIS Hub open-data portal onto PortalJS with no server-side compute; tasks that involve Serverless; tasks that involve DataFrames.

How do I install Arcgis To Portaljs in Claude Code?

Run `npx skills add datopian/portaljs --skill arcgis-to-portaljs -a claude-code`. Or copy the skill folder (skills/arcgis-to-portaljs in datopian/portaljs) into .claude/skills/arcgis-to-portaljs in your project. Claude Code loads it when a task matches its description.

How do I install Arcgis To Portaljs in Codex?

Run `npx skills add datopian/portaljs --skill arcgis-to-portaljs -a codex`. Or copy the skill folder (skills/arcgis-to-portaljs in datopian/portaljs) into .agents/skills/arcgis-to-portaljs in your project. Codex loads it when a task matches its description.

Can I use Arcgis To Portaljs in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add datopian/portaljs --skill arcgis-to-portaljs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/arcgis-to-portaljs, .gemini/skills/arcgis-to-portaljs, .github/skills/arcgis-to-portaljs and .opencode/skills/arcgis-to-portaljs in your project.

What does Arcgis To Portaljs need to run?

Going by SKILL.md and its folder, Arcgis To Portaljs needs the command-line tools its instructions call (brew, apt-get and git). Its frontmatter pre-approves these tools: Read, Write, Edit, Bash(ogr2ogr:*), Bash(ogrinfo:*), Bash(tippecanoe:*), Bash(duckdb:*), Bash(git:*), Bash(curl:*), Bash(jq:*), Bash(npx:*), Bash(node:*), Bash(mkdir:*), Bash(cp:*), Bash(wc:*), Bash(command:*), WebFetch. Compatibility (from SKILL.md): Claude Code with PortalJS portals (Next.js 14, React 18/19, Node 18+). Requires native GDAL, tippecanoe, duckdb, and jq on the operator's machine (macOS or Linux/WSL). Runs from any project via the plugin, a personal install, or a portaljs clone..

Does Arcgis To Portaljs access the network?

SKILL.md names 5 domains. In commands or code: hub-lewisville.opendata.arcgis.com and streamwaterdata.co.uk; the agent is likely to contact these when it follows the instructions. As links in the text: developers.arcgis.com, github.com and duckdb.org. This is read from the text; nothing was executed.

Is Arcgis To Portaljs safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Arcgis To Portaljs use?

Arcgis To Portaljs is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Arcgis To Portaljs use?

About 2k tokens (SKILL.md is roughly 8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.1k tokens, read only when the agent opens those files.

What are the alternatives to Arcgis To Portaljs?

Skills that share tags, products or a category with Arcgis To Portaljs: API Surface Review (polarsource/polar, 10k stars), S3 Explore (duckdb/duckdb-skills, 603 stars), Backend Guide (lightly-ai/lightly-studio, 896 stars) and Config Breaking Changes (axelixlabs/axelix, 148 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Arcgis To Portaljs?

datopian (a GitHub organization) maintains it in datopian/portaljs, which has 2,358 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 8, 2026.

Source: datopian/portaljs on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.