Render a GeoJSON dataset on an interactive Leaflet map in the Views section of a dataset's showcase. Installs react-leaflet and a Map component, then renders the map for the chosen dataset. Use when a dataset's data is geographic and a map view is needed alongside the showcase's default metadata and download.
npx skills add https://github.com/datopian/portaljs --skill portaljs-add-map
Add an interactive Leaflet map as a view on a dataset's showcase in a
portaljs-catalog portal. The skill installs react-leaflet/leaflet (added directly —
never @portaljs/components), writes a reusable Map component split across
MapView.tsx (the Leaflet code) and Map.tsx (a dynamic(..., { ssr: false }) wrapper,
since Leaflet touches window at module load), and renders <Map /> into the Views
section of the showcase route pages/[owner]/[slug].tsx for one chosen GeoJSON dataset.
The dataset should already carry format: "geojson" in datasets.json; if it doesn't
exist yet, the skill can copy the file and register it first.
portaljs-new-portal).datasets.json with format: "geojson" (seeportaljs-add-dataset), or a GeoJSON source file/URL to register.
The canonical, full step-by-step workflow is
.claude/commands/portaljs-add-map.md — the
single source of truth. Read and follow it when executing. Summary:
is missing, interview the user; never dead-end on a missing value.
datasets.json, package.json,pages/[owner]/[slug].tsx must exist).
datasets.json, or validate and register a new GeoJSONsource (copy to /public/data/, append a manifest entry).
npm install react-leaflet@^5 leaflet@^1.9 andnpm install -D @types/leaflet (skip if already present).
components/MapView.tsx and components/Map.tsx (idempotent — skip ifMap.tsx already exists).
<Map /> into the Views section, gated on the dataset's (namespace, slug) soother showcases are unaffected. Extend an existing view-dispatch block, do not
overwrite it.
npx tsc --noEmit (never next build against a live dev server).components/MapView.tsx and components/Map.tsx (Leaflet wrapper, ifabsent); public/data/<slug>.geojson (only when registering a new dataset).
pages/[owner]/[slug].tsx (import + gated <Map /> in Views);datasets.json (only when registering a new dataset); package.json
(react-leaflet, leaflet, @types/leaflet).
npx tsc --noEmit passes./@<namespace>/<slug> under a "Views" heading.| Symptom | Cause | Fix |
| --- | --- | --- |
| Dataset not found or not GeoJSON | Slug missing from datasets.json or format is tabular | List GeoJSON datasets and re-prompt; suggest portaljs-add-chart for tabular data. |
| Source fetch/copy fails | URL returns non-200 or local path missing | Report the HTTP status or missing path; ask for a corrected source. |
| "Not valid GeoJSON" | Parsed JSON type isn't a Feature/geometry type | Tell the user and point to portaljs-add-dataset for tabular data. |
| tsc failure | Bad import path or gating condition | Fix the first reported error before reporting success. |
| Map appears on every dataset | View not gated on (namespace, slug) | Wrap the <Map /> render in the dataset check shown in the Instructions. |
| Features render in the wrong place | Data isn't WGS84 (EPSG:4326) lon/lat | Reproject the source data to WGS84 before adding. |
| Slow render | Thousands of features in one file (>5MB) | Simplify geometries (e.g. mapshaper) before adding. |
/portaljs-add-map dataset=park-boundaries
/portaljs-add-map source=./data/bike-routes.geojson slug=bike-routes name="Bike Routes"
/portaljs-add-map source=https://example.com/districts.geojson slug=districts namespace=reference
.claude/commands/portaljs-add-map.mdreferences/reference.mdportaljs-add-dataset, portaljs-add-chart, portaljs-define-schemaConvert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.
Statistical models library for Python. Use when you need specific model classes (OLS, GLM, mixed models, ARIMA) with detailed diagnostics, residuals, and inference. Best for econometrics, time series, rigorous inference with coefficient tables. For guided statistical test selection with APA reporting use statistical-analysis.
Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: "AI SDK", "Vercel AI SDK", "generateText", "streamText", "add AI to my app", "build an agent", "tool calling", "structured output", "useChat".
Create an llms.txt file from scratch based on repository structure following the llms.txt specification at https://llmstxt.org/
Use when working directly with the `esm` Python SDK, ESM3 or ESMC model IDs, Forge/Biohub inference clients, or ESMFold2 folding workflows.
Modal is a serverless cloud platform for running Python on demand, including on-demand GPUs. Use when deploying or serving AI/ML models, running GPU-accelerated workloads (training, fine-tuning, inference), serving web endpoints, scheduling batch jobs, or scaling Python code to cloud containers with the Modal SDK.
Use Therapeutics Data Commons through the PyTDC Python package for registry discovery, approved dataset access, task-aware splits, evaluator metrics, benchmark groups, and bounded molecular-oracle workflows.
Take datopian/portaljs-add-map from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm, npx.
Without those the skill loads but fails at the first command.