Docs · Frameworks

Deploy Go, Ruby, PHP, Rust, Java & BoxLang.

Beyond Node and Python, Canner detects and runs six more runtimes from their standard manifest files. Same rules everywhere: read PORT from the environment, answer on /.

Running a server? Two rules

Static sites and standard frameworks (Next.js, Astro, Vite) need no changes — Canner handles it. If your app runs its own server:

Listen on $PORT — read the port from the PORT environment variable.
Respond on / within 30 seconds of starting — that health check flips your deploy to live. Set a different path in project settings if your root isn't servable.

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.