---
sidebar_label: Your first workflow
toc_max_heading_level: 3
doc_id: 9c8ad101-f486-4e18-8a84-efe7cadd1edf
description: >-
  Describe your first workflow in plain language, refine it in the visual
  editor, run it, and activate it.
keywords:
  - workflows
  - getting started
  - first workflow
  - workflow editor
  - np-workflow
  - nullplatform
---

import WorkflowCanvas from '@site/src/components/WorkflowCanvas';
import helloWorld from '@site/src/components/WorkflowCanvas/examples/hello-world';

# Your first workflow

## What you'll build

A tiny workflow: 
- a manual trigger that asks for a `name`, and 
- a code step that returns a greeting for that name.

No infrastructure, no cloud credentials, nothing to connect. What matters is the loop around it: describe it, see it in the editor, run it, activate it. Every real workflow follows this same loop with more steps.

## Before you start

The only prerequisite is the **np-workflow skill**, part of the nullplatform AI plugins for your coding assistant (Claude Code, Kiro, Cursor, and others). Follow [Set up the AI plugins](/docs/ai-ops/ai-plugins) to install them and configure your API key.

## 1. Describe it

In a session of your coding assistant with the plugin installed, ask for the workflow:

```
/np-workflow create a workflow named hello-world with a manual trigger that
takes a name input, and a code step that returns a greeting for that name
```

The skill builds the definition, validates it, and publishes it to your organization, activated and ready to run. You describe the outcome; it picks the trigger and wires the step for you.

> 💡 **Tip:** Prefer to review before it goes live? Ask the skill to skip activation, and the workflow stays saved as a draft you can open in the editor.

## 2. See it in the editor

In the nullplatform UI, open **Platform Settings → Workflow Editor** and pick the hello world. The canvas draws two connected nodes: the manual trigger and the code step. Explore the same result below, click a node to see the step it runs:

<WorkflowCanvas workflow={helloWorld} />

Small as it is, this workflow shows the whole model:

**The trigger starts the run and feeds it inputs.** The `name` input it declares is what the RUN dialog renders as a form, and steps receive whatever the person types as `${{ workflow.inputs.name }}`.

**The step reads data through expressions.** The code step declares what it needs in its `inputs` block, wired with an [expression](/docs/workflows/building-blocks/expressions):

```yaml
inputs:
  name: "${{ workflow.inputs.name }}"
```

Whatever a step returns becomes its outputs, ready for the next step to read the same way. That's the entire data flow: outputs, expressions, inputs, repeated.

{/* Commented out until the node creator in the UI is verified working:
> 💡 **Tip:** You don't need a prompt to build a workflow: you can add the trigger and steps node by node in the editor, from an empty canvas. Describing it is simply the fastest way in.
*/}

## 3. Run it

Hit **RUN**. A dialog opens with a form built from the trigger's inputs: type a name and submit. A run this small finishes in under a second, and the run view highlights each node as it executes.

<video width="100%" autoPlay loop muted playsInline className="helper-image">
  <source src="/img/workflows/run-observe.mp4" type="video/mp4" />
</video>

Click a step to see what happened inside it: the inputs it received, the outputs it returned, and its logs, all scoped to that run. Your greeting shows up in the code step's outputs. A failed step turns red and shows its error, so the failing step and its reason are one click away.

> 💡 **Tip:** You can inspect the same run without leaving the terminal: ask your coding assistant to "show me the last run of hello-world and its logs".

## 4. Activate it

**Activation is the moment a workflow goes live**: schedules get registered, entity triggers start listening. For this hello world, whose only trigger is manual, it simply makes it runnable outside the editor. And activation never starts a run: the execution count stays at zero until someone hits RUN.

The skill already activated the workflow when it published it, so there's nothing left to do here, unless you edited a step in the editor: saving creates a new version, and a saved version isn't active on its own. Click **ACTIVATE** in the toolbar, right next to RUN, to make it the one that runs.

All done! 🎉 Feel free to deactivate or delete the hello world once you're done playing with it.

## Where to next

You now know the whole loop: describe, inspect, run, activate. Every workflow you'll ever build is this same loop with more steps, so point it at a real problem: 🚀

- [Detect and roll out AMI updates](/docs/tutorials/ami-drift): a full drift-detection suite built from the same pieces you just used
- [Building blocks](/docs/workflows/building-blocks/): everything a step can do
- [Learning path](/docs/workflows/#learning-path) on the workflows landing page for more tutorials
