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
It runs from inside its repository, so the clone comes first — what it calls does not travel with the file alone.
git clone --depth 1 https://github.com/datopian/portaljsnpx agentmods add skills/datopian/portaljs/portaljs-deployWrote 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/skills/datopian/portaljs/portaljs-deploy)<a href="https://agentmods.dev/skills/datopian/portaljs/portaljs-deploy"><img src="https://agentmods.dev/badge/skills/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.1 | $0.00066 | $0.01441 |
| Opus 5 | $0.00033 | $0.00720 |
| Sonnet 5 | $0.00013 | $0.00288 |
| Haiku 4.5 | $0.00007 | $0.00144 |
Grade A, and why
portaljs-deploy scanned grade A with 1 finding 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 7d 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.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
allowed-tools: Read, Write, Edit, Bash(npm:*), Bash(npx:*), Bash(curl:*) How it starts
The opening of the file, as written. The whole thing — 109 lines — stays where its author put it; the contents beside it link to each section on GitHub.
PortalJS — Deploy
Overview
Publish an existing PortalJS portal to PortalJS Arc — Datopian's managed static
hosting on Cloudflare. Build a static export, upload it to the Arc API, and print 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 Arc only. For self-hosting, run
npm run build and upload out/ to any static host; no skill required for that path.
Arc serves static exports only — SSR is not hosted on Arc yet.
Prerequisites
- A PortalJS portal directory with a
package.jsonthat listsnextas a dependency. - Node 18+ and npm on PATH (the Arc device-login flow uses Node's global
fetch). curlandtaravailable for packaging and upload.- A PortalJS Arc token — read from
PORTALJS_TOKEN, or~/.portaljs/credentials({"token":"…"}). If neither exists, the skill signs in on demand via a device-code flow; no manual token copying required. - If the portal stores large data in Git LFS/R2, do not run
git lfs pullbefore deploying — large datasets are served from Cloudflare R2 via absolute URLs indatasets.json, not copied into the export.
Instructions
The canonical, full step-by-step workflow is
.claude/commands/portaljs-deploy.md — the
single source of truth. Read and follow it when executing. Summary:
- Gather input — portal directory (default
.) and slug (default frompackage.jsonname or directory name, slugified). Confirm the directory is a Next.js project; reject reserved slugs (www,api,admin,staging,arc). - Resolve the Arc token: read
PORTALJS_TOKEN, else~/.portaljs/credentials; if missing, run the device-authorization sign-in flow and save the returned token. - Ensure
next.config.jssetsoutput: 'export'andimages: { unoptimized: true }, then runnpm run build; stop if the build fails. - Verify the export carries no dataset bytes — run
npm run check-export(orscripts/check-export.mjs) to catch Git LFS pointer leaks and oversized data files. - Tar the
out/directory andPOSTit to$PORTALJS_ARC_API/v1/deploy?slug=<slug>with the bearer token; handle 200/401/409/400/413 responses distinctly. - Report the live URL, file count, upload size, and R2-vs-inline dataset counts.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
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.
- 7d ago First seen · 109 lines · 66 tokens per session scan A 976df0767c16
portaljs-deploy is a skill published in the GitHub repository datopian/portaljs (2,349 stars, last pushed 3d ago), licensed MIT. It adds 66 tokens to every session and 1,441 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
prepare-cloudflare-production-deployment
Source-of-truth runbook for preparing this Vinext Cloudflare Workers SaaS template for production deployment. Use when setting up or auditing Cloudflare MCP resources, wrangler.jsonc bindings, Worker secrets, Turnstile, Email Sending, GitHub Actions secrets/variables, or GitHub CLI deployment wiring for this…
vercel-hygiene
Audit and harden the 4 pivoshenko brand sites on Vercel (pivoshenko.dev, pivoshenko.startpage, pivoshenko.wallpapers, pivoshenko.ai), team pivoshenko. Read-only sweep -> per-site report (ok/attention/action) -> confirmed fixes. Emphasizes security headers and analytics coverage. Use when the user says "audit vercel"…
ship
Deploy static websites to ShipStatic. Use when the user wants to deploy a site, publish a website, upload to hosting, go live, set up a custom domain, manage deployments, or share a site URL. Free, no account needed. CLI (ship) and Node.js/browser SDK.
shippage
Publish HTML or Markdown to a public URL instantly. Zero config, auto-registers on first use. Use when the user wants to share, preview, host, or deploy generated HTML, Markdown, JSX, or web content as a live webpage accessible from any device including mobile phones and WeChat. Perfect for sharing AI-generated pages…
pocketnook
Deploys a repository or a working directory to a private URL, and manages what is already deployed: build logs, stopping. Use when a finished piece of work needs somewhere to run, or when a deploy has failed and the reason is in the build log. Trigger with "deploy this", "put this somewhere private", "get me a link…
deploy
Deploy an app or static site to a live URL with openpouch (agent-native hosting — no account, no CAPTCHA, one command). Use when the user asks to deploy, publish, ship, host, or wants a live/preview/shareable URL for what you built.