Supported combination: platform 2026.10.1rc17 · tooling 2026.10.1rc17.
Develop Actions

Build your first Action

Scaffold a typed Python Action and execute it locally.

Custom Actions extend the operations your team can automate. This guide is for integration authors. To use existing Actions or deployed workflows, start with Run your first workflow.

Prerequisites

Install the pyplines-action binary for your operating system and architecture from the matching GitHub release. Put it on your PATH and check pyplines-action version.

With pyplines-installer installed, create an Action tooling configuration and apply it:

Terminal
pyplines-installer init --preset action --output action-tools.yml
pyplines-installer run action-tools.yml
pyplines-action version

See Action CLI installation for tooling version selection, authentication, and PATH setup.

Local development also requires Docker Engine or Desktop with Buildx, uv (tested with 0.12.18), and Python 3.14. The Docker daemon must have access to the same filesystem paths as the CLI.

Create the project

Terminal
pyplines-action init ./hello-world

The command creates the project and generates uv.lock. Commit both pyproject.toml and uv.lock. The Action's declared SDK requirement and lock select its runtime bases.

Write the handler

Replace src/hello_world/__init__.py with the handler below, and save the input file in the project directory. The highlighted lines declare the input and output contracts.

from pyplines.actions import Context, Inputs, Outputs

class HelloInputs(Inputs):
    name: str

class HelloOutputs(Outputs):
    greeting: str

def handler(inputs: HelloInputs, context: Context) -> HelloOutputs:
    context.log("Preparing greeting")
    return HelloOutputs(greeting=f"Hello, {inputs.name}!")

The scaffold declares the handler entry point in pyproject.toml. The input file supplies the name field declared by HelloInputs.

Run locally

Local execution
Command
pyplines-action run ./hello-world --input ./hello-world/input.json
Expected output
{"greeting": "Hello, Engineer!"}

Successful output contains {"greeting":"Hello, Engineer!"}. Action logs go to stderr; redirected stdout contains the output JSON object.

Validate the packaged Action

Terminal
pyplines-action run ./hello-world --input ./hello-world/input.json --packaged
pyplines-action validate ./hello-world

Packaged execution tests the installed Action. Validation builds the image and captures its typed interface. Continue with local development and publishing.