go.mod and serves it on a scratch base image. No runtime dependencies, fast cold starts, small images.
When it runs
Raypacks picks the Go pack when both are true:- There’s a
go.modat the repo root. - There’s a
main.goeither at the root or undercmd/<name>/main.go.
main.go anywhere) fall through detection. They’re not deployable as a Frame.
Entrypoint resolution
Raypacks figures out what to build, in this order:[build].entrypointinnubo.toml--entrypointpassed at build time (localrpCLI only)- Auto-detection:
./main.goat the root, then the firstcmd/<name>/main.go(alphabetical)
--entrypoint is a flag for the local rp CLI. Managed Nubo builds never pass it, so on the platform the entrypoint comes from nubo.toml [build].entrypoint (or the dashboard override) or auto-detection. Pin it in nubo.toml when you have more than one candidate.cmd/*/main.go and don’t pin a choice, the alphabetically first one wins. Pin the right one with nubo.toml:
nubo.toml
What the build does
CGO_ENABLED=0GOOS=linuxGOARCH=amd64
/app/server in the final image with mode 0755.
Runtime
Your binary should listen on
:$PORT and 0.0.0.0. The default net/http listener http.ListenAndServe(":8080", nil) works as long as the Frame’s configured port matches 8080.
Go version
The builder image pins Go1.25. That’s currently fixed; we don’t yet read go 1.x directives from your go.mod.
Limits today
linux/amd64only. No ARM yet.- No
vendor/mode. Rungo mod tidyand checkgo.mod/go.suminto the repo. - No
go.workworkspaces. - No build tags or
-ldflagscustomization.
Common errors
go.mod detected but no main.go found at root or under cmd/*: your repo is a library, or main.go lives somewhere Raypacks doesn’t look. Add a nubo.toml entry pointing at the right directory.
go build fails with “package . is not a main package”: you set an entrypoint to a directory that has Go code but no package main in it. Point at the directory that actually contains the main() function.
Examples
A single-binary repo withmain.go at the root: no config needed.
A monorepo with cmd/api/main.go and cmd/worker/main.go: one Frame per binary, each with its own nubo.toml (or use the dashboard’s entrypoint override).