| name | golem-edit-manifest |
| description | Editing the Golem Application Manifest (golem.yaml). Use when modifying any section of golem.yaml — components, agents, templates, presets, environments, httpApi, mcp, bridge SDKs, build commands, config, wasiConfig, plugins, files, custom commands, clean paths, retry policies, resource quotas, or secret defaults. |
Editing the Golem Application Manifest (golem.yaml)
The golem.yaml file in the project root is the Golem Application Manifest. It defines the entire application: components, agents, build steps, environments, HTTP/MCP deployments, and more.
Manifest version: The manifestVersion field at the top of the file identifies the application manifest document version. Do not change it.
Top-Level Structure
manifestVersion: "1.5.0"
app: my-app
includes:
- "components/*/golem.yaml"
componentTemplates:
<template-name>: { ... }
components:
<ns:name>: { ... }
agents:
<AgentName>: { ... }
environments:
<env-name>: { ... }
httpApi:
deployments: { ... }
mcp:
deployments: { ... }
bridge:
ts: { ... }
rust: { ... }
customCommands:
<command-name>: [...]
clean:
- "path/to/clean"
secretDefaults:
<env-name>: {...}
retryPolicyDefaults:
<env-name>: {...}
resourceDefaults:
<env-name>: {...}
Components
Components are keyed by namespace:name (e.g., my-app:billing).
components:
my-app:billing:
dir: billing
templates:
- rust
componentWasm: target/wasm32-wasip1/debug/billing.wasm
outputWasm: golem-temp/billing.wasm
build:
- command: cargo build --target wasm32-wasip1
env:
LOG_LEVEL: info
plugins:
- name: otlp-exporter
version: "0.1.0"
files:
- sourcePath: ./data/config.json
targetPath: /etc/config.json
clean:
- target/
presets:
debug:
default: true
env:
LOG_LEVEL: debug
release:
env:
LOG_LEVEL: warn
Key component fields
| Field | Type | Description |
|---|
dir | string | Base directory for resolving paths. "." for single-component apps |
templates | string or string[] | Parent template name(s) to inherit from |
componentWasm | string | Path to the built WASM component |
outputWasm | string | Path for the final output WASM ready for upload |
build | array | Build commands (see Build Commands) |
env | map | Environment variables (string → string) |
envMergeMode | enum | upsert (default), replace, or remove |
plugins | array | Plugin installations |
pluginsMergeMode | enum | append (default), prepend, or replace |
files | array | Initial filesystem entries |
filesMergeMode | enum | append (default), prepend, or replace |
config | any | Arbitrary configuration passed to agent |
wasiConfig | map | WASI configuration variables (string → string) |
wasiConfigMergeMode | enum | upsert (default), replace, or remove |
customCommands | map | Component-level custom commands |
clean | string[] | Extra clean paths |
presets | map | Named presets (see Presets) |
Component Templates
Templates define reusable property layers. Components reference them via templates:.
componentTemplates:
rust:
build:
- command: cargo build --target wasm32-wasip1
env:
RUST_LOG: info
components:
my-app:service:
templates: [rust]
dir: service
Templates support the same fields as components except dir. Templates can themselves reference other templates via templates:.
Agents
Agent types are keyed by PascalCase name. They support the same cascading property fields as components (env, plugins, files, config, wasiConfig) but NOT build-related fields. Agents can also inherit from templates via templates:.
agents:
MyAgent:
templates: [shared-runtime]
env:
CACHE_TTL: "300"
plugins:
- name: otlp-exporter
version: "0.1.0"
files:
- sourcePath: ./agent-data/model.bin
targetPath: /data/model.bin
presets:
debug:
default: true
env:
CACHE_TTL: "60"
Config and WASI Config
The config field accepts arbitrary YAML values (objects, arrays, scalars) passed as typed configuration to the agent at runtime. The wasiConfig field is a string-to-string map of WASI-level configuration variables.
components:
my-app:service:
config:
model: gpt-4o-mini
temperature: 0.2
features:
- summarize
- translate
wasiConfig:
WASI_FLAG: enabled
agents:
MyAgent:
config:
max_retries: 3
wasiConfig:
AGENT_WASI_OPT: "true"
Both fields follow the cascade hierarchy and support merge modes (wasiConfigMergeMode for wasiConfig).
Cascade / Merge System
Properties cascade from general to specific:
componentTemplates → components → agents → presets
Each level can override or merge with its parent using merge modes:
| Property | Merge Mode Field | Type | Default | Options |
|---|
env | envMergeMode | map | upsert | upsert, replace, remove |
wasiConfig | wasiConfigMergeMode | map | upsert | upsert, replace, remove |
plugins | pluginsMergeMode | vec | append | append, prepend, replace |
files | filesMergeMode | vec | append | append, prepend, replace |
build | buildMergeMode | vec | append | append, prepend, replace |
Presets
Both components and agents support presets — named configurations that can override the properties allowed at that level. Component presets can override component-layer fields (build, env, plugins, files, config, wasiConfig, clean, customCommands); agent presets can override agent-layer fields (env, plugins, files, config, wasiConfig). Presets cannot override structural fields like dir or templates. Mark one preset as default with default: true.
components:
my-app:service:
presets:
debug:
default: true
env:
LOG_LEVEL: debug
release:
env:
LOG_LEVEL: warn
Build Commands
The build array contains commands executed during golem build. Each entry is one of:
External command (most common)
build:
- command: cargo build --target wasm32-wasip1
dir: .
env:
RUSTFLAGS: "-C opt-level=2"
rmdirs: [target/old]
mkdirs: [target/new]
sources: ["src/**/*.rs"]
targets: ["target/wasm32-wasip1/debug/*.wasm"]
TypeScript/QuickJS-specific commands
build:
- generateQuickjsCrate: golem-temp/quickjs-crate
wit: wit
jsModules: { "main.js": "esm" }
world: my-world
- generateQuickjsDts: golem-temp/bindings.d.ts
wit: wit
- injectToPrebuiltQuickjs: golem-temp/quickjs.wasm
module: dist/bundle.js
into: golem-temp/output.wasm
- preinitializeJs: golem-temp/output.wasm
into: golem-temp/preinit.wasm
Custom Commands
Define CLI commands at the application or component level:
customCommands:
test:
- command: cargo test --target wasm32-wasip1
dir: .
lint:
- command: cargo clippy --target wasm32-wasip1
Run with golem exec <name> (e.g., golem exec test).
customCommands can only contain command:-style external commands; they do not support generateQuickjsCrate, injectToPrebuiltQuickjs, or other build-specific command types.
Environments
Environments configure where and how the application is deployed.
environments:
local:
default: true
server: local
cli:
format: text
autoConfirm: true
cloud:
server: cloud
staging:
server:
url: https://staging.example.com
auth:
oauth2: true
workerUrl: https://staging-workers.example.com
allowInsecure: false
componentPresets: [release]
cli:
format: json
redeployAgents: true
reset: true
deployment:
compatibilityCheck: true
versionCheck: true
securityOverrides: false
Server options
| Value | Description |
|---|
local | Built-in local Golem server |
cloud | Golem Cloud |
{ url, auth, ... } | Custom server (see Custom Server below) |
Custom server auth
auth:
oauth2: true
auth:
staticToken: "my-secret-token"
CLI options
| Field | Description |
|---|
format | Default output: text, json, yaml, pretty, pretty-json, pretty-yaml, toon |
autoConfirm | Auto-confirm prompts (true) |
redeployAgents | Redeploy agents by default (true) |
reset | Reset agents by default (true) |
When format: toon is used, structured stdout is emitted as framed TOON documents. Parse exact @toon and @end marker lines, and treat the content between them as one TOON document. Stderr may still contain progress or diagnostics and should not be parsed as the structured payload.
Deployment options
| Field | Type | Description |
|---|
compatibilityCheck | bool | Check component compatibility before deploying |
versionCheck | bool | Check version constraints |
securityOverrides | bool | Allow security scheme overrides |
HTTP API Deployments
Configure HTTP API domain deployments per environment.
Each deployment must define exactly one of:
subdomain: a single DNS label resolved through the target environment server (my-app.localhost:9006 locally by default, my-app.apps.golem.cloud on built-in cloud).
domain: a full custom domain such as api.example.com for custom DNS or custom server environments.
httpApi:
deployments:
local:
- subdomain: my-app
webhookUrl: /webhooks/
agents:
TaskAgent: {}
SecureAgent:
securityScheme: my-oidc
DevAgent:
testSessionHeaderName: X-Test-Auth
cloud:
- subdomain: my-app
agents:
TaskAgent: {}
SecureAgent:
securityScheme: prod-google-oidc
Agent names use PascalCase matching the agent type name in code.
MCP Deployments
Configure MCP (Model Context Protocol) deployments per environment.
Each deployment must define exactly one of:
subdomain: a single DNS label resolved through the target environment server (my-mcp.localhost:9007 locally by default, my-mcp.mcps.golem.cloud on built-in cloud).
domain: a full custom domain such as mcp.example.com for custom DNS or custom server environments.
mcp:
deployments:
local:
- subdomain: my-mcp
agents:
ToolAgent: {}
SecureToolAgent:
securityScheme: my-oidc
Bridge SDK Generation
Generate typed client SDKs for calling agents from external code. The agents field accepts "*" (all agents), or a list of agent type names or component names (namespace:name).
bridge:
ts:
agents: "*"
outputDir: ./bridge-sdk/ts
rust:
agents:
- MyAgent
- my-app:billing
outputDir: ./bridge-sdk/rust
Plugin Installations
Plugins are installed at any cascade level (template, component, agent, preset).
plugins:
- name: otlp-exporter
version: "0.1.0"
account: golem
parameters:
endpoint: http://localhost:4317
protocol: grpc
Initial Files
Mount files into the agent's virtual filesystem.
files:
- sourcePath: ./data/config.json
targetPath: /etc/app/config.json
permissions: read-only
- sourcePath: ./static-assets/
targetPath: /var/www/static/
- sourcePath: https://example.com/model.bin
targetPath: /data/model.bin
Template Substitution
Environment variable values support {{ VAR_NAME }} syntax. At deploy time, these resolve against the host machine's environment:
env:
API_KEY: "{{ MY_API_KEY }}"
DB_URL: "prefix-{{ DB_HOST }}-suffix"
Missing host variables cause deployment failure.
Secret Defaults
Secret defaults per environment use the same nested object style as config:
secretDefaults:
local:
apiKey: "test-key-123"
prod:
apiKey: "{{ PROD_API_KEY }}"
Retry Policy Defaults
Named retry policies created in the environment during deployment:
retryPolicyDefaults:
local:
default-retry:
priority: 10
predicate: "true"
policy:
countBox:
maxRetries: 3
inner:
exponential:
baseDelay: { secs: 1, nanos: 0 }
factor: 2.0
Retry policy types
| Type | Fields | Description |
|---|
"immediate" | — | Retry immediately |
"never" | — | Never retry |
periodic | { secs, nanos } | Fixed delay between retries |
exponential | { baseDelay, factor } | Exponentially increasing delay |
fibonacci | { first, second } | Fibonacci-sequence delays |
countBox | { maxRetries, inner } | Limit total retry count |
timeBox | { limit, inner } | Limit total retry time |
clamp | { minDelay, maxDelay, inner } | Clamp delay range |
addDelay | { delay, inner } | Add fixed delay to inner policy |
jitter | { factor, inner } | Add random jitter |
filteredOn | { predicate, inner } | Apply only when predicate matches |
andThen | [policy1, policy2] | Sequential composition |
union | [policy1, policy2] | Union of two policies |
intersect | [policy1, policy2] | Intersection of two policies |
Retry predicates
| Type | Fields | Description |
|---|
"true" | — | Always matches |
"false" | — | Never matches |
propEq | { property, value } | Property equals value |
propNeq | { property, value } | Property not equal |
propGt / propGte | { property, value } | Greater than / greater or equal |
propLt / propLte | { property, value } | Less than / less or equal |
propExists | string | Property exists |
propIn | { property, values } | Property in set |
propMatches | { property, pattern } | Regex match |
propStartsWith | { property, prefix } | Starts with prefix |
propContains | { property, substring } | Contains substring |
and | [pred1, pred2] | Logical AND |
or | [pred1, pred2] | Logical OR |
not | predicate | Logical NOT |
Predicate values are typed: { text: "..." }, { integer: 42 }, or { boolean: true }.
Resource Quota Defaults
Quota resource definitions created during deployment:
resourceDefaults:
local:
api-calls:
limit:
type: Rate
value: 100
period: minute
max: 1000
enforcementAction: reject
unit: request
units: requests
storage:
limit:
type: Capacity
value: 1073741824
enforcementAction: reject
unit: byte
units: bytes
- name: connections
limit:
type: Concurrency
value: 50
enforcementAction: throttle
unit: connection
units: connections
Resource limit types
| Type | Required Fields | Description |
|---|
Rate | value, period, max | Rate limit per time period. period: second/minute/hour/day/month/year |
Capacity | value | Total capacity limit |
Concurrency | value | Concurrent usage limit |
Enforcement actions
| Action | Description |
|---|
reject | Reject requests exceeding the limit |
throttle | Slow down requests exceeding the limit |
terminate | Terminate the agent when limit is exceeded |
Common Edit Patterns
Add a new component
Insert a new key under components::
components:
my-app:new-service:
dir: new-service
templates: [rust]
Add environment variables to an agent
agents:
MyAgent:
env:
NEW_VAR: "value"
Add a plugin to a component
components:
my-app:service:
plugins:
- name: my-plugin
version: "1.0.0"
parameters:
key: value
Add a new environment
environments:
staging:
server:
url: https://staging.example.com
auth:
staticToken: "{{ STAGING_TOKEN }}"
Add HTTP API deployment for a new environment
httpApi:
deployments:
staging:
- domain: api-staging.example.com
agents:
MyAgent: {}
Add clean paths
Root-level clean paths apply to golem clean globally; component-level clean paths are scoped to that component:
clean:
- golem-temp/
- dist/
components:
my-app:web:
clean:
- node_modules/.cache/
- build/
Field Scope Matrix
This table shows where each property can be defined:
| Field | Root | Component Template | Component | Agent | Component Preset | Agent Preset |
|---|
templates | — | ✅ | ✅ | ✅ | — | — |
build | — | ✅ | ✅ | — | ✅ | — |
env | — | ✅ | ✅ | ✅ | ✅ | ✅ |
wasiConfig | — | ✅ | ✅ | ✅ | ✅ | ✅ |
plugins | — | ✅ | ✅ | ✅ | ✅ | ✅ |
files | — | ✅ | ✅ | ✅ | ✅ | ✅ |
config | — | ✅ | ✅ | ✅ | ✅ | ✅ |
customCommands | ✅ | ✅ | ✅ | — | ✅ | — |
clean | ✅ | ✅ | ✅ | — | ✅ | — |
dir | — | — | ✅ | — | — | — |
componentWasm | — | ✅ | ✅ | — | ✅ | — |
outputWasm | — | ✅ | ✅ | — | ✅ | — |
Related Skills
- Load
golem-profiles-and-environments for detailed guidance on CLI profiles, app environments, component presets, and how they interact
Edit Guardrails
- Do not invent fields: most manifest objects use
additionalProperties: false — only use fields documented above.
- Preserve
manifestVersion: never change the manifest document version.
- Agent names use PascalCase: matching the class/trait name in code (e.g.,
MyAgent, not my-agent).
- Component names use
namespace:name format (e.g., my-app:billing).
- Only one
default: true preset per preset map.
- Merge modes are intentional:
env, wasiConfig, plugins, files, and build respect merge modes. Don't silently replace arrays/maps unless a merge mode of replace is set.
- Template substitution (
{{ VAR }}) in env values resolves from host environment at deploy time. Missing variables cause deployment failure.