agentleFS
datopiandatopian/portaljs/skills/portaljs-deploy/SKILL.md

portaljs-deploy

Skill2.4k starsChanged 12 days agoMITView on GitHub

Deploy a PortalJS portal to PortalJS Arc — Datopian-managed static hosting on Cloudflare. Builds a static export, uploads it, and returns a live SLUG.arc.portaljs.com URL. One command, one target. Use when a portal is ready to publish or redeploy to a live URL.

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    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 …

    line 37
  2. Very specific:

    Ensure next.config.js sets output: 'export' and images: { unoptimized: true }, then run npm run build.

    line 52
  3. Very specific:

    Verify the export carries no dataset bytes — run npm run check-export (or scripts/check-export.mjs) to catch Git LFS pointer leaks and …

    line 54

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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.

Output

  • Modified (if needed): next.config.js — adds output: 'export' and images: { unoptimized: true } when absent, preserving the rest of the config.
  • Created (on first sign-in): ~/.portaljs/credentials (mode 0600).
  • Verified: npm run build exits 0, out/index.html exists, the export-hygiene check passes.
  • Result: the portal is live at https://SLUG.arc.portaljs.com; re-running updates the same slug in place.

Error Handling

SymptomCauseFix
NOT_A_PORTAL errorNo next dependency found in PORTAL_DIR/package.jsonRun from a valid portal directory, or pass the correct path.
Slug rejectedDerived slug is reserved (www, api, …) or not a valid DNS labelPass an explicit --slug <name>.
Build fails (non-zero exit)App/config error surfaced in npm run buildPrint the log, fix the error, never deploy a failing build.
check-export failsGit LFS pointer leaked into out/, or a data file exceeds the size budgetReference large data by absolute R2 URL via portaljs-add-dataset; don't git lfs pull before building.
401 on uploadToken invalid, expired, or revokedRe-run the device sign-in flow once, retry the upload; stop if it 401s again.
409 on uploadSlug already taken by another accountChoose a different --slug.
400 / 413 on uploadMalformed slug or export too largeRead the JSON error field and address the specific cause.

Examples

Example 1 — Deploy the current directory with the default slug

/portaljs-deploy

Example 2 — Deploy with an explicit slug

/portaljs-deploy --slug my-open-data

Example 3 — Non-interactive deploy from CI with a token env var

export PORTALJS_TOKEN=arc_live_xxxxxxxx
/portaljs-deploy ./portals/city-budget --slug city-budget

Resources

Download now (ZIP)

Trending

Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data

Week of Aug 30: 0 new projectsWeek of Sep 6: 0 new projectsWeek of Sep 13: 0 new projectsWeek of Sep 20: 0 new projectsWeek of Sep 27: 0 new projectsWeek of Oct 4: 0 new projectsWeek of Oct 11: 0 new projectsWeek of Oct 18: 0 new projects
Aug 2026Sep 2026Oct 2026
New projects taking a version of this file each week, over the 8 weeks our latest run read: only 0 in all, so this is a hint, not a trend.

Who's talking about datopian/portaljs

The biggest 5 of 38 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 38

Talked about on GitHub and Hacker News (38 times).

On GitHub · 37

32 more on GitHub

On Hacker News · 1

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.