> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sevalla.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These are the docs for Sevalla, a platform for deploying applications, databases, static sites, object storage and load balancers. The dashboard is at https://app.sevalla.com.
> Bold text in steps is an exact dashboard label.
> To act on a Sevalla account, prefer the Sevalla MCP server (https://mcp.sevalla.com/mcp, see https://docs.sevalla.com/ai-agents/overview.md), then the Sevalla CLI (https://docs.sevalla.com/developer-tools/cli.md), then the REST API (https://api-docs.sevalla.com, OpenAPI spec at https://api.sevalla.com/v3/openapi.json).
> Every page index is at https://docs.sevalla.com/llms.txt.

# Deploy Remix

> Deploy a Remix 3 application to Sevalla from a Git repository with its own Node.js server, or a React Router application upgraded from Remix 2.

A Remix 3 application runs on Sevalla as an application: Nixpacks installs it from your Git repository, and the web process runs the starter's `server.ts` with Node.js, which listens on the port that Sevalla sets in the `PORT` environment variable. Remix 2 applications continue as React Router: see [Deploy a React Router application](#deploy-a-react-router-application).

## Before you begin

* A Sevalla company with a payment method, and a GitHub, GitLab or Bitbucket account for the repository. See [Git providers](/git/overview).
* Node.js 24.3 or later on your computer. Remix 3 needs it.

## Create the project

Create a project with the Remix CLI and install its dependencies:

```bash theme={null}
npx remix@latest new storefront
cd storefront
npm install
```

The starter comes with a `.gitignore` and the scripts Sevalla uses. Its `start` script runs the TypeScript server directly, with no build step:

```json package.json theme={null}
{
  "scripts": {
    "start": "NODE_ENV=production node --import remix/node-tsx server.ts"
  },
  "engines": {
    "node": ">=24.3.0"
  }
}
```

## Prepare the project for Sevalla

The starter is ready to deploy:

* `server.ts` takes its port from [`PORT`](/guides/javascript/overview#listen-on-the-port-environment-variable), which Sevalla sets to the web process's port (`8080` by default), and `server.listen(port)` listens on all network interfaces. Without `PORT`, it uses port `44100`.
* Nixpacks, the default [build strategy](/applications/builds/nixpacks), starts the web process with `npm run start`. The project has no `build` script, so Nixpacks skips the build step.
* The starter's `engines` field makes Nixpacks install Node.js 24 (24.10.0) instead of its default, Node.js 18.

Run `npm start` and open `http://localhost:44100` to check the server locally. Then commit everything, including `package-lock.json`, and push it to your Git provider:

```bash theme={null}
git init
git add .
git commit -m "Prepare for Sevalla"
git branch -M main
git remote add origin https://github.com/acme/storefront.git
git push -u origin main
```

## Deploy to Sevalla

<Steps>
  <Step title="Create the application">
    In the sidebar, click **Applications**, then click **Create** > **Application**. Under **Source**, click **Private repository**, then choose the **Git provider**, the **Repository** and the **Branch**. Under **Location**, choose a **Data center**. Keep the **Size** at **H1** or choose a larger one, then click **Create application**. The application opens on its **Overview** tab with the status **Not deployed yet**: creating an application doesn't deploy it.
  </Step>

  <Step title="Deploy">
    Click the **Overview** tab, then click **Deploy now** under **Recent deployments**. Check the **Branch** and click **Deploy**.
  </Step>

  <Step title="Turn on auto-deploy">
    To deploy every push to the branch automatically, click the **Settings** tab, then click **Update auto-deploy** in the **Auto-deploy** section. Turn on **Auto-deploy** and click **Update auto-deploy**. See [Deployments](/applications/deployments#deploy-automatically-on-push).
  </Step>
</Steps>

## Verify the deployment

1. On the **Deployments** tab, wait for the deployment's status to change to **Deployed**. The application's status next to its name changes to **Running**.
2. Click the domain under the application's name, for example `storefront-x7k2m.sevalla.app`. The Remix starter's home page opens.

<Frame>
  <img className="block dark:hidden" src="https://assets.sevalla.com/screenshots/light/app-overview-address.png" alt="The application header with its name, Running status, repository, branch and the domain that opens the application" width="1192" />

  <img className="hidden dark:block" src="https://assets.sevalla.com/screenshots/dark/app-overview-address.png" alt="The application header with its name, Running status, repository, branch and the domain that opens the application" width="1192" />
</Frame>

If the deployment fails, open it on the **Deployments** tab and read its build log, then see [Troubleshoot builds and deployments](/applications/troubleshooting/builds-and-deployments). If the server doesn't start, read the application's [runtime logs](/applications/logs).

## Deploy changes

With **Auto-deploy** on, every push to the branch starts a deployment; otherwise, click **Deploy now** for each change. Each deployment builds the image, then replaces the web process's instances. See [Deployments](/applications/deployments).

## Store sessions and files outside the instance

Remix's memory session storage and local upload folders only work while one instance runs and until the next deployment. Use Remix's Redis session storage with a Sevalla [Redis database](/guides/javascript/redis), and its S3 file storage with Sevalla [object storage](/guides/javascript/object-storage), before you run more than one instance.

## Deploy a React Router application

Remix 2 continued as React Router, so an application upgraded from Remix 2, or created with `create-react-router`, uses React Router's server:

```bash theme={null}
npx create-react-router@latest storefront
cd storefront
npm pkg set engines.node="24.x"
```

* `npm run build` runs `react-router build`, and the `start` script runs `react-router-serve ./build/server/index.js`. `react-router-serve` takes its port from `PORT` and listens on all network interfaces.
* `engines.node` makes Nixpacks install Node.js 24 instead of Node.js 18. React Router 8 needs Node.js 22.22 or later.
* Nixpacks doesn't treat the project as a single-page app, because it depends on `@react-router/node`.

Commit and push the project, then follow the steps in [Deploy to Sevalla](#deploy-to-sevalla). The starter's home page opens on the application's domain. A Remix 2 application that still uses `@remix-run/*` packages deploys the same way: its `start` script runs `remix-serve`, which also reads `PORT`.

## Add a custom domain

To serve the application from your own domain, such as `shop.example.com`, add the domain on the application's **Domains** tab and create the DNS records that Sevalla shows. Custom domains need a web process larger than **H1**, so [scale](/applications/scaling) the web process first. See [Custom domains](/domains/overview).

## Connect a database

Create a [database](/databases/create) in the same location as the application, then [connect the application to it](/databases/connect#connect-an-application) with **Add environment variables to the application** turned on. Sevalla adds `DB_URL`, `DB_HOST`, `DB_PORT`, `DB_DATABASE`, `DB_USERNAME` and `DB_PASSWORD` to the application ([what each one holds](/databases/connect#environment-variables-an-internal-connection-adds)), and they apply at the next deployment. Read them in `server.ts` or in actions with `process.env.DB_URL`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.