Framework guides
Deploy a framework app on Lizard from source. Choose your framework and rendering mode below, prepare its production build, then deploy with Lizard CLI or connect a GitHub repository. Server apps run a process; static sites serve the generated files through nginx.
Choose your framework
These settings describe the standard project layouts in the linked guides. Commands assume npm for JavaScript projects. Custom output paths, adapters, and build overrides can change the result. To bring your own image instead, see Deploy a Docker container from a Dockerfile.
| Framework | Build | Runtime or output | Service port |
|---|---|---|---|
| Next.js | npm run build | next start through the start script | 3000 |
| Next.js static export | npm run build | out/ through a Dockerfile | 80 |
| React with Vite | npm run build | dist/ | 80 |
| Vue with Vite | npm run build | dist/ | 80 |
| Astro | npm run build | dist/, or the standalone Node adapter | 80 static; 3000 server |
| Nuxt | npm run build | node .output/server/index.mjs | 3000 |
| SvelteKit | npm run build | node build with adapter-node | 3000 |
| Node.js (Express) | build script, if any | start script | 3000 |
| FastAPI | Install Python dependencies | uvicorn main:app --host 0.0.0.0 --port 8000 | 8000 |
| Django | Install Python dependencies | Gunicorn with your WSGI module | 8000 |
| Streamlit | Install Python dependencies | streamlit run app.py from a Procfile | 8501 |
| Go | go build to a static binary | /app/server | 8080 |
| Ruby on Rails | The Dockerfile Rails generates | Thruster and Puma, or Puma alone | 8080 on Rails 8; 3000 on Rails 7.1 and 7.2 |
| Docusaurus | npm run build | build/ | 80 |
| VitePress | npm run docs:build | docs/.vitepress/dist/ in this guide | 80 |
| Hugo | hugo --minify | public/ | 80 |
Prepare the project
Run commands from the application directory. Commit source files, configuration, and the package lockfile. Exclude .env, local dependencies, and local build output from uploads. Node projects can select the Node major version in .nvmrc; the current default is 22. This selects a major version, not an exact patch release. Runtime versions lists the version files for Node.js, Python, Go and Ruby.
Install Lizard CLI and sign in once:
curl -fsSL https://lizard.build/install.sh | bash
lizard loginOn Windows, run irm https://lizard.build/api/cli/install.ps1 | iex in PowerShell. A new account starts on no plan: until you start the 7-day Pro trial (card required), lizard add and lizard up return a Checkout link. lizard billing start opens it.
Each guide uses a new project and a service named web or api. lizard up --service web creates web if it does not exist yet, so check the name: a typo creates a second service. The guides run lizard add --service web (or api) first; you need that step only to set secrets or a domain before the first deploy. For an existing project, check lizard status --json and lizard ps --json before deploying. The port must match the process inside the container, which must listen on 0.0.0.0.
Lizard CLI 0.3.95 and later exclude macOS archive metadata during uploads. No COPYFILE_DISABLE setting is needed. Update older CLI versions before following these guides.
Choose GitHub or local source
The guide commands use lizard up to upload the current folder. That command changes an existing service to upload source. To keep git push to deploy, connect GitHub instead and use the guide’s build settings in the repository. Configure the service port from the table: nginx for a Vite, Astro, SvelteKit, Docusaurus or VitePress build listens on the port you set, or on 3000 if you set none.
Keep build settings consistent
These guides use lizardpack detection unless they call for a Dockerfile. Existing buildCommand or startCommand overrides take precedence over detection and the repository Dockerfile; a set dockerfilePath takes precedence over both. Check build decision order before switching build methods. Set scripts in package.json when a guide tells you to; adding a CLI override is a different build path.
Check a release
Read build logs, runtime logs, and the active URL. Test an inner route, a missing route, and any API or form action. A process that opens its port can still serve a broken page. For generated sites, use static routes and 404s to avoid returning the home page with HTTP 200 for every unknown URL.
Check shared caches, persistent local files and framework versions separately from runtime support. See limits, storage and recovery, and known issues when your app relies on those features.
See tested versions and cloud results for the September 9, 2026 deployment checks and their limits.
Updated