Docs · Frameworks

Deploy Go, Ruby, PHP & Rust.

Beyond Node and Python, Canner detects and runs four 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 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.