# Deploy Qwik

Qwik is detected from its dependencies and Vite config, and deploys as a static site: `npm run build` fills `dist/`, and the CDN serves it with [free bandwidth](/billing/pricing#static-sites). Qwik's resumability works from plain static files - the HTML carries the serialized state and hydrates nothing.

## Build

- **Output directory:** `dist` - override in [Build settings](/create/build-settings#output-directory) if your config moves it.
- **Install:** follows your lockfile - see [How detection works](/platform/frameworks#how-detection-works).

## Environment variables

Static builds run [with the environment's variables set](/platform/environment-variables#build-time-and-runtime). Qwik inlines `PUBLIC_*` values into the client build, per [environment](/platform/preview-environments).

> [!WARNING]
> Inlined values ship to every browser - never put secrets behind `PUBLIC_`.

## Server-side Qwik City?

Endpoints and server-rendered routes need a running server - deploy that shape as a Node container via your own start setup, or keep the site static and put the API in its own [backend app](/platform/frameworks#backend).

## Related

- [Build settings](/create/build-settings): Install, build, and output configuration.
- [Environment variables](/platform/environment-variables): Per-environment values at build time.
- [Custom domains](/platform/custom-domains): Your own hostname on the CDN.
