# Portaljs Deploy

Deploy a PortalJS portal to PortalJS Arc, Datopian-managed static hosting on Cloudflare.

- Repository: https://github.com/datopian/portaljs (2370 stars)
- Category: DevOps
- License: MIT
- Last updated: 2026-10-28
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add datopian/portaljs --skill portaljs-deploy -g -a claude-code -y`
Codex: `npx skills add datopian/portaljs --skill portaljs-deploy -g -a codex -y`
Cursor: `npx skills add datopian/portaljs --skill portaljs-deploy -g -a cursor -y`
Gemini CLI: `npx skills add datopian/portaljs --skill portaljs-deploy -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add datopian/portaljs`

## Description

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.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 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`](https://github.com/datopian/portaljs/blob/main/.claude/commands/portaljs-deploy.md), the
single source of truth. Read and follow it when executing. Summary:

The rest: https://github.com/datopian/portaljs/blob/HEAD/skills/portaljs-deploy/SKILL.md
