Skip to content

Next.js static export, live without a platform

With output: "export", next build leaves a complete static site in out/ — no Node server required. That folder is the whole deploy: one POST and it's a URL.

Drop your Next.js report here — get a live link

free, no account, live for 7 days.

The artifact dead-end

The default Next.js deploy story funnels you to a platform project with repo access, build minutes and a dashboard. For a static export, none of that is load-bearing — it's files.

Previewing a branch statically usually means wiring the repo to a provider, or asking a teammate to clone, install and build.

Two lines to a live link

Build your output like you already do, then hand the folder to the action:

Export statically

# next.config.ts → output: "export"
npx next build

.github/workflows/ci.yml

- uses: bitgate/ship-page-action@v1
  if: always()
  with:
    path: out/

Or with plain curl — no account needed

cd out && zip -qr - . | curl -fsS -X POST https://ship.page/deploy \
  -H "Content-Type: application/zip" \
  --data-binary @- | jq -r .url

path: out/ deploys exactly what the tool wrote — no detection to configure. The link goes in the job summary — add comment: true and it lands on the pull request too.

What you get

  • out/ deploys untouched — prerendered pages, _next assets and images resolve at the drop root
  • No runtime to match: a static export is plain files, served exactly as Next wrote them
  • name: pr-${{ github.event.number }} keeps one stable preview URL per PR that every push redeploys

Questions

What can't be statically exported?

Server features — API routes, server actions, dynamic rendering — need a Node runtime, and next build fails loudly if your app uses them with output: "export". This recipe is for the static subset.

How do routes map to files?

The export writes real .html files for every route — with trailingSlash, a folder with index.html per route. Plain static serving handles both shapes.

What about next/image?

Static exports use unoptimized images by default (or a custom loader) — they're plain files in out/, served as-is.

Try it on your next run

Anonymous deploys need no account and no key — paste the step, get a link. When you want stable URLs that redeploy in place, an API key and a name are all it takes.

Need to share the report with someone outside GitHub? How to share a GitHub Actions artifact without a login.