Deploy Remix on Your Own Server
Deploy Remix and your loaders, actions, and server rendering run without cold starts — Temps runs your app as a persistent Node.js process with automatic HTTPS on infrastructure you own.
Quickstart
From your project root, deploy with your preferred package manager:
npx @temps-sdk/cli up
Remix needs the Autopack (Node.js) preset (nixpacks-node), which runs your app as a Node.js server:
npx @temps-sdk/cli up --preset nixpacks-node
Or pick it under Project → Settings → Build & deploy → Build → Framework.
A Vite-based Remix app has a vite.config.js or vite.config.ts, so Temps detects it as the static Vite preset. That preset only serves files from dist/ and can't run the Remix server, so switch the project to Autopack (Node.js). A classic remix.config.js project isn't detected at all and needs the same preset.
With Autopack (Node.js), Temps runs your build script, then starts the app with your start script (for example remix-serve ./build/server/index.js). A web: line in a Procfile takes priority over the start script. The Node.js version comes from .nvmrc, .node-version or engines.node in package.json, and defaults to 24.
What Temps handles automatically
| Feature | How Temps handles it |
|---|---|
| Build | Your build script (for example npm run build) |
| Start | Your start script, or a Procfile web: line |
| HTTPS | Let's Encrypt, auto-renewed |
| Port | PORT env var injected, defaults to 3000 |
| Loaders and actions | Fully supported via Node.js runtime |
| No cold starts | Persistent Node.js process |
| Preview deployments | Opt-in; once enabled, each branch gets its own preview environment |
Managed PostgreSQL
Remix apps need a database for session storage and application data. Create a PostgreSQL database under Databases → Create database, then link it from your project's Databases page. Temps injects the connection string as POSTGRES_URL, so point Prisma or Drizzle at that variable (for Prisma, url = env("POSTGRES_URL")). See Deploy with a Database.
Temps doesn't run migrations for you. Run them yourself, for example from CI, or as part of your start script:
npx prisma migrate deploy
Environment variables
npx @temps-sdk/cli environments vars set SESSION_SECRET "your-secret" -e production
Platform behavior
These rules apply to every app deployed on Temps, regardless of framework.
The one requirement: your app must listen on the port in the PORT environment variable and bind to 0.0.0.0 — not localhost or 127.0.0.1. Temps runs your app in a container and routes traffic from the host, so an app bound to localhost only accepts connections from inside the container and will fail its health check.
Health checks
After your container starts, Temps sends HTTP GET requests to verify it is healthy before routing traffic to it.
- Path:
/(the root of your application) - Success: 2 consecutive responses with a 2xx or 3xx status code
- Timeout: 300 seconds (5 minutes) for the app to become healthy
- Retry interval: every 5 seconds
Connection errors while the app is still starting are retried without penalty. If the app returns 4xx or 5xx errors for 60 consecutive seconds, the deployment fails. Customize the check by adding a .temps.yaml to your repository root:
health:
path: /health
status: 200
interval: 30
timeout: 5
retries: 3/health endpoint that returns a simple 200. This avoids issues where / requires authentication or returns a redirect.Auto-injected environment variables
Temps injects these variables into every deployment automatically:
| Variable | Value | Description |
|---|---|---|
PORT | Resolved port | The port your app must listen on |
HOST | 0.0.0.0 | Bind address |
SENTRY_DSN | Auto-generated | Error tracking endpoint |
TEMPS_API_URL | Your Temps URL | Platform API endpoint |
TEMPS_API_TOKEN | Deployment token | Authentication for Temps SDKs |
OTEL_EXPORTER_OTLP_ENDPOINT | Your Temps OTLP URL | OpenTelemetry trace collection |
OTEL_SERVICE_NAME | Project name | Service identifier for traces |
You do not need to configure these manually. They are available in process.env (Node.js), os.environ (Python), os.Getenv (Go), and the equivalent in other languages.