Skip to content

SvelteKit, fully static, on a URL in one step

With adapter-static and prerendering on, vite build writes your whole SvelteKit app as plain files in build/. That's the deploy: one POST, live URL.

Drop your SvelteKit report here — get a live link

free, no account, live for 7 days.

The artifact dead-end

SvelteKit's adapter list points at platforms — Node servers, edge runtimes, serverless. A fully prerendered app needs none of them; it's a static folder looking for a URL.

Sharing a preview usually means connecting the repo somewhere, or asking a teammate to npm install and build.

Two lines to a live link

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

Build with adapter-static

npm i -D @sveltejs/adapter-static
# vite.config.ts (new templates) or svelte.config.js:
#   swap adapter-auto → adapter-static
# src/routes/+layout.ts → export const prerender = true
npm run build

.github/workflows/ci.yml

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

Or with plain curl — no account needed

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

path: build/ 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

  • build/ deploys exactly as adapter-static wrote it — pages, assets and prerendered endpoints resolve at the drop root
  • Fully-static apps need no fallback: every route is a real file
  • In CI, path: build/ plus comment: true puts a preview link on every PR

Questions

Where does the adapter go these days?

Current sv templates configure the adapter inside vite.config.ts (passed to the sveltekit() plugin); older projects use svelte.config.js. Either way: adapter-static, plus export const prerender = true in a layout.

What about SPA fallback mode?

adapter-static can emit a fallback page, but drops serve files as-is with no rewrite rules — deep links won't be rewritten to it. Pure prerendering is the smooth path here.

How do dynamic routes work?

Prerender them: list entries in +page.ts (or prerender globally) so every dynamic page becomes a real file in build/.

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.