What's in a manifest?

An exo.hcl file contains project configuration and component definitions. It specifies how Exo orchestrates your development environment.

The .hcl file extension refers to the Hashicorp Configuration Language.

Manifest Location

Exo expects one exo.hcl at the root of each workspace. It is intended to be checked in to version control along with your project source.

Template exo.hcl

exo = "0.1"

components {

  process "web" {
    program = "./run-web-server"

  # ...




The top-level of an exo.hcl file forms the body of an implicit manifest block with the following attributes and sub-blocks.

environment Block

Placement: top-level

The environment block supplies environment variables for use by component definitions in the project. For simple key/value string pairs, variables can be specified as attributes in the environment block. For more complex cases, including defining secrets, variables are specified by child blocks within the environment block. Later children blocks shadow earlier blocks, which shadow the environment block-level attributes.

secrets Block

Placement: environment

secrets {
  source = "https://example.com/secrets/vault"

Visit https://secrets.deref.io/ to create a secrets vault.

components Block

Placement: top-level

The components block acts as a container for individual component blocks. Each component has a unique name across the manifest.

Components may come in the form of component blocks or as macro-blocks named after the type of component. For details regarding specific component types and their respective syntax, see Components.

component Block

Placement: components

Each component block specifies an individual component.

Generally, it is less verbose to use type-specific component macros. For details regarding component types and their respective syntax, see Components.

spec Block

Placement: component

Alternative to the spec attribute. Specifies a component's configuration in HCL format, instead of as an arbitrary string. The contents of a spec block are entirely dependent on the type of a component.


Last updated