Providers#
A provider is the runtime that turns a declarative HCL action into a real side
effect. builtin/postgres opens a connection and runs SQL. builtin/http makes
HTTP requests. builtin/exec spawns child processes. Custom providers can do
anything you can write a binary for.
The two kinds of providers#
Built-in providers are compiled into the orchard binary. They’re always
available and need no installation. Today that’s:
builtin/postgresbuiltin/httpbuiltin/exec
External providers are separate binaries that speak Orchard’s provider protocol over stdio. They’re referenced by path:
required_providers {
stripe = { source = "exec:./bin/orchard-stripe" }
}Built-in and external providers behave identically from a scenario author’s point of view — the same schema model, the same action mechanics, the same wiring. The only difference is the source string.
Declaring and configuring#
Every provider a scenario uses must appear in required_providers:
required_providers {
postgres = { source = "builtin/postgres" }
http = { source = "builtin/http" }
}If the provider takes configuration, declare it separately:
provider "postgres" {
dsn = var.dsn
}
provider "http" {
base_url = "https://api.example.com"
default_headers = {
Authorization = "Bearer ${var.api_token}"
}
}Provider configuration is evaluated once per scenario run, before any actions execute. It can reference variables but not action or component outputs — providers must be configured before the actions that use them.
Actions#
Each provider declares one or more action types it handles. An action block chooses the type with its first label:
action "postgres_query" "create_merchant" { query = "..." } # postgres
action "http_request" "fetch_user" { url = "..." } # http
action "exec_run" "backup_db" { command = "..." } # execOrchard looks up which provider offers the action type and routes the call there.
If multiple providers offer the same action type, disambiguate with an explicit
provider attribute:
action "postgres_query" "write_analytics" {
provider = "analytics_db"
query = "INSERT ..."
}Provider schemas#
Every provider publishes a schema describing what it accepts. Orchard uses the schema to type-check scenarios at plan time — catching typos, wrong types, and missing required attributes before any action runs.
The schema covers:
- Config attributes — what goes in the
provider "name" { }block. - Action types — what action blocks the provider handles.
- Attributes per action — what fields each action accepts.
- Outputs per action — what values the action produces for downstream wiring.
See the provider reference for the schema of each built-in provider, and writing a provider to build your own.