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
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.
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):
BOOLEAN RULES
Do NOT specify any component: value for booleans. Labels must NOT start with "Is".
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
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.yamlhasstable,versions,icon-name, andmetadata.categoryTemplate
idis camelCase andnameis sentence caseStep
idis camelCase and stepnameis sentence casedescriptionis one sentence maximumAll 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:specificationBoolean labels do not start with "Is"
All field names are
snake_caseand all labels are Title CaseAll 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:
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
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
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
PROHIBITED COMPONENTS
boolean-card-select and boolean-card-switch must NOT be used.
Connector types
Use these values in the oneof field for connector inputs:
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
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:
Equals
${{field == 'value'}}
Not equals
${{field != 'value'}}
Boolean check
${{field == true}}
Expression syntax
${{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
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
BOOLEAN RULES
Never use component: boolean-card-select or component: boolean-card-switch. Boolean inputs use the default component; do not specify any component value. Labels must NOT start with "Is".
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).
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.yamlexists at the template root✓ Version directory exists (e.g.,
1.0.0/)✓
template.yamlexists inside the version directory
config.yaml
✓
stablefield is set to the current version✓
versions.prod1andversions.prod0are set✓
icon-nameis a valid, lowercase icon name✓
metadata.categorycontains- step
Template Metadata
✓
idis camelCase✓
nameis sentence case and human-readable✓
descriptionis one sentence maximum✓
versionis set to1✓
authoris lowercase✓
moduleis specified (cd,ci,iacm, orcustom)
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: stringwithcomponent: selectandoptions✓ Boolean inputs have NO
component:specified✓ Boolean labels do NOT start with "Is"
✓ Connector inputs have valid
oneofvalues
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
idis 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
withparameters
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.
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
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?