How detection works
Brimble inspects:- The repo root for known files (
package.json,requirements.txt,Gemfile,go.mod,Cargo.toml,composer.json,pom.xml,build.gradle,mix.exs,Dockerfile). - The contents of those files for framework-specific signals (e.g.
nextindependencies). - A few file-pattern checks (
Procfile,wrangler.toml, etc.).
Dockerfile at the repo root takes precedence, Brimble uses it directly and skips framework detection.
Node.js
Detected via package.json.
Package manager auto-detected from lockfile:
package-lock.json → yarn.lock → pnpm-lock.yaml → bun.lockb → engines.node in package.json or a .nvmrc file. Latest LTS by default.
Python
Detected via requirements.txt, pyproject.toml, or Pipfile.
Python version detected from
.python-version, runtime.txt, or pyproject.toml. Defaults to a recent stable version.
Package manager: requirements.txt), pyproject.toml with [tool.poetry]), or pipenv (Pipfile).
Ruby
Detected via Gemfile.
Ruby version from
.ruby-version or Gemfile.
Go
Detected via go.mod.
- Service type: Web service.
- Build:
go build -o app . - Start:
./app
go.mod.
PHP
Detected via composer.json.
Java / Kotlin
Detected via pom.xml (Maven) or build.gradle / build.gradle.kts (Gradle).
JVM version from
pom.xml’s <java.version> or Gradle’s targetCompatibility.
Rust
Detected via Cargo.toml.
- Service type: Web service.
- Recommended: leave install and build empty; start
./bin/<app-name>(or leave start empty). - The builder compiles with Cargo, copies the binary into
bin/, and starts from there. Do not start fromtarget/release/— that path is not in the running image.
rust-toolchain.toml or stable.
Elixir
Detected via mix.exs.
- Service type: Web service.
- Build:
mix deps.get,mix compile, asset compilation ifPhoenix.
- Start:
mix phx.serverorMIX_ENV=prod elixir --erl '-detached' -S mix run --no-halt.
Static-only frameworks
For all of the above, Brimble creates a static site project (no runtime container).
Dockerfile
If a Dockerfile exists at the project root, Brimble uses it directly:
- Build:
docker build -t <image> . - Start:
docker run -e PORT=$PORT -p $PORT <image>
- Use
EXPOSEfor the listener port (or the container must listen on$PORTregardless). - Run as a non-root user where possible.
- End with a
CMDthat launches your service in the foreground.
Custom commands
For any framework, detected or not, you can override under Configuration:- Install command, typically the package manager install step.
- Build command, anything that compiles or bundles. Empty for runtime-only languages.
- Pre-start command, runs once per build, after the build, before the artifact is pushed. Useful for migrations.
- Start command, launches the runtime container. Must keep the process in the foreground.
bash. Standard shell features (pipes, redirects, &&) work.
Language version selection
Most frameworks default to a recent stable version. Pin a specific version via the language’s standard mechanism:Node:
engines.nodeinpackage.json, or.nvmrc.Python:
.python-version,runtime.txt, orpyproject.toml.Ruby:
.ruby-versionorGemfile.Go:
go.mod’sgodirective.Java:
pom.xml<java.version>or GradletargetCompatibility.