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 isn’t supported yet. A pom.xml or build.gradle project fails with a clear unsupported_runtime message rather than deploying something broken. Tell us at hello@canner.ca if you need it — demand moves the roadmap.