How they work
While a maintenance window is active for a monitor:- Alert suppression — notification policies are bypassed and no channels fire (when
suppressAlertsis true, the default). - Severity tagging — any incident that opens during the window is created at severity
MAINTENANCEinstead ofDOWNorDEGRADED. - Monitoring continues — checks still run, results are still recorded, and the timeline still tells the truth. Suppression silences the noise; it does not pause the data.
Surface support (v1)
Maintenance windows are imperative state. They live behind the surfaces that operate on state — not the ones that describe infrastructure.Why not Terraform? Why not devhelm.yml?
Terraform and devhelm.yml are declarative: they describe the desired long-lived state of your monitoring stack — which monitors exist, what channels are wired up, who gets paged. A maintenance window is transient operational state, owned by whoever is performing the maintenance:
- Putting a maintenance window in Terraform would mean every deploy that schedules a window also generates a Git commit, a PR, an apply — for something that will be gone in 30 minutes.
- Putting one in
devhelm deploywould mean the YAML diverges from the live state the moment the window opens, anddevhelm planwould show it as drift. - Worst of all, removing the window from the file (after the deploy succeeds) would not cancel an active window —
devhelm deploywould interpret the absence as “the window doesn’t exist yet” and re-create it on the next CI run.
devhelm.yml or Terraform. They don’t compete; they cover different jobs.
If you need recurring maintenance (e.g., every Sunday 02:00 UTC), the API supports it with repeatRule (an iCal RRULE) — no Terraform required.
Request fields
Both create (POST /api/v1/maintenance-windows) and update (PUT /api/v1/maintenance-windows/{id}) accept the same body:
Each window covers one monitor or the entire organization — there is no native “this list of monitors” form. To cover several specific monitors, schedule one window per monitor (the CLI’s
--monitor flag does this for you when you pass several IDs).
Quick examples
monitorId (or --monitor) to make the window org-wide.
Recurring windows
UserepeatRule with an iCal RRULE for recurring schedules. The startsAt / endsAt define the first occurrence; the RRULE generates the rest.
Update or cancel
If the deploy runs long, extend the window — don’t let it expire and have alerts flood in:PUT, not PATCH) — pass the complete intended state, not a delta. Once the deploy succeeds, cancel the window so alerting resumes:
Listing
--status values are active and upcoming; past / cancelled windows are not returned today (omit --status for the broadest result).
Maintenance windows and notification policies
Suppression takes priority over notification policies — see Alert suppression for the full precedence model. The short version:suppressAlerts: true(default) → notification policies are skipped entirely for the covered monitors during the window.suppressAlerts: false→ incidents still get severityMAINTENANCE, but notifications still fire (useful for audit-only windows).
Next steps
CLI command reference
Every flag for
devhelm maintenance-windows.Maintenance windows guide
Step-by-step: deploy-time and recurring windows.
Alert suppression
How suppression interacts with policies and resource groups.
Incident policies
Trigger rules, confirmation, and recovery behavior.