Static sites and standard frameworks (Next.js, Astro, Vite) need no changes — Canner handles it. If your app runs its own server:
Go
A go.mod at the root triggers a Go build: go build produces a static binary that runs directly. Read the port from the environment:
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "ok")
})
http.ListenAndServe(":"+os.Getenv("PORT"), nil)
}Ruby
A Gemfile triggers Bundler with gems vendored into the project. Rails apps start with rails server, Rack apps (config.ru) with rackup, and Sinatra with the entry file. Puma and other native gems compile fine during install.
PHP
A composer.json (or a bare index.php) deploys as PHP 8.2. Laravel starts with artisan serve; anything else is served with PHP’s built-in server from public/ or the project root. Composer dependencies install automatically.
Rust
A Cargo.toml builds with cargo build --release and runs the release binary. Rust builds are compute-heavy, so they need a paid plan (Live and up — Plans & limits). Axum, Actix, and Rocket all work — bind to the PORT env var.
Java
A pom.xml builds with Maven; a build.gradle or build.gradle.kts with a committed gradlew wrapper builds with Gradle (no wrapper, no build — Canner doesn’t install a system Gradle). The JDK is picked from your declared release (maven.compiler.release, sourceCompatibility, or a Gradle toolchain) — Java 17, 21, and 25 are available, defaulting to 21. Spring Boot apps need no extra config: SERVER_PORT and SERVER_ADDRESS are set for you via its relaxed env binding; anything else can read the plain PORT var.
BoxLang
BoxLang is a modern JVM language, CFML-compatible (the ColdFusion / Lucee successor). A box.json, server.json, Application.bx / Application.cfc, or a .bxm / .cfm template at the root is the tell. There is no build step — the BoxLang MiniServer serves your source directory and compiles templates on the fly. Modules declared in box.json are installed from ForgeBox automatically. For a ColdFusion or Lucee codebase — .cfm / .cfc files or an Application.cfc — Canner also installs the bx-compat-cfml layer automatically, which restores the legacy runtime semantics (date-mask letters, BIF signatures, the cfusion scope aliases) a migration relies on. The MiniServer reads the PORT var and trusts Canner’s proxy headers, so a database datasource, sessions, and cgi.remote_addr all work behind the edge. BoxLang runs on Java 21 and needs a paid plan (Live and up — Plans & limits).
Moving an existing ColdFusion or Lucee app? Deploy ColdFusion & CFML on Canner walks through the migration.