Buildpacks
Commit source. Nodion detects the language, installs a runtime, and builds an image.
On Applications → New, connect a Gitrepo and pick Buildpacks. Nodion uses the default builder unless you choose another one. Point Base directory at the app folder in a monorepo.
Use a Dockerfileinstead when you already have one, or when the repo is not a supported language tree.
What they are
Nodion Buildpacks are Cloud Native Buildpacks. Detect, build, and launch follow that spec. The language packs, the Ubuntu stack, and the runtime versions are Nodion’s. They are not Paketo, Heroku, or Google buildpacks.
The current stack is nodion-26: Ubuntu 26.04 LTS. The build image has compilers and headers. The run image has common client libraries (Postgres, MySQL, ImageMagick, CA certificates, and similar). The process runs as a non-root user. Extra system packages go in an Aptfile or project.toml.
What a build does
- Looks at the files in the base directory and picks the first matching language group.
- Resolves a runtime from your pin (or the default), then installs that version.
- Installs dependencies from the lockfile or manifest.
- Runs the language build (assets,
mix release,go build, and so on). - Sets a default
webprocess. A Procfile overrides that.
Listen on PORT. Nodion sets it. Most default commands fall back to 8080 if it is unset.
Detection
Groups are tried from the top. The first group whose required files are all present wins. Extra Debian packages are optional in every group.
| If the tree has | Nodion uses |
|---|---|
package.json and a static frontend | Node.js, then static |
composer.json and package.json | PHP plus Node (Laravel with Vite, for example) |
Gemfile and package.json | Ruby plus Node (Rails with JS) |
composer.json | PHP |
Gemfile | Ruby |
requirements.txt, Pipfile, or pyproject.toml | Python |
go.mod | Go |
Cargo.toml | Rust |
mix.exs | Elixir |
pom.xml or Gradle files | Java |
*.csproj, *.fsproj, or *.sln | .NET |
package.json only (a server app) | Node.js |
static.toml and no package.json | Static site |
Procfile only | Your process types, no language install |
The dashboard scan warns when it sees no supported marker. You can still pick Buildpacks, or switch to a Dockerfile, or set a different base directory.
Supported versions
Nodion keeps a language line while it is not end-of-life, and for up to three months after. Request a minor and you get the latest published patch of that minor. A version below the oldest published line fails as end-of-life. A version newer than anything built yet fails as not available yet.
Go and Rust are the exception: the newest published toolchain builds the app. Older go.mod or rust-version values still compile.
Lines below are current as of September 2026. Patches move as we publish them. Pin a file from the language page if you care which minor you get.
| Language | Default | Published lines |
|---|---|---|
| Node.js | 24 | 22, 24, 25, 26 |
| Python | 3.13 | 3.10-3.14 |
| PHP | 8.3 | 8.2-8.5 |
| Ruby | 3.4 | 3.3, 3.4, 4.0 |
| Go | 1.26 | Newest toolchain (currently 1.25-1.27) |
| Rust | 1.96 | Newest toolchain (currently 1.95-1.98) |
| Java | 21 | 11, 17, 21, 25, 26 |
| .NET | 10 | 8, 9, 10 |
| Elixir | 1.20 | 1.15-1.20 (Erlang/OTP 26-29, default 28) |
Procfile
A Procfile in the base directory defines process types. web is the default if present, otherwise the first line. Language defaults apply only when there is no Procfile.
web: gunicorn myapp.wsgi --bind 0.0.0.0:$PORT
worker: python worker.pyEach type is its own process on the app. Scale replicas and the command on the Processes tab.
Extra Debian packages
Prefer project.toml. An Aptfile (one package or .deb URL per line) still works. project.toml wins if both exist.
[com.nodion.buildpacks.deb-packages]
install = ["ffmpeg", "pandoc"]Packages are extracted into the image. Maintainer scripts do not run, so packages that create system users or start services will not work. A direct https://…/*.deb URL is downloaded as-is, without dependency resolution.