YAML reference
All authored resources live below .deliberate/. The directory-level
project.yaml pins the Team, Project, and environment flow; every other YAML
document begins with an explicit resource: discriminator.
Project pin
Section titled “Project pin”team: acmeproject: chatflow: defaultResources
Section titled “Resources”| Resource | Purpose |
|---|---|
component | A long-running service, background worker, or scheduled job |
database | Managed PostgreSQL or FerretDB |
volume | Durable, automatically expanding filesystem storage |
bucket | Elastic S3-compatible object storage |
route | Explicit public or Private Net HTTP routing |
domain | A customer-owned hostname attached to an environment |
blueprint | A pinned instance of a published Blueprint |
flow-pattern | A custom environment and promotion topology |
Components
Section titled “Components”Components declare an image and only the behavior they need. Ports are internal
unless they request visibility: public or private. No ports means a worker;
schedule: means a scheduled job.
resource: componentname: appimage: ghcr.io/acme/app:1.4.2cpu: 0.5memory: 1Giports: - port: 3000 visibility: publicenv: DATABASE_URL: "${{ postgres.url }}"secrets: - SESSION_SECRETneeds: databases: - postgreshealthcheck: path: /healthDeclaring needs authorizes the dependency; it injects nothing automatically.
Wire the output to the environment-variable name your software expects with a
${{ name.output }} expression.
Complete example
Section titled “Complete example”This bundle describes a production application and its supporting resources.
Put it in .deliberate/app.yaml, next to .deliberate/project.yaml.
# Managed PostgreSQL is addressed as `postgres` by the components below.resource: databasename: postgresengine: postgrestier: prodversion: "17"extensions: - vector
---# Volumes grow automatically. `backup` selects the durability policy.resource: volumename: uploadsbackup: offsite
---# Buckets expose S3-compatible outputs such as endpoint and access_key.resource: bucketname: assetsexpose: trueanonymousRead: false
---resource: componentname: appimage: ghcr.io/acme/example-app:1.4.2cpu: 0.5memory: 1Gireplicas: 1class: standardports: - port: 3000 protocol: httpenv: NODE_ENV: production DATABASE_URL: "${{ postgres.url }}" DATABASE_POOL_URL: "${{ postgres.pooled_url }}" S3_ENDPOINT: "${{ assets.endpoint }}" S3_BUCKET: "${{ assets.bucket }}" S3_ACCESS_KEY: "${{ assets.access_key }}" S3_SECRET_KEY: "${{ assets.secret_key }}"secrets: - SESSION_SECRETneeds: databases: - postgres buckets: - assets volumes: - name: uploads path: /app/uploadshealthcheck: path: /health port: 3000 initialDelay: 15srelease: command: ["npm", "run", "migrate"] timeout: 10mpostDeploy: command: ["npm", "run", "warm-cache"] timeout: 5mshutdown: gracePeriod: 60salerts: - name: elevated-error-rate type: http_error_rate threshold: 5 window: 10m minRequests: 100 recipients: - ops@example.comoverrides: preview-*: cpu: 0.125 memory: 256Mi replicas: 1 class: standard
---# A worker is the same component primitive without a port.resource: componentname: workerimage: ghcr.io/acme/example-app:1.4.2command: ["npm", "run", "worker"]cpu: 0.5memory: 1Gienv: DATABASE_URL: "${{ postgres.url }}"needs: databases: - postgres
---# Routes deliberately connect a hostname to a component.resource: routehost: chatvisibility: publicrules: - path: / to: appopen: - label: Open Acme Chat path: / description: Open the customer-facing application. - label: Administration path: /admin description: Configure the application.The needs declarations grant the app access to the named resources. The
${{ ... }} expressions then map their outputs to the environment-variable
names this particular image expects. release runs before the new revision is
made current; postDeploy runs after deployment. The preview-* override
keeps every matching preview environment smaller without changing production.
The route is separate from the component on purpose: it makes public exposure explicit and lets the same component remain private in another declaration.
The parser rejects unknown fields. Internal projection and historical migration fields are not part of the authored vocabulary even if they appear in stored revision data.