Menu
svelte-smol docs

These are the canary docs, read from main: they can describe changes no release has shipped yet. Read the v1.8.4 docs.

Getting Started

Turn a SvelteKit app into a single standalone executable in a few minutes.

#1. Install

bun add -d @orochibraru/svelte-smol

#2. Configure the adapter

// svelte.config.js
import adapter from "@orochibraru/svelte-smol";

export default {
  kit: {
    adapter: adapter(),
  },
};

See Adapter options for everything adapter() accepts.

#3. Build under Bun

The compile step calls Bun.build, so the build must run on the Bun runtime, not Node. Either force it per command:

bun --bun vite build

or once for the project with a bunfig.toml, after which a plain bun run build works:

[run]
bun = true

Loading the config alone works under Node, so svelte-check, the Svelte language server and svelte-kit sync are unaffected.

#4. Run it

build/
├── server        # the compiled executable
├── healthcheck   # tiny probe binary, see Health check
├── client/       # static assets, served by the executable
└── prerendered/  # prerendered pages, served by the executable
./build/server

The executable finds client/ and prerendered/ relative to its own path, so it runs from any working directory. It listens on 0.0.0.0:3000 by default — see Environment variables to change that.

#What's supported

WebSockets, read() from $app/server, prerendering, Server-Sent Events and server instrumentation (instrumentation.server.ts) all work. The one thing a compiled binary can't embed is a native (.node) addon — see Native addons.

This guide lives in the project repo: edit it there, and this page follows within a day.