portaljs-deploy

portaljs-deploy is a skill for Claude Code from datopian/portaljs. It costs 66 tokens per session (1,441 once invoked), scanned A, original, MIT.

A deployment workflow for publishing a PortalJS data catalogue to PortalJS Arc, a managed static hosting service.

In plain words
What is it for?
Use it to build and publish a static PortalJS export to an Arc subdomain, or redeploy an existing catalogue to the same address.
Why use it?
It packages and uploads the catalogue so it can be accessed through a live web address instead of remaining only on a local computer.

Skill for Claude Code

Written for Claude Code: allowed-tools in frontmatter. Also seen: reads .claude/ paths; mentions Claude Code.

Needs its repository: it runs a file that does not travel with it, so clone the repository first. The line is /portaljs-deploy ./portals/city-budget --slug city-budget.

Part of the portaljs plugin — 14 skills, 25 commands shipped together

Good fit Use it to build and publish a static PortalJS export to an…

Compare 6 skills from other repositories ↓
About the project

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.

datopian/portaljs · 2,349 stars · on GitHub · portaljs.com

Install

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.

Clone the repo
git clone --depth 1 https://github.com/datopian/portaljs
agentmods
npx agentmods add skills/datopian/portaljs/portaljs-deploy

Made for: Claude Code.

Or install portaljs, the plugin that ships this one along with the rest of its 14 skills, 25 commands.

Wrote 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.

agentmods badge for portaljs-deploy

README.md
[![agentmods](https://agentmods.dev/badge/skills/datopian/portaljs/portaljs-deploy.svg)](https://agentmods.dev/skills/datopian/portaljs/portaljs-deploy)
Your own site
<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>
Per session 66 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,441 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 7d ago against content hash 976df0767c16, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-06, from the pricing page.

Security

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:*)
skills/portaljs-deploy/SKILL.md · 109 lines

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.json that lists next as a dependency.
  • Node 18+ and npm on PATH (the Arc device-login flow uses Node's global fetch).
  • curl and tar available 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 pull before deploying — large datasets are served from Cloudflare R2 via absolute URLs in datasets.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:

  1. Gather input — portal directory (default .) and slug (default from package.json name or directory name, slugified). Confirm the directory is a Next.js project; reject reserved slugs (www, api, admin, staging, arc).
  2. Resolve the Arc token: read PORTALJS_TOKEN, else ~/.portaljs/credentials; if missing, run the device-authorization sign-in flow and save the returned token.
  3. Ensure next.config.js sets output: 'export' and images: { unoptimized: true }, then run npm run build; stop if the build fails.
  4. Verify the export carries no dataset bytes — run npm run check-export (or scripts/check-export.mjs) to catch Git LFS pointer leaks and oversized data files.
  5. Tar the out/ directory and POST it to $PORTALJS_ARC_API/v1/deploy?slug=<slug> with the bearer token; handle 200/401/409/400/413 responses distinctly.
  6. Report the live URL, file count, upload size, and R2-vs-inline dataset counts.

Read the full file on GitHub · 109 lines

Files

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.

Changes

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.

  1. 7d ago First seen · 109 lines · 66 tokens per session scan A 976df0767c16

Subscribe to this mod's changes

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.

Related

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…

LubomirGeorgiev/cloudflare-workers-nextjs-saas-template · 72 tokens

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"…

pivoshenko/pivoshenko.ai · 162 tokens

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.

shipstatic/ship · 61 tokens

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…

jieshu666/ShipPage-Skill · 94 tokens

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…

shotintoeternity/pocketnook-mcp · 104 tokens

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.

openpouch/openpouch · 58 tokens