A manifest with build.command boots a second, disposable microVM before the serving one, from a separate image carrying the toolchain the serving image deliberately lacks.

Fields

string
The build command, run inside the build VM.
string
The directory that becomes the deployed artifact. Omitting it deploys the whole tree, including node_modules.
string
default:"npm"
npm, pnpm, and so on.
boolean
default:"true"
Refuse the build when the matching lockfile is absent.

The entrypoint resolves inside the output

With output: dist, a runtime.entrypoint of index.js means dist/index.js. This is the most common build misconfiguration.

You cannot ask for looser dependency resolution

The control plane, not the manifest, chooses the install command, and it is always the package manager’s reproducible mode — npm ci --ignore-scripts, pnpm install --frozen-lockfile, and so on. Setting lockfileRequired: false is allowed, and tiny plan will warn that two deploys of the same source may install different code.
@tinycloud/runtime-sdk is supplied by the build image, so an application does not declare it as a dependency.

What the build VM gets

MMDS is firewalled off before any build code executes. The VM is destroyed after every build, successful or not.

How output leaves the VM

The build’s entire output channel is one tar file, which the host reads out of the guest’s disk image with debugfs rather than mounting it.
Handing an untrusted ext4 image to the host kernel would give build code a filesystem parser to attack. That is why debugfs and tar are host requirements.
The extracted tree is re-packed through the ordinary artifact pipeline, so:
  • the per-file and total upload limits apply again;
  • credential-shaped files — a stray .env, for instance — are stripped rather than deployed.

Content addressing

The result is content-addressed. An unchanged source, command, and toolchain reuses the previous build instead of running it again.
tiny deploy reports which happened, and in --json mode the result object gains a build field:
This is what makes rollback exact. A rollback returns to the precise bytes that were served — not to a rebuild that might resolve dependencies differently today.

Migrations come from source, not output

Migrations are read from the uploaded source tree, so a build.output that excludes them is fine.

If the operator installed no build image

The platform reports executesBuildCommands: false and tiny plan refuses a manifest with build.command.
It never falls back to building on the control-plane host. Running untrusted build code outside a VM would defeat the entire isolation story.
Operator setup is in Server configuration and Guest images.