Skip to main content
Agent VMs come pre-configured with development tools and Claude Code. You can customize the environment with startup scripts or custom baked images. This page explains what is available out of the box and how to extend it. For per-repo setup that runs after cloning — dependency installs, code generation — see Repo Hooks.

Pre-installed tools

Every agent VM starts from a base image built on Debian 12 (Bookworm) with the following tools pre-installed: Language runtimes (Go, Python, Node.js, Ruby, Rust, etc.) are not installed — they belong in a custom image baked from your recipe. The base image is maintained by the Murmur platform and updated regularly with security patches. Because agents have passwordless sudo, anything missing can be installed at runtime — sudo apt-get install just works, and on an image whose recipe adds Node.js, so does npx playwright install --with-deps chromium. Runtime installs cost time on every spawn, though: bake anything stable into a custom image. Orgs that want a non-root agent can remove /etc/sudoers.d/murmur in their recipe’s provisioning script; see Agent VM controls for why root on the VM isn’t an isolation boundary.

The base image provisioning script

The exact script that builds the base image, for reference when deciding what your recipe still needs to install:

Startup scripts

Startup scripts run before the agent session starts, making them the right place for environment customization that needs to happen on every boot. Configure a startup script in your environment resource:

What startup scripts are good for

  • Installing packages with apt-get
  • Installing language-specific tools (pip install, npm install -g, go install)
  • Writing configuration files (.npmrc, .env, tool configs)
  • Downloading test fixtures or seed data
  • Running database migrations or setup scripts
  • Setting up SSH keys for private package registries

Execution details

  • Scripts run as root before the agent session starts
  • The working directory is /
  • The agent’s repos have already been cloned when the script runs
  • Scripts must exit 0; a non-zero exit fails the provisioning
  • stdout and stderr are captured in provisioning logs

Custom images

For larger or more complex environments, bake a custom image instead of relying on startup scripts. Custom images use recipes and murmur bake to produce VM images with your toolchain pre-installed.

Recipes

A recipe defines how to build a custom image:

Baking an image

This starts an image build process. You can monitor progress with:
Once the bake completes, reference the resulting image in your workspace configuration. The image is stored in your tenant’s image registry and used for all VMs in the workspace.

When the image is used

Custom images replace the base image entirely. When a VM boots with a custom image, it already has all your tools installed — no startup script delay.

Environment variables on VMs

Agent VMs have several environment variables available:

Tenant secrets

Secrets stored in the catalog are decrypted and injected as environment variables with the MURMUR_SECRET_ prefix:
Secrets are decrypted from KMS in memory only — they are never written to disk. See Encryption for details on how secrets are protected.

Claude Code configuration

The Claude Code settings.json is written at VM boot time by the Murmur control plane. It configures:
  • Model selection — set from the workspace config or per-agent override
  • Fast mode — enabled if fast_mode: true in the workspace config
  • MCP server — the murmur MCP server entry, enabling agent orchestration tools
  • Permissions — tool permissions appropriate for autonomous operation
Agents should not modify settings.json directly. To customize Claude Code behavior, use append_system_prompt in the spawn configuration or define an agent persona.

Scripts vs. baked images

Use this decision table to choose between startup scripts and custom images:

Rules of thumb

  • If the install takes under 30 seconds, use a startup script.
  • If the install takes over 2 minutes, bake it into an image.
  • If you are iterating frequently on the environment, start with a startup script and bake once it stabilizes.
  • If you need GPU drivers or CUDA, always use a custom image — these installations are too large and slow for startup scripts.
  • If a tool is needed rarely or unpredictably, skip both — agents have passwordless sudo and can install it themselves when a task actually needs it.
You can combine both approaches: use a custom image for the heavy base (Go, Docker, etc.) and a startup script for lightweight, frequently-changing configuration (writing config files, setting env vars).