# Deploy an app built with v0

v0 exports a **Next.js** app (App Router, TypeScript, Tailwind). It runs on Salus as a long-lived Node.js server, built with buildpacks from your repository. It needs **two settings**: a build flag, and the port Next.js listens on.

This guide was tested on Salus with a Next.js 16 app laid out as v0 exports it, at the root of its repository.

## Before you begin

-   A Salus account. [Start free](https://app.salus.cloud/register).
-   **GitHub or GitLab connected** to your Salus organization. See [Git Management](https://salus.cloud/docs/getting-started/git-management/).
-   The v0 project pushed to a GitHub repository, with the app at the root.

### Build with webpack

Next.js 16 builds with Turbopack by default, and Turbopack stops at the way Salus buildpacks install `node_modules`. Build with webpack instead, in `package.json`:

```json
{
  "scripts": {
    "build": "next build --webpack",
    "start": "next start"
  }
}
```

The app behaves the same; only the bundler changes. To keep Turbopack, build from a [Dockerfile](https://salus.cloud/docs/pipelines/builds/custom-docker/) instead, where it works.

### Deploy on port 3000

`next start` listens on port **3000**, and Salus doesn’t pass a `PORT` variable, so set the port to 3000. Ask your coding agent, once it’s [connected to Salus](https://salus.cloud/docs/guides/deploy-with-an-ai-agent/):

```text
Deploy this repository to Salus in the Production environment.
It's a Next.js app listening on port 3000. Give me the URL when it's live.
```

In the console, create the project from the repository as a **server-side application** and set the port to `3000`. See [Configure an Environment](https://salus.cloud/docs/deployments/environment-configurations/configuring/).

### Move the variables, and replace Vercel-only storage

Add every variable the app reads (API keys, `NEXT_PUBLIC_` values) to the Salus project. `NEXT_PUBLIC_` variables are read when the app builds, so make those **build-time** variables; the rest are **runtime** variables, with keys marked as secrets. See [Environment Variables](https://salus.cloud/docs/deployments/environment-configurations/variables/).

If the app uses Vercel’s storage, keep or replace it:

-   **Postgres:** [create a database on Salus](https://salus.cloud/docs/deployments/databases/provisioning/), link it to the project, and point the app at `SALUS_DATABASE_<NAME>_CONNECTION_STRING`. The data doesn’t move with the app; copy it with `pg_dump`.
-   **KV and Blob:** Salus has no key-value store or file storage today. Keep using the provider’s service with its tokens as runtime secrets, or store the data in PostgreSQL.
-   **Vercel Analytics** does nothing outside Vercel; remove it or keep it, either works.

## Troubleshooting

-   **The build fails with “Symlink node\_modules could not be resolved”.** That’s Turbopack: add `--webpack` to the build script (step 1).
-   **The pipeline passed but the URL returns 502.** The port is wrong. `next start` listens on 3000 unless your start script sets another port; make the release configuration match, and redeploy.
-   **A `NEXT_PUBLIC_` value is missing in the browser.** It was added as a runtime variable. Add it as a **build-time** variable and redeploy.
-   **The app keeps restarting.** Check its logs. New deployments start with 128 MB, which was enough for a small app in testing; raise the memory if the logs show it running out.
