Skip to main content
Railpack is the open-source successor to Nixpacks from Railway: it detects your application’s language and framework from the repository and builds a container image with BuildKit, with no configuration. On Sevalla, Railpack is in beta (the dashboard labels it Beta) and builds with Railpack 0.30.0. New applications still default to Nixpacks.

How Railpack builds your application

Railpack reads the files in the build path to detect the language, installs the language versions it needs with Mise, and builds in steps (install, build) before setting the start command. Sevalla doesn’t let you pick a Railpack version: every application uses the one Sevalla runs. If the web process has a start command on the Processes tab, Sevalla passes it to Railpack as RAILPACK_START_CMD and runs it instead of the detected one.

Supported languages

Railpack detects Node.js (with npm, Yarn, pnpm or Bun), Python, Go, PHP, Java, Ruby, .NET, Deno, Rust and Elixir, among others. The Railpack documentation describes each language. For anything it doesn’t detect, use a Dockerfile.

Use Railpack

1

Open the build strategy

In the sidebar, click Applications, then click the application. On the Settings tab, in the Build strategy section, click Update build strategy.
2

Choose Railpack

Click Railpack. Set the Build path if the application isn’t at the repository root.
3

Save and deploy

Click Update build strategy, then deploy the application.
The Builder in the Build strategy section shows Railpack with the Beta label, and the next deployment’s build log shows Railpack’s build plan.

Set the language version

Without a version in your repository, Railpack uses its own default for the language. Railpack reads Mise version files (.tool-versions, mise.toml) for most languages, and the files in this table. Environment variables must be marked Available during buildtime. Railpack detects the Node.js package manager from the packageManager field in package.json, then from the lock file, and falls back to npm. For Python it supports pip, Poetry, PDM, uv and Pipenv. For PHP extensions, set RAILPACK_PHP_EXTENSIONS (for example gd,imagick,redis) or require them in composer.json.

Configure the build

Most applications build with no configuration. To change a step, add a railpack.json file to the build path:
railpack.json
The $schema line gives you autocomplete and validation in your editor. The Railpack configuration reference lists every key. Environment variables marked Available during buildtime change the build too: Sevalla passes build-time variables to Railpack’s build as BuildKit secrets. A start command set on the web process wins over railpack.json and RAILPACK_START_CMD. Railpack also takes the start command from a Procfile: its web entry, or else its worker entry. It doesn’t run a release entry, and Sevalla doesn’t create processes from the other entries. For release tasks such as database migrations, create a job with the start policy Before deployment.

Move from Nixpacks to Railpack

Railpack builds from the same repository with no changes for most applications. Before you switch a production application:
  1. Pin your language version in the repository (Railpack’s defaults can differ from Nixpacks’), for example with engines.node or .python-version.
  2. Translate any nixpacks.toml or NIXPACKS_* variables to railpack.json or RAILPACK_* variables. Railpack ignores Nixpacks’ configuration.
  3. Switch a staging copy first, or watch the first deployment’s build log. If it fails, switch back to Nixpacks and deploy again.