Add a dataset (CSV, TSV, JSON, or GeoJSON) to an existing PortalJS portal. Appends an entry to datasets.json so the catalog and showcase render it automatically; routes the data by source (local file vs remote URL) — R2 via Git LFS by default, remote URLs by passthrough. Use when registering a new dataset in a scaffolded portal.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Register a dataset in a PortalJS (portaljs-catalog) portal. The skill appends one entry to
datasets.json — the single source of truth for the catalog — and routes the underlying
bytes by source first, then size: a local file defaults to R2 via Git LFS, a remote URL
defaults to passthrough (no copy). No per-dataset page is created; the catalog at /search
lists the new entry and the dynamic showcase route pages/[owner]/[slug].tsx renders it
automatically at /@<namespace>/<slug>. Supported formats for the showcase preview: CSV,
TSV, JSON (array), and GeoJSON.
portaljs-new-portal) with datasets.json,
package.json, and pages/[owner]/[slug].tsx present.git and git-lfs installed, and an Arc account token
(or an OSS Giftless key) to mint a push-scoped LFS credential.The canonical, full step-by-step workflow is
.claude/commands/portaljs-add-dataset.md —
the single source of truth. Read and follow it when executing. Summary:
$ARGUMENTS — source (file path or URL), portal directory (default
.), dataset name/slug, description, namespace. If the source is missing, interview the
user; never dead-end.datasets.json, package.json, and
pages/[owner]/[slug].tsx exist.Content-Type header
(CSV, TSV, JSON array, or GeoJSON); reject anything else and ask for a conversion.public/data/ (fenced exception for
bundled samples or an OSS-no-R2 fallback).datasets.json — slug, namespace, name, description, file
(the routed path/URL), format — keeping (namespace, slug) unique.npx next build; fix errors (commonly malformed JSON) before
reporting success.datasets.json (one entry appended).data/<slug>.<ext> tracked via Git LFS (R2 default), or
public/data/<slug>.<ext> (inline exception). Nothing is created for remote passthrough.npx next build passes./search and renders at /@<namespace>/<slug>.| Symptom | Cause | Fix |
|---|---|---|
| Fetch fails for a URL source | Non-200 status or unreachable host | Report the HTTP status and ask the user to confirm the URL is publicly accessible. |
| "Not a portaljs-catalog portal" | datasets.json missing | This is an older single-page template; ask the user how to proceed rather than failing silently. |
| Unsupported format | Extension/content-type isn't csv/tsv/json/geojson | Ask the user to convert the source before continuing. |
git lfs push has nothing to stream | git lfs install --local never ran, so raw bytes were committed instead of a pointer | Run git lfs install --local before git lfs track, re-add and re-commit the file. |
| R2 PUT returns 400 | A broad http.extraHeader was set and replayed onto the presigned URL | Use the _jwt Basic-auth piggyback in lfs.url only — never a global http.extraHeader. |
(namespace, slug) clash | Another entry already uses that pair | Ask the user for a different slug or namespace. |
next build fails | Malformed JSON in datasets.json | Print the build log, fix the JSON, rebuild before reporting success. |
/portaljs-add-dataset ./data/co2-emissions.csv namespace=climateMoves the file into data/, tracks it with Git LFS, pushes it to R2, and appends a manifest
entry whose file is the resulting https://data.portaljs.com/... URL.
/portaljs-add-dataset https://example.org/open-data/trade.csv namespace=tradeDetects the format from the response headers and records the URL as-is in datasets.json —
no bytes are copied.
/portaljs-add-dataset https://example.org/boundaries.geojson namespace=reference adopt=trueDownloads the file, then routes it as a local file through the Git LFS → R2 path so it is hosted and versioned under the portal (useful when in-browser range queries are needed).
/portaljs-add-dataset ./samples/demo.csv namespace=referenceWhen the portal has no R2 credentials (OSS self-host) or the file is bundled sample data,
the skill copies it into public/data/ instead, per the .gitattributes inline fence.
.claude/commands/portaljs-add-dataset.mdreferences/reference.mdportaljs-new-portal, portaljs-add-chart, portaljs-add-map, portaljs-define-schemadatopian/portaljs
0692882
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.