| 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.
Schema version: The manifestVersion field at the top of the file identifies the schema version. Do not change it.
Top-Level Structure
manifestVersion: "1.5.0-dev.3"
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 |
autoConfirm | Auto-confirm prompts (true) |
redeployAgents | Redeploy agents by default (true) |
reset | Reset agents by default (true) |
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.
httpApi:
deployments:
local:
- domain: my-app.localhost:9006
webhookUrl: http://my-app.localhost:9006
agents:
TaskAgent: {}
SecureAgent:
securityScheme: my-oidc
DevAgent:
testSessionHeaderName: X-Test-Auth
prod:
- domain: api.myapp.com
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.
mcp:
deployments:
local:
- domain: mcp.localhost:9006
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 schema 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.