BuildSpec is the canonical declaration of how to build a template. The SDK flattens it onto TemplateCreateOptions for convenience: from / steps / startCmd / readyCmd are top-level options.
from: base image
An OCI image reference. Resolved to a digest at build time for reproducibility.
- Must be a linux/amd64 image
- Alpine bases are rejected
- Distroless bases are rejected — they ship no shell, so
runsteps can’t execute
steps: ordered build steps
A list of tagged objects executed in order inside the build VM. Exactly one of run / env / workdir / user must be set per step.
run: shell command
/bin/sh -c inside the build VM.
env: environment variable
envVars on sandbox create override on conflict.
workdir: working directory
workingDir overrides at runtime.
user: switch user
sudo: true grants passwordless sudo.
startCmd: process to start after build
readyCmd: readiness probe
startCmd until it exits 0 or 10 minutes elapse. Use this to wait for a server to bind its port before snapshotting.
Resource limits
Templates specify the VM shape; sandboxes inherit these and cannot override them per-sandbox.
The Max column is the platform ceiling. New teams start with a lower per-team cap (2 vCPU, 2048 MiB memory); email support@superserve.ai to raise it.
Build error codes
When a build lands onfailed, BuildError.code carries one of these stable identifiers (the SDK parses it from the "<code>: <detail>" prefix on errorMessage):
Template.create / rebuild can also be rejected before a build starts with a RateLimitError — too_many_builds (team’s concurrent-build limit) or too_many_templates (team’s template-count limit). These are not BuildError codes; see Errors.