Configuration Reference

arrow uses a single arrow.yaml file at the root of your project. This reference describes every supported field.

Full Schema

yaml
# arrow.yaml - project configuration
# ====================================

# Schema version. Currently only "1" is supported.
# Required.
version: "1"

# Project metadata.
# Optional but recommended.
project:
  # Human-readable project name
  name: my-project

  # Project language. Used for default templates.
  # Options: node, python, go, rust, auto
  language: node

# Custom variables accessible in step commands.
# Use {{ .var.NAME }} or $NAME syntax.
vars:
  REGISTRY: docker.io/myorg
  TAG: latest

# Environment variables available to all steps.
# Can reference shell env vars with {{ .env.NAME }}.
env:
  NODE_ENV: production

# Hooks run before/after every pipeline execution.
hooks:
  pre-run: echo "Starting..."
  post-run: echo "Done."

# Pipeline definitions.
# Each pipeline is a named set of steps.
pipelines:
  # Pipeline name (used with "arrow run <name>").
  build:
    # Optional description shown in "arrow pipe list"
    description: Build and test the application

    # Steps run in dependency order.
    steps:
      # Step name - must be unique within a pipeline.
      - name: install

        # Shell command to execute.
        # Required.
        run: npm install

        # Working directory relative to project root.
        # Optional. Defaults to project root.
        dir: frontend

        # Dependencies: steps that must complete first.
        # Steps with no "needs" run in parallel.
        # Optional.
        needs: []

        # Environment variables for this step only.
        # Merged with top-level env and shell env.
        # Optional.
        env:
          CI: "true"

        # Cache configuration.
        # Optional.
        cache:
          # Paths to cache (relative to project root).
          paths:
            - node_modules
            - .next/cache
          # Cache key template. Defaults to hash of
          # the step command + all input files.
          key: deps-{{ hashFiles("package-lock.json") }}

        # Retry configuration for flaky steps.
        # Optional.
        retry:
          # Max attempts (including first try).
          attempts: 3
          # Backoff strategy: fixed, exponential
          backoff: exponential

        # When to run this step.
        # Options: always, success, failure
        # Default: success
        when: success

        # Timeout for this step.
        # Overrides the global --timeout flag.
        # Optional.
        timeout: 10m

      - name: test
        run: npm test
        needs: [install]

Conditional Steps

Steps can be conditional using the when field or environment-based conditionals:

yaml
steps:
  - name: deploy
    run: ./deploy.sh
    # Only deploy on the main branch
    when: "{{ eq .env.BRANCH "main" }}"

  - name: notify
    run: ./slack-notify.sh
    # Always run, even if previous steps fail
    when: always

  - name: cleanup
    run: rm -rf temp/
    when: always

Environment Variable Overrides

Every configuration value can be overridden with environment variables using the ARROW_ prefix:

Config PathEnv VariableExample
project.nameARROW_PROJECT_NAMEexport ARROW_PROJECT_NAME=my-app
project.languageARROW_PROJECT_LANGUAGEexport ARROW_PROJECT_LANGUAGE=go
env.*ARROW_ENV_*export ARROW_ENV_NODE_ENV=production
vars.*ARROW_VARS_*export ARROW_VARS_TAG=v1.2.0

Environment variable overrides take precedence over values in arrow.yaml. This is useful for CI/CD environments where you want to inject values without modifying the config file.

Validating Configuration

Use arrow config validate to check your configuration for errors:

terminal
$ arrow config validate
Configuration is valid
 
$ arrow config validate --file pipelines/deploy.yaml
Configuration is valid

Global CLI Flags

These flags apply to all arrow commands:

FlagDescription
--configPath to config file (default: arrow.yaml)
--log-levelLog verbosity: debug, info, warn, error (default: info)
--no-colorDisable colored output
--helpShow help for any command
--versionPrint version information