LiveSvelte uses Vite for both client and SSR builds, replacing the default esbuild setup in Phoenix projects.
Prerequisites
- Node.js 19+ or Bun — for package management and Vite builds. Production SSR (when using
LiveSvelte.SSR.NodeJS) still requires Node.js 19+ on the server. - Elixir 1.17+
- Phoenix 1.8+ — required for the Igniter installer
- Igniter — the installation scaffolding tool
Quick Start (Recommended)
Step 1: Install the Igniter archive
mix archive.install hex igniter_new
Step 2: Add LiveSvelte to your project
For an existing Phoenix 1.8+ project:
mix igniter.install live_svelte
For a new project with LiveSvelte pre-installed:
mix igniter.new my_app --with phx.new --install live_svelte
Using Bun
To use Bun instead of Node.js/npm for package management and Vite:
- Existing project:
mix igniter.install live_svelte --bun - New project:
mix igniter.new my_app --with phx.new --install live_svelte --bun
After install, mix assets.setup and mix assets.build use Bun (e.g. bun install, phoenix_vite's Bun task) instead of npm.
Step 3: Install JS dependencies and build
mix assets.setup # phoenix_vite.npm assets install (or: mix setup)
mix assets.build
mix phx.server
Visit /svelte_demo to verify the installation with the generated demo component.
What the Installer Does
Running mix igniter.install live_svelte makes the following changes to your project:
package.json (at project root) — the installer moves it from assets/ and adds:
live_svelte,phoenix_vite: "file:./deps/phoenix_vite"(dev), and Svelte-related deps
config/config.exs — adds config :phoenix_vite, PhoenixVite.Npm, ... (when using --bun, the installer configures PhoenixVite.Bun and Bun-based aliases instead).
assets/vite.config.mjs — adds the Svelte plugin, liveSveltePlugin, and ssr: { noExternal: ... }. A single config is used for both client and SSR builds (no separate vite.ssr.config.js); the SSR build is run via phoenix_vite.npm vite build --ssr js/server.js --outDir ../priv/svelte.
assets/js/app.js — adds hook wiring:
import { getHooks } from "live_svelte"
import Components from "virtual:live-svelte-components"
const liveSocket = new LiveSocket("/live", Socket, {
hooks: getHooks(Components),
// ...
})lib/app_web.ex — adds import LiveSvelte to html_helpers
lib/app/application.ex — adds a conditional NodeJS supervisor that only starts in production (where ssr_module is LiveSvelte.SSR.NodeJS):
node_js_children =
if Application.get_env(:live_svelte, :ssr_module, nil) == LiveSvelte.SSR.NodeJS do
[{NodeJS.Supervisor, [path: LiveSvelte.SSR.NodeJS.server_path(), pool_size: 4]}]
else
[]
end
children = node_js_children ++ [...]config/config.exs — base SSR config:
config :live_svelte, ssr: trueconfig/dev.exs — the installer composes phoenix_vite.install first, which adds to your endpoint the Vite dev server watcher and static_url so that assets and HMR are served from Vite (port 5173). LiveSvelte then adds the live_svelte app config. Together this gives you instant Svelte/CSS HMR when you run mix phx.server:
# From phoenix_vite.install (required for HMR):
config :my_app, MyAppWeb.Endpoint,
static_url: [host: "localhost", port: 5173],
watchers: [
vite: {PhoenixVite.Npm, :run, [:vite, ~w(dev)]}
]
# From live_svelte.install (development SSR):
config :live_svelte,
ssr_module: LiveSvelte.SSR.ViteJS,
vite_host: "http://localhost:5173"If you add LiveSvelte or phoenix_vite manually (e.g. without running the Igniter installer), you must add the endpoint’s static_url and :vite watcher to config/dev.exs yourself; otherwise the layout will serve built assets and Svelte changes will not hot-reload.
config/prod.exs — production SSR via NodeJS:
config :live_svelte,
ssr_module: LiveSvelte.SSR.NodeJS,
ssr: truemix.exs — adds phoenix_vite-driven aliases: assets.setup, assets.build (client + SSR via phoenix_vite.npm vite build):
"assets.setup": ["phoenix_vite.npm assets install"],
"assets.build": [
"phoenix_vite.npm vite build --manifest --emptyOutDir true",
"phoenix_vite.npm vite build --ssrManifest --emptyOutDir false --ssr js/server.js --outDir ../priv/svelte"
]assets/svelte/ — creates the Svelte components directory with a demo component
assets/css/app.css — adds @source "../svelte/**/*.svelte"; if Tailwind is present (a bare directory path does not include .svelte files by default)
.gitignore — adds /assets/svelte/_build/ and /priv/svelte/
Phoenix Version Requirement
The Igniter installer requires Phoenix 1.8+. The library itself works with Phoenix 1.7+ when installed manually.
Manual Installation
Manual Installation Not Recommended
Manual installation steps are complex and kept out-of-date as dependencies evolve. We strongly recommend using mix igniter.install live_svelte instead.
If you must install manually (e.g. Phoenix < 1.8), follow the Option B — Manual installation steps in the README. Those steps are the authoritative reference and kept up to date.
Using Bun with manual installation
To use Bun instead of npm when installing manually:
- Add the optional dependency in
mix.exs:{:bun, ">= 1.5.1 and < 2.0.0-0"} - In
config/config.exs, useconfig :phoenix_vite, PhoenixVite.Bun, ...(with the same options you would use forPhoenixVite.Npm; see phoenix_vite for the Bun API). - In
mix.exsaliases, usephoenix_vite.buninstead ofphoenix_vite.npm:"assets.setup": ["phoenix_vite.bun assets install"]"assets.build": same twophoenix_vite.bun vite build ...commands as in the npm version.
- In
config/dev.exswatchers, usevite: {PhoenixVite.Bun, :run, [:vite, ~w(dev)]}.
Production SSR still uses Node.js (LiveSvelte.SSR.NodeJS); the server must have Node.js 19+ installed.
Disabling SSR
If you don't need server-side rendering, disable it globally:
# config/config.exs
config :live_svelte, ssr: falseOr per-component:
<.svelte name="Counter" props={%{count: @count}} socket={@socket} ssr={false} />Next Steps
- Basic Usage — your first
<.svelte>component - Configuration — all config options