PortalJS is a framework for building data portals that present searchable datasets through a home page, catalog, and dataset showcase. It is for teams that want to choose a data backend, scaffold a Next.js portal, load CSV or JSON data, connect services such as CKAN, and deploy the result. The catalogue entries are agent commands, skills, instructions, and a plugin that guide portal creation and data loading.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/datopian/portaljs/portaljs-deploygit clone --depth 1 https://github.com/datopian/portaljsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/datopian/portaljs/portaljs-deploy)<a href="https://agentmods.dev/commands/datopian/portaljs/portaljs-deploy"><img src="https://agentmods.dev/badge/commands/datopian/portaljs/portaljs-deploy.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00046 | $0.04768 |
| Opus 5 | $0.00023 | $0.02384 |
| Sonnet 5 | $0.00009 | $0.00954 |
| Haiku 4.5 | $0.00005 | $0.00477 |
Grade B, and why
portaljs-deploy scanned grade B with 3 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Asks for rootmediumPrivilege escalation
A mod that escalates privileges can change anything on the machine, not only the project.
HDR=$(mktemp); chmod 600 "$HDR" Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
# Pass the bearer token via a 0600 curl config file, not argv — so it doesn't leak Runs shell commandslowCapability
Expected in a hook, worth knowing in a rule or an instructions file.
import { spawn } from 'node:child_process' How it starts
The opening of the file, as written. The whole thing — 346 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/portaljs-deploy
Publish an existing PortalJS portal to PortalJS Arc — Datopian's managed static hosting.
The skill builds a static export of the portal, uploads it to the Arc API, and prints a live
https://<slug>.arc.portaljs.com URL. Re-running redeploys the same portal (idempotent on
the slug).
This is a single-target skill: it deploys to PortalJS Arc only. If you'd rather host the
portal yourself, it's a standard static Next.js export — run npm run build and upload out/
to any static host (Vercel, your own Cloudflare, Netlify, S3, …); you don't need this skill
for that.
Static only (for now). Arc serves static exports — the catalog template,
/portaljs-add-dataset,/portaljs-migrate, and/portaljs-connect-ckan(SSG) all export cleanly. SSR isn't hosted on Arc yet.
Required input — ask, don't error
- Portal directory (optional) — the portal project (default: current directory). Must be a
Next.js portal (
package.jsonwith anextdependency). - Slug (optional) — the subdomain to publish under (
<slug>.arc.portaljs.com). Default: the project'spackage.jsonname(or the directory name), slugified. Override with--slug <name>. - Auth — a PortalJS Arc token. Read from
PORTALJS_TOKEN, else~/.portaljs/credentials({ "token": "…" }). If neither is present, sign in on demand (one browser click — device flow, see step 2) to obtain and store one, then continue. Auth is never a separate step the user runs;/portaljs-deployhandles it. Don't ask the user to copy a token by hand.
Steps
1. Gather input + validate the portal
Extract from $ARGUMENTS:
PORTAL_DIR(default.),SLUG(default frompackage.jsonname / dir, slugified to a DNS label: lowercase,[a-z0-9-], ≤63 chars).
Confirm PORTAL_DIR/package.json exists and lists next. If not:
ERROR: [deploy] NOT_A_PORTAL No Next.js project in <dir> — run from a portal directory.
Reserved slugs (www, api, admin, staging, arc) are not allowed — if the derived slug
is reserved or invalid, ask for a --slug.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 346 lines · 46 tokens per session scan B 1f07a989df14
portaljs-deploy is a command published in the GitHub repository datopian/portaljs (2,349 stars, last pushed yesterday), licensed MIT. It adds 46 tokens to every session and 4,768 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it B with 3 findings (asks for root, makes network calls, runs shell commands). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other commands, from other repositories
vps-control-room
Use this command for project-level runtime/deploy troubleshooting. Root CLAUDE.md is the architecture SSOT; this file only adds a short operational checklist.
ship
Commit all staged and unstaged changes, push, create a PR, merge, deploy, and warm caches.
ui-interactive
Interactive component wizard with step-by-step guidance and enforced quality gates.
pre-commit-full
Command: /pre-commit-full Purpose: Comprehensive pre-commit validation orchestrating all error prevention checks.
build
Smart build with validation, error detection, and auto-fix.
e2e
Generate comprehensive E2E tests for user workflows using Playwright.