Base images
Every recipe starts from a platform base image that includes Debian 12, Git, Node.js, Claude Code, Codex CLI, and thegh CLI. Your provisioning script adds everything else.
Agents run as the murmur user with passwordless sudo, so a missing system package never strands a task — the agent can install it at runtime. A recipe makes that unnecessary: the bake pays the install cost once instead of on every spawn. Orgs that want a non-root agent can remove /etc/sudoers.d/murmur in their provisioning script.
Provisioning script
The script runs as root on the scratch VM during the bake. It installs your toolchain and exits. Anything you install ends up in the final image.Secret allowlist
If your provisioning script needs credentials — for example, to install packages from a private registry — list the secret names insecret_allowlist. Only listed secrets are available during the bake.
Baking
Automatic recipe updates
An agent that hits a missing tool can install it at runtime, but the next agent pays the same cost — the fix belongs in the recipe. Murmur ships a built-in service that closes that loop: every agent turn can report an image defect (a missing tool, a command not found, a package too old), and the service turns a report into the smallest recipe change that addresses it, rebuilds the image, boots the new image on a real VM to confirm the fix, and only then repoints the workspace at it. If that verification returns anything other than a pass, it rejects its own rollout and restores your recipe. It only acts on a report naming a concrete, durable defect — a tool absent, broken, or outdated. Platform bugs, missing permissions, and task-specific complaints are ignored, because no recipe change fixes them. Every step is a change-request, so the trail is permanent and reviewable after the fact: what changed in your recipe, why (the agent’s report, quoted), and which image each workspace moved to.Reviewing instead of acting
To have the service open change-requests for you to approve rather than applying them itself, disable the tenant-binding that grants it write authority:murmur ls --developer service_profile/murmur-image-updater --workspace <workspace> lists them.
Restore it with the exact inverse:
bake.create plus permission to assume the murmur-image-updater service profile and the workspace’s service account, so pick a reviewer who has them.
To turn the service off entirely rather than narrow it, disable the flight: murmur delete flight murmur-image-update. That is reversible the same way.