---
title: "Building and Debugging a Workflow"
canonical: https://trickest.com/docs/using-the-app/workflow-and-executions/building-and-debugging-a-workflow
description: "Configure and test one node, inspect its output, connect another node, and run the workflow."
---

# Building and Debugging a Workflow

Build a workflow one step at a time. Test a node with a small input, check what it produced, then connect the next step. A completed run tells you execution finished; inspecting the output tells you whether it did what you intended.

## Before you start

Open an editable workflow, or [copy one from the Library](./using-workflows-from-the-library). You need permission to edit and run it, plus an available execution fleet. On Community, [connect a self-hosted machine](../private-execution-networking/using-self-hosted-machines) before running nodes.

This example connects **Subfinder v2.8.0** to **dnsx v1.2.2**: discover subdomains, then resolve their DNS records. The screenshots use `trickest.com` to illustrate the configuration; replace it with a domain you are authorized to test. They show configuration, not a completed execution. Input names and output formats can differ in other tool versions.

The example nodes are named **Find subdomains** and **Resolve DNS**. These are optional labels: double-click a node's name to rename it without changing its tool.

## 1. Add a Node on the Canvas

<Steps>
  <Step title="Find a tool">
    Select **Add node (+)** in the bottom canvas toolbar. Search for the tool you need, such as `subfinder`.
  </Step>
  <Step title="Add it to your workflow">
    Select the result to add a node. Open that node to configure it before running it.
  </Step>
</Steps>

<Frame editorial maxWidth="380px" darkSrc="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/add-node-dark-fe41be64e0e4" caption="Search for subfinder in Add node. The plus button in the bottom toolbar opens this picker.">
  <img src="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/add-node-1c5aa09f851f" alt="Add node search field and subfinder result." />
</Frame>

A tool packages a command-line program. A [script](/docs/key-concepts/building-blocks/scripts) runs code you provide; a [module](/docs/key-concepts/building-blocks/modules) contains a reusable workflow. Choose the building block that fits the step.

## 2. Configure and Run a Single Node

<Steps>
  <Step title="Open the inputs">
    Select the node and choose **Open node** from its floating controls, or double-click its body. Double-clicking the name renames it. If its input panel is hidden, select **Show inputs**. Read each input's description and supply the values or files your task needs.
  </Step>
  <Step title="Check the configuration">
    For **Subfinder v2.8.0**, set **domain** to your target domain and enable **silent** for output containing discovered names. The screenshot uses `trickest.com`. Review the generated command and any validation messages before running.
  </Step>
  <Step title="Run this node">
    Select **Run** in the node controls (**Run ×N** for a distributed node). This tests the selected node and may run upstream dependencies if their results cannot be reused. **Run with downstream nodes**, when available in the adjacent menu, also runs the steps connected after it.
  </Step>
</Steps>

<Frame editorial darkSrc="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/subfinder-dark-2ef463dea260" caption="Find subdomains uses Subfinder v2.8.0 with domain set to trickest.com and silent enabled. Run starts the node.">
  <img src="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/subfinder-1ea74631810a" alt="Find subdomains configuration showing the domain input, silent option, and Run control." />
</Frame>

For file inputs, provide a file or connect an upstream output that matches the input's expected format. Flags enable options; text and numeric inputs supply values. Follow the descriptions shown for your node rather than filling every optional input.

<Note>
  If you opened a historical run, its configuration is read-only. Select **Edit workflow** in the header run chip before making changes. Viewing a run and editing the workflow are separate actions.
</Note>

## 3. Validate Results and Iterate

Inspect both the execution status and the resulting data.

For an ordinary tool node, the console tab may use the tool's name, such as **subfinder**. Read its command output and diagnostic messages. Select **Show files** if the file tree is hidden, then open a file under **Outputs** to preview its contents. **Inputs** contains the files supplied to the node.

For a distributed node, select a task in the task sidebar, then use **Console** or **Files** to inspect that task. Check the output you intend to pass to the next node, including its contents and format.

For this connection, inspect the Subfinder output for plain hostnames, one per line, so dnsx can read them as a host list. Check the actual file after running; the screenshots do not demonstrate an output. Discovery can return no matches, and no particular hostname or result count is guaranteed.

| What you see | What to check next |
| --- | --- |
| The node has not started | Check run status and whether the selected fleet has an available machine. |
| The task failed | Read the console for the reported error, then check the relevant input or configuration. |
| The task completed but output is empty | Check whether the input and selected options should produce matches. Empty output is not enough to diagnose a failure. |
| Output exists but has the wrong format | Check the tool's output options before connecting it to a downstream input. |

Change one relevant setting, run the node again, and compare the result. This keeps a configuration change separate from a change in input data.

## 4. Add and Connect a Downstream Node

<Steps>
  <Step title="Add the next tool">
    Open **Add node** and add `dnsx`. The example uses **dnsx v1.2.2**, labelled **Resolve DNS**.
  </Step>
  <Step title="Connect the nodes">
    Drag from the first node's output handle to the next node's input handle. The receiving node opens with **Choose which parameter receives the output**. Select the input that accepts the output you want to pass.
  </Step>
  <Step title="Verify the input mapping">
    For **dnsx v1.2.2**, choose **list**, described as “list of sub(domains)/hosts to resolve (file or stdin)”. Open **Resolve DNS** and confirm that **list** shows the connected **Find subdomains** node. Check the input description again if you use another version.
  </Step>
  <Step title="Test the next step">
    Configure any other inputs the receiving node needs, then run it and inspect its console and output files. If the upstream output is missing, run the upstream node first.
  </Step>
</Steps>

<Frame editorial darkSrc="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/connection-dark-6f66de5da11c" caption="Resolve DNS receives Find subdomains through its list input. The connection supplies the host list to dnsx.">
  <img src="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/connection-4f097df0e0d0" alt="Resolve DNS input configuration with the Find subdomains connection in the list input." />
</Frame>

A connection supplies data to a specific input. It does not configure the receiving tool's other options. This example also enables **a**, **cname**, **json**, **omit-raw**, **resp**, and **silent** in dnsx. Review their descriptions and choose the DNS queries and output format your task needs.

## 5. Continue Building

When both steps produce the data you expect, return to the canvas and use **Execute** to run the workflow. Review the resulting run to confirm the connected steps work together.

[Executing and Scheduling Workflows](./executing-and-scheduling-workflows) explains execution options, fleet selection, and recurring runs. [Working with Runs](./working-with-runs) explains statuses and how to inspect previous executions.

Add further nodes using the same cycle: configure, run, inspect, then connect. Test a small input before increasing the workload or [distributing jobs](./distributing-and-scaling-jobs).

## 6. Restore a Past Run's Version

Restore replaces the live workflow definition with the version recorded for a previous run. Use it when you want to return to that configuration, rather than only inspect its results.

<Steps>
  <Step title="Open the previous run">
    Open the workflow's run history and select the run whose workflow version you want to restore.
  </Step>
  <Step title="Review the version">
    Inspect the recorded configuration. For an eligible earlier version, select **Restore** in the header run chip, or **Restore this version…** in **Workflow actions**.
  </Step>
  <Step title="Confirm the replacement">
    Read **Restore to this version?** before selecting **Restore**. Cancel if you want to keep the current workflow.
  </Step>
</Steps>

<Frame editorial maxWidth="440px" darkSrc="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/restore-dark-7566ada2d801" caption="Review this warning before restoring. Cancel keeps the current workflow unchanged.">
  <img src="https://res.cloudinary.com/db14crach/image/upload/www/docs/v2-ui-2026-10-01/editor/restore-4364ca13f6f8" alt="Restore to this version confirmation warning that the current workflow is replaced and unsaved changes are lost." />
</Frame>

<Warning>
  Restore replaces the current workflow definition and discards unsaved changes. Keep a separate copy of changes you want to preserve before confirming.
</Warning>

Restore requires write access and a run whose workflow differs from the current version. Moving nodes alone does not make a run eligible. Other workflow states, such as a scheduled workflow or active agent generation, can also make restoration unavailable.

Restore does not start a new run. Review the restored workflow's inputs before executing it.

---
_Markdown source of https://trickest.com/docs/using-the-app/workflow-and-executions/building-and-debugging-a-workflow._
