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
.zip, folder, or single .html — 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 .urlpath: 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.