Litestar Vite connects the Litestar backend to a Vite toolchain. It supports SPA, Template, and Inertia flows, and can proxy Vite dev traffic through your ASGI port or run Vite directly.
- One-port dev: proxies Vite HTTP + WS/HMR through Litestar by default; switch to two-port with
VITE_PROXY_MODE=direct. - SSR framework support: use
proxy_mode="ssr"for Astro, Nuxt, SvelteKit - proxies everything except your API routes. - Production assets: reads Vite manifest from
public/manifest.json(configurable) and serves underasset_url. - Type-safe frontends: optional OpenAPI/routes export +
@hey-api/openapi-tsvia the Vite plugin. - Inertia support: v2 protocol with session middleware and optional SPA mode.
pip install litestar-viteimport os
from pathlib import Path
from litestar import Litestar
from litestar_vite import VitePlugin, ViteConfig, PathConfig
DEV_MODE = os.getenv("VITE_DEV_MODE", "true").lower() in ("true", "1", "yes")
app = Litestar(
plugins=[VitePlugin(config=ViteConfig(
dev_mode=DEV_MODE,
paths=PathConfig(root=Path(__file__).parent),
))]
)litestar run --reload # Vite dev server is proxied automaticallyScaffold a frontend: litestar assets init --template vue (or react, svelte, htmx, react-inertia, vue-inertia, angular, astro, nuxt, sveltekit).
from pathlib import Path
from litestar import Litestar
from litestar.contrib.jinja import JinjaTemplateEngine
from litestar.template import TemplateConfig
from litestar_vite import VitePlugin, ViteConfig, PathConfig
here = Path(__file__).parent
app = Litestar(
template_config=TemplateConfig(directory=here / "templates", engine=JinjaTemplateEngine),
plugins=[VitePlugin(config=ViteConfig(
dev_mode=True,
paths=PathConfig(root=here),
))],
)Requires session middleware (32-char secret).
import os
from pathlib import Path
from litestar import Litestar
from litestar.middleware.session.client_side import CookieBackendConfig
from litestar_vite import VitePlugin, ViteConfig, PathConfig
from litestar_vite.inertia import InertiaConfig
here = Path(__file__).parent
SECRET_KEY = os.environ.get("SECRET_KEY", "development-only-secret-32-chars")
session = CookieBackendConfig(secret=SECRET_KEY.encode("utf-8"))
app = Litestar(
middleware=[session.middleware],
plugins=[VitePlugin(config=ViteConfig(
dev_mode=True,
paths=PathConfig(root=here),
inertia=InertiaConfig(root_template="index.html"),
))],
)Use proxy_mode="ssr" to proxy non-API routes to the framework's dev server:
import os
from pathlib import Path
from litestar import Litestar
from litestar_vite import VitePlugin, ViteConfig, PathConfig, RuntimeConfig
here = Path(__file__).parent
DEV_MODE = os.getenv("VITE_DEV_MODE", "true").lower() in ("true", "1", "yes")
app = Litestar(
plugins=[
VitePlugin(config=ViteConfig(
dev_mode=DEV_MODE,
paths=PathConfig(root=here),
runtime=RuntimeConfig(proxy_mode="ssr"),
))
],
)| Mode | Alias | Use Case |
|---|---|---|
vite |
- | SPAs - proxies Vite assets only (default) |
direct |
- | Two-port dev - expose Vite port directly |
proxy |
ssr |
Meta-frameworks - proxies everything except API routes |
Astro (static): Astro generates static HTML by default. Build and serve with Litestar:
litestar --app-dir examples/astro assets install
litestar --app-dir examples/astro assets build
VITE_DEV_MODE=false litestar --app-dir examples/astro runNuxt/SvelteKit (SSR): These run their own Node servers. Deploy as two services:
# Terminal 1: SSR server
litestar --app-dir examples/nuxt assets build
litestar --app-dir examples/nuxt assets serve
# Terminal 2: Litestar API
VITE_DEV_MODE=false litestar --app-dir examples/nuxt run --port 8001VitePlugin(config=ViteConfig(types=True)) # enable exportslitestar assets generate-types # one-off or CIlitestar assets doctor— diagnose/fix configlitestar assets init --template react|vue|svelte|...— scaffold frontendlitestar assets build/serve— build or watchlitestar assets deploy --storage gcs://bucket/assets— upload via fsspeclitestar assets generate-types— OpenAPI + routes → TS typeslitestar assets install— install frontend deps with the configured executor
- Prints Python vs Vite config snapshot (asset URLs, bundle/hot paths, ports, modes).
- Flags missing hot file (dev proxy), missing manifest (prod), type-gen exports, env/config mismatches, and plugin install issues.
--fixcan rewrite simple vite.config values (assetUrl, bundleDirectory, hotFile, type paths) after creating a backup.
- Docs: https://litestar-org.github.io/litestar-vite/
- Examples:
examples/(react, vue, svelte, react-inertia, vue-inertia, astro, nuxt, sveltekit, htmx) - Issues: https://github.com/litestar-org/litestar-vite/issues/