Skip to main content
The devhelm.yml file defines your entire monitoring configuration. Deploy it with devhelm deploy -f devhelm.yml.

Minimal example

version: "1"

monitors:
  - name: API Health
    type: HTTP
    config:
      url: https://api.example.com/health
    frequency: 60
    regions: [us-east]

Top-level structure

version: "1"

defaults:
  monitors:
    frequency: 60
    enabled: true
    regions: [us-east, eu-west]

tags:
  - ...

environments:
  - ...

secrets:
  - ...

alertChannels:
  - ...

notificationPolicies:
  - ...

webhooks:
  - ...

resourceGroups:
  - ...

monitors:
  - ...

dependencies:
  - ...
All section keys are camelCase. Every section is optional — include only what you need.

version

version: "1"
The schema version. Currently "1" is the only supported value. The CLI warns on unrecognized versions but does not reject them.

defaults

Set default values that apply to all monitors unless overridden:
defaults:
  monitors:
    frequency: 60
    enabled: true
    regions: [us-east, eu-west]
    alertChannels: [Slack Alerts]
    incidentPolicy:
      confirmation:
        type: multi_region
        minRegionsFailing: 2
Defaults are applied with shallow per-field merge: if a monitor sets a field, the monitor value wins. Nested objects like incidentPolicy are replaced entirely, not deep-merged.

Resource sections

Each section is detailed on its own page:
SectionKeyReference byDocs
TagstagsnameTags & Secrets
EnvironmentsenvironmentsslugTags & Secrets
SecretssecretskeyTags & Secrets
Alert ChannelsalertChannelsnameAlert Channels
Notification PoliciesnotificationPoliciesnameNotification Policies
WebhookswebhooksurlTags & Secrets
Resource GroupsresourceGroupsnameMonitors
MonitorsmonitorsnameMonitors
Dependenciesdependenciesservice slugTags & Secrets

Cross-references

Resources reference each other by name (or slug), not by ID. The CLI resolves names to IDs at deploy time:
monitors:
  - name: API Health
    tags: [production]            # references tag by name
    alertChannels: [Slack Alerts] # references alert channel by name
    environment: staging          # references environment by slug
    auth:
      type: BearerAuthConfig
      secret: API_TOKEN           # references secret by key

Environment variable interpolation

Use ${VAR} syntax to inject environment variables into any string value:
alertChannels:
  - name: Slack Alerts
    type: slack
    config:
      webhookUrl: ${SLACK_WEBHOOK_URL}
With a default fallback:
monitors:
  - name: API Health
    type: HTTP
    config:
      url: ${API_URL:-https://api.example.com/health}
Environment variables are resolved before YAML parsing. If a required variable is missing, the CLI exits with an error listing all unresolved variables.
Environment variable interpolation (${VAR}) is different from vault secrets. Variables are resolved from the shell environment at deploy time. Vault secrets are stored in DevHelm and referenced by key in auth blocks.

Multi-file configs

Pass multiple files with -f:
devhelm deploy -f base.yml -f overrides.yml --yes
Or point to a directory (all *.yml and *.yaml files are loaded in sorted order):
devhelm deploy -f config/ --yes
Resources from all files are merged by name. If the same monitor name appears in multiple files, the last file wins.

Full example

version: "1"

defaults:
  monitors:
    frequency: 60
    regions: [us-east, eu-west]

tags:
  - name: production
    color: "#10b981"
  - name: api
    color: "#3b82f6"

environments:
  - name: Production
    slug: production
    variables:
      BASE_URL: https://api.example.com

secrets:
  - key: SLACK_WEBHOOK_URL
    value: ${SLACK_WEBHOOK_URL}

alertChannels:
  - name: Slack Alerts
    type: slack
    config:
      webhookUrl: ${SLACK_WEBHOOK_URL}

  - name: PagerDuty On-Call
    type: pagerduty
    config:
      routingKey: ${PAGERDUTY_ROUTING_KEY}

notificationPolicies:
  - name: Critical Alerts
    enabled: true
    priority: 10
    matchRules:
      - type: tag
        values: [production]
    escalation:
      steps:
        - channels: [Slack Alerts]
          delayMinutes: 0
        - channels: [PagerDuty On-Call]
          delayMinutes: 5
          requireAck: true

monitors:
  - name: API Health
    type: HTTP
    config:
      url: https://api.example.com/health
      method: GET
    tags: [production, api]
    alertChannels: [Slack Alerts]
    assertions:
      - type: StatusCodeAssertion
        config:
          expected: "200"
          operator: equals
        severity: fail

dependencies:
  - service: github
    alertSensitivity: INCIDENTS_ONLY

Next steps

Monitors in YAML

All monitor types, assertions, and incident policies.

Deploy workflow

Validate, plan, and deploy lifecycle.