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