For the complete documentation index, see llms.txt. This page is also available as Markdown.

Step Template Guide

A comprehensive guide for adding new step templates to the Harness Template Library; from non-technical overview to full technical schema reference.

A comprehensive guide for adding new step templates to the Harness Template Library. Covers everything from high-level concepts for non-technical stakeholders to the full technical schema reference for engineers, professional services, CX engineers, and sales engineers.


Part 1: Non-technical guide

What is a step template?

A step template is a reusable building block in Harness pipelines. Think of it like a recipe card: it defines a single action that a pipeline can perform, such as deploying to AWS, sending a Slack notification, or running a security scan. Each step template creates a form in the Harness UI where users fill in the required information, and the step handles the rest automatically.

When to create a new step template

  • You have a repeatable action that multiple teams or pipelines need to perform.

  • You want to standardize how a specific tool or service is used across your organization.

  • You need to wrap a container plugin into a user-friendly form.

  • An existing step template doesn't cover your use case.

What you need before starting

Question
Example Answer

What does this step do?

"Deploys a container to Amazon ECS"

What information does the user need to provide?

AWS region, cluster name, task definition

Which fields are required vs. optional?

Region and cluster are required; log level is optional

What container image runs this step?

harnessdev/ecs-deploy:1.0.0

What category does this belong to?

Deployment (cd) or Build (ci)

What icon should represent it?

aws, kubernetes, docker, etc.

How to request a new step template

If you are a PM or non-technical stakeholder, provide the following to your engineering team:


Part 2: Engineer guide

Step-by-step instructions for engineers to create a new step template from scratch.

Prerequisites: Access to the template-library Git repository, familiarity with YAML syntax, and knowledge of the container image your step will execute (image name, expected environment variables).

Step 1: Create the directory structure

Every template lives in the .harness/ directory with the following structure:

The directory name must be camelCase (e.g., ecsRunTaskStep, buildAndPushToDocker, slackNotificationStep).

Step 2: Create config.yaml

Create config.yaml in the template root directory. This file tracks versions and metadata.

Field
Required
Description

stable

Yes

The current stable version number

versions.prod1

Yes

Version deployed to production environment 1

versions.prod0

Yes

Version deployed to production environment 0

icon-name

Yes

Icon identifier (lowercase). See Available Icons appendix

module

No

Module association (e.g., - cd). Only needed for service-type filtering

metadata.category

Yes

Always - step for step templates

For specialized templates (e.g., Kubernetes-specific), add optional fields:

Step 3: Create template.yaml

Create template.yaml inside the version directory (e.g., 1.0.0/template.yaml). The file has four top-level sections inside template::

Step 4: Define inputs

Inputs define the form fields that users interact with. Each input has a type, label, and UI configuration.

String input:

String input with textarea:

Select input (dropdown):

Boolean input (toggle):

Connector input:

Array input:

Key-value pairs input:

Ghost input (hidden):

Secret input:

Step 5: Organize the layout

The layout section controls how fields appear in the UI form.

Layout rules: required fields without defaults appear at the top level; fields with defaults go in "Optional Configuration"; even if marked required: true; use a single "Optional Configuration" accordion section; non-boolean fields come before boolean fields within the section; maximum one level of nesting; only create subsections when there are 4 or more related fields.

For complex templates with many optional fields:

Step 6: Set template metadata

Field
Convention
Example

id

camelCase

ecsRunTaskStep

name

Sentence case, human-readable

ECS Run Task Step

description

One sentence, plain language

Runs a task on Amazon ECS.

version

Always 1

1

author

Lowercase

harness

module

Array of module codes

- cd

alias

Short, lowercase

run-task

Step 7: Define step execution

The step: section defines what actually runs when the step executes.

Pattern A: Container-based execution (most common)

Pattern B: Using with instead of env

Pattern C: Template reference (composable steps)

Pattern D: Conditional execution

Pattern E: Direct run (simplified)

Accessing connector properties:

Step 8: Validate your template

Before submitting, verify:

  • Directory name is camelCase

  • config.yaml has stable, versions, icon-name, and metadata.category

  • Template id is camelCase and name is sentence case

  • Step id is camelCase and step name is sentence case

  • description is one sentence maximum

  • All required fields (without defaults) are at the layout top level

  • Optional fields and fields with defaults are in "Optional Configuration"

  • Non-boolean fields come before boolean fields in Optional Configuration

  • Boolean inputs have no explicit component: specification

  • Boolean labels do not start with "Is"

  • All field names are snake_case and all labels are Title Case

  • All tooltips start with action verbs (Select, Enter, Enable, Specify)

  • Environment variables correctly reference inputs with ${{inputs.field_name}}

  • YAML syntax is valid (proper indentation, no tabs)

Step 9: Version your template

When updating an existing template, create a new version folder, copy template.yaml from the previous version, make changes, and update config.yaml:

Change Type
Version Bump
Example

Bug fixes, tooltip updates, minor UI changes

Patch (1.0.x)

1.0.0 → 1.0.1

New optional inputs, backward-compatible changes

Minor (1.x.0)

1.0.0 → 1.1.0

Breaking changes, removed inputs, schema changes

Major (x.0.0)

1.0.0 → 2.0.0


Part 3: Full schema reference

config.yaml schema

template.yaml schema

Input field types

Type
Description
UI Component

string

Text input

string (default), textarea, select, secret-input, ghost

boolean

Toggle switch

Default (no component specified)

connector

Harness connector selector

Connector picker

array

List of values

array

key-value-pairs

Key-value map

key-value-pairs

list

Complex structured list

list with layout: grid

number

Numeric input

number

secret

Sensitive value

Secret input

UI components

Component
Used With
Description

string

type: string

Single-line text input (default)

textarea

type: string

Multi-line text input

select

type: string + options

Dropdown selection

array

type: array

List builder

list

type: array or type: list

Grid-based structured list

key-value-pairs

type: key-value-pairs

Key-value pair editor

number

type: number

Numeric input field

secret-input

type: string

Masked sensitive input

secret-select

type: string

Masked sensitive dropdown

ghost

type: string

Hidden field (not rendered in UI)

radio

type: string

Radio button selection

display

type: string

Read-only display field

Connector types

Use these values in the oneof field for connector inputs:

Connector Type
Description

Aws

Amazon Web Services

Azure

Microsoft Azure

Gcp

Google Cloud Platform

docker

Docker registry

DockerRegistry

Docker registry (alternative)

Jira

Jira project management

Bamboo

Bamboo CI server

GitHubConnector

GitHub

GitlabConnector

GitLab

kubernetes

Kubernetes cluster

Step execution patterns

Pattern
When to Use
Key Fields

Container with env

Standard plugin execution

run.container.image, env

Container with with

Alternative variable passing

run.container.image, with

Template reference

Composing from existing templates

template.uses, template.with

Conditional (if)

Different behavior based on inputs

if expression on step

Direct run

Simple single-step execution

step.run without group

Conditional visibility

Fields can be shown or hidden based on other field values:

Operator
Example

Equals

${{field == 'value'}}

Not equals

${{field != 'value'}}

Boolean check

${{field == true}}

Expression syntax

Syntax
Usage
Example

${{inputs.field_name}}

Reference input values in env/with

${{inputs.region}}

<+inputs.field_name>

Alternative reference syntax

<+inputs.target>

${{inputs.connector.id}}

Access connector properties

${{inputs.connector.id}}

${{infra.region}}

Reference infrastructure values

${{infra.region}}

${{service.identifier}}

Reference service values

${{service.identifier}}

${{runtime.workspace}}

Reference runtime values

${{runtime.workspace}}


Part 4: Rules and standards

Naming conventions

Element
Convention
Correct
Incorrect

Template directory

camelCase

ecsRunTaskStep

ecs-run-task-step

Template ID

camelCase

ecsRunTaskStep

ECSRunTaskStep

Template Name

Sentence case

ECS Run Task Step

ecsRunTaskStep

Step ID

camelCase

runTask

run-task

Step Name

Sentence case

Execute Custom Action

executeCustomAction

Field names

snake_case

log_level

logLevel

Labels

Title Case

Log Level

log level

Boolean labels

No "Is" prefix

OpenShift Mode

Is OpenShift

Author

Lowercase

harness

Harness

Icon name

Lowercase

kubernetes

Kubernetes

Alias

Lowercase, short

run-task

RunTask

Technology name standards

Write Kubernetes not k8s, Elastic Container Service not just ECS, Elastic Compute Cloud not just EC2, Auto Scaling Group not just ASG.

Boolean input rules

Tooltip standards

All tooltips must start with an action verb: Select, Enter, Enable, Specify, Add, Set, Configure, Provide. Use complete sentences with proper punctuation, spell out acronyms, and keep them concise (1–2 sentences).

Input Type
Correct Tooltip

Connector

"Select the Harness AWS Connector for authentication."

Region

"Enter the AWS region where the service is located."

Boolean

"Enable this option to skip the steady state check."

Select

"Select the log level for step execution."

Array

"Add one or more tags for the Docker image."

File path

"Specify the path to the file containing the task definition."

Description standards

Descriptions must be a maximum of one sentence, use plain language that non-technical users can understand, and spell out technology names in full.


Part 5: Complete examples

Four complete, production-ready step template examples demonstrating different patterns.

Example 1: Simple step template (Email notification)

A minimal step template with basic string and select inputs.

Example 2: Step template with connector (S3 Upload)

A template that uses a connector input for authentication.

Example 3: Step template with conditional fields (Terraform)

A template where certain fields appear or hide based on another field's value.

Example 4: Step template with nested layout (API request)

A template with grouped optional fields using nested subsections.


Part 6: Validation checklist

Use this checklist before submitting a pull request with a new or updated step template.

File Structure

  • ✓ Template directory is inside .harness/

  • ✓ Directory name is camelCase (e.g., myNewStep)

  • config.yaml exists at the template root

  • ✓ Version directory exists (e.g., 1.0.0/)

  • template.yaml exists inside the version directory

config.yaml

  • stable field is set to the current version

  • versions.prod1 and versions.prod0 are set

  • icon-name is a valid, lowercase icon name

  • metadata.category contains - step

Template Metadata

  • id is camelCase

  • name is sentence case and human-readable

  • description is one sentence maximum

  • version is set to 1

  • author is lowercase

  • module is specified (cd, ci, iacm, or custom)

Input Fields

  • ✓ All field names are snake_case

  • ✓ All labels are Title Case

  • ✓ All required fields without defaults have required: true

  • ✓ All tooltips start with action verbs (Select, Enter, Enable, Specify)

  • ✓ All tooltips are complete sentences with proper punctuation

  • ✓ No acronyms without full spelling

  • ✓ Select inputs use type: string with component: select and options

  • ✓ Boolean inputs have NO component: specified

  • ✓ Boolean labels do NOT start with "Is"

  • ✓ Connector inputs have valid oneof values

Layout

  • ✓ Required fields without defaults appear at the top level

  • ✓ All optional fields and fields with defaults are in "Optional Configuration"

  • ✓ Non-boolean fields come before boolean fields in Optional Configuration

  • ✓ Nested subsections only used when there are 4+ related fields

  • ✓ Maximum one level of nesting under Optional Configuration

Step Execution

  • ✓ Step name is sentence case and human-readable

  • ✓ Step id is camelCase

  • ✓ Container image is specified with version tag

  • ✓ Environment variables correctly use ${{inputs.field_name}} syntax

  • ✓ All input fields are mapped to environment variables or with parameters

YAML Validity

  • ✓ Indentation uses spaces (not tabs)

  • ✓ All strings with special characters are properly quoted

  • ✓ No trailing whitespace

  • ✓ File ends with a newline

Appendix: Available icons

These icon names have been used in existing templates. Use lowercase values for the icon-name field.

Icon Name
Description

ai-verify

AI verification

aws

Amazon Web Services (general)

aws-cdk

AWS Cloud Development Kit

aws-sam

AWS Serverless Application Model

azure-functions

Azure Functions

bamboo-build

Bamboo CI builds

bandit

Bandit security scanner

docker

Docker containers

ecs

Amazon Elastic Container Service

email

Email notifications

git

Git operations

google

Google Cloud (general)

google-cloud-run

Google Cloud Run

harness

Harness platform

helm

Helm charts

http-step

HTTP requests

jenkins-build

Jenkins CI builds

jfrog

JFrog Artifactory

jira

Jira integration

kubernetes

Kubernetes

open-tofu

OpenTofu (Terraform alternative)

serverless

Serverless Framework

servicenow-approval

ServiceNow approvals

servicenow-create

ServiceNow record creation

servicenow-importset

ServiceNow import sets

servicenow-update

ServiceNow updates

ssh

SSH connections

ssca-orchestrate

Software supply chain assurance

terraform

Terraform

winrm

Windows Remote Management

Appendix: Available modules

Module
Description
Examples

cd

Continuous Deployment

ECS deploy, Kubernetes deploy, Helm deploy

ci

Continuous Integration

Build and push, cache management, artifact upload

iacm

Infrastructure as Code Management

Terraform, OpenTofu

custom

Custom/General purpose

HTTP steps, notifications

Last updated

Was this helpful?