Deploy / Remix
Deploy Remix to Your Own Server
To deploy Remix, or its successor React Router v7 in framework mode, to your own server, install Temps on a Linux VPS and run up --preset nixpacks-node from the project root. Temps runs your build and starts the app with your start script (remix-serve or react-router-serve) as a persistent Node.js process behind automatic HTTPS. Without that preset, a Vite-based Remix or React Router v7 app is detected as a static site and deploys without its server.
Last updated
Preset required
Choose the Autopack (Node.js) preset (nixpacks-node). A Vite-based Remix or React Router v7 app has a vite.config.*, so Temps detects it as the static Vite preset, which can't run the server; a classic remix.config.js project isn't detected at all.
How to deploy Remix with Temps
Commands run on your machine unless they say otherwise. The CLI runs with bunx or npx.
- 1
Install Temps on a Linux server
On a VPS with at least 2 CPU cores and 4 GB of RAM, download the installer, read it, then run it. It installs Docker if needed, the Temps binary and its database, and asks how the console is reached: an sslip.io address or your own domain.
curl -fsSL https://temps.sh/deploy.sh -o deploy.sh less deploy.sh bash deploy.sh
- 2
Log in from your machine
Point the CLI at your Temps console. It opens a browser to approve the login.
bunx @temps-sdk/cli login https://console.example.com
- 3
Check the start script
Temps starts the app with your
startscript. On React Router v7 the default template's scripts already work:react-router buildandreact-router-serve ./build/server/index.js.package.json"scripts": { "build": "remix vite:build", "start": "remix-serve ./build/server/index.js" } - 4
Read the database URL Temps injects
Linked PostgreSQL arrives as
POSTGRES_URL, notDATABASE_URL.schema.prismadatasource db { provider = "postgresql" url = env("POSTGRES_URL") } - 5
Deploy Remix
From the project root, run
upwith the preset, or set it under Project → Settings → Build & deploy → Build → Framework. If the directory isn't linked to a project yet,upwalks you through creating one first. For a project created from a Git repository, pushes to the tracked branch deploy automatically.bunx @temps-sdk/cli up --preset nixpacks-node
- 6
Create and link a PostgreSQL database
Temps doesn't create a database for you. Create one, then link it to the project (or use Databases → Create database in the dashboard). Linking injects
POSTGRES_URLplusPOSTGRES_HOST,POSTGRES_PORT,POSTGRES_DB,POSTGRES_USERandPOSTGRES_PASSWORDinto the next deployment. It doesn't injectDATABASE_URL.bunx @temps-sdk/cli services create -t postgres -n my-remix-app-db bunx @temps-sdk/cli services link --id <service-id> -p my-remix-app
- 7
Run migrations yourself
Temps doesn't run them. Run
prisma migrate deploy(or your tool's equivalent) after deploys that change the schema, from CI or in the running container.
How Temps builds and runs Remix
Every app runs in a Docker container on your server, behind the Temps proxy. Before traffic switches to a new deployment, Temps health-checks it; if the check fails, the deployment is marked failed and the current version keeps serving.
| Build | Your build script (remix vite:build, or react-router build on React Router v7) |
|---|---|
| Start | Your start script (remix-serve ./build/server/index.js, or react-router-serve ./build/server/index.js on React Router v7), or a Procfile web: line |
| Node.js | From .nvmrc, .node-version or engines.node; defaults to 24 |
| Port | Temps injects PORT |
What works with Remix on Temps
- SSR with loaders and actions
- React Router v7 framework mode, deployed the same way
- Persistent Node.js process, no cold starts
- Managed PostgreSQL you link
- Health check before each cutover
- Preview environments per branch (opt-in)
Managed services for Remix
Temps runs these services on your server. Create one, link it to the project, and its connection variables reach the next deployment. Set up managed services.
PostgreSQL
Injects POSTGRES_URL once linked; point Prisma or Drizzle at it
Environment variables for Remix
Set your own with environments vars set or in the project settings; values are encrypted at rest.
| Variable | What it does |
|---|---|
| SESSION_SECRET | Secret for cookie sessions |
| POSTGRES_URL | Injected when PostgreSQL is linked |
| PORT | Set by Temps |
What it costs to self-host Remix
Temps is free to self-host under MIT / Apache 2.0, with no per-seat fee and nothing metered, so hosting Remix costs what the server costs. A Hetzner CX23 (2 shared vCPU, 4 GB RAM, 40 GB NVMe, 20 TB traffic) meets the minimum Temps needs and is €5.49/month excluding VAT, plus €0.50/month for an IPv4 address; Hetzner sells it in Germany and Finland only. Prices checked October 10, 2026.
| Temps | Free and open source (MIT / Apache 2.0) |
|---|---|
| Server | Hetzner CX23: €5.49/month excluding VAT, plus €0.50/month for IPv4 |
| What Remix runs | One Node.js container, plus the managed PostgreSQL you link, on the same server. |
| Observability | Web analytics, error tracking, session replay and uptime monitoring are included and run on the same server |
| Temps Premium | Optional: $399 per organisation per month for SAML SSO, SCIM, custom roles, approval gates and a tamper-evident audit log |
For one to three production apps, the server guide recommends 4 vCPU and 8 GB RAM: a Hetzner CX33 is €8.49/month excluding VAT. Any Linux VPS that meets the minimum works; sizes and other providers are in Choosing a server. For what the same app costs on Vercel, see Temps vs Vercel.
Remix on Temps: frequently asked questions
Why does my Remix app deploy without loaders or actions?
A Vite-based Remix app is detected as the static Vite preset, which serves files only. Switch the project to Autopack (Node.js) with up --preset nixpacks-node, or under Project → Settings → Build & deploy → Build → Framework, and deploy again.
Does Temps run Prisma migrations for my Remix app?
No. Run prisma migrate deploy yourself after a deploy that changes the schema, for example from CI.
Can I deploy React Router v7 framework mode the same way?
Yes. React Router v7 is the continuation of Remix v2, and its framework mode deploys the same way. Use the same Autopack (Node.js) preset (nixpacks-node): Temps runs react-router build, then your start script (react-router-serve ./build/server/index.js), which reads the PORT Temps injects. A React Router v7 app also has a vite.config.ts, so switch it off the static Vite preset it's detected as.
Included with every Temps project
Deployments, analytics, error tracking, session replay and uptime monitoring run in the same self-hosted platform, so your Remix app doesn't need separate subscriptions for them.
Automatic HTTPS
Let's Encrypt certificates for every domain, issued and renewed for you.
Preview deployments
Turn on preview environments and each branch gets its own URL on your domain.
Web analytics
First-party analytics stored on your server. Add the React provider or a script tag.
Error tracking
Sentry-compatible: any Sentry SDK can report to the SENTRY_DSN Temps injects.
Session replay
Off by default. When on, it records the DOM with every input masked.
Uptime monitoring
HTTP monitors for your apps, with alerts through your notification channels.
Related guides
- Every setting for this stack is in the Remix deployment reference.
- Which stacks are detected and which need a preset is listed in supported languages and frameworks.
- How health checks, cutover and rollbacks work is covered in Deployments.
- The React Router v7 scripts and settings are in React Router v7 (framework mode).
- Leaving Vercel? See Temps vs Vercel.
- Coming from Fly.io? See Temps vs Fly.io.
Deploy another framework
Deploy Remix on a server you own
Temps is free and open source to self-host (MIT / Apache 2.0). You pay only for the server.