Skip to main content
The pipeline viewer displays real-time execution state for a running workflow. It sits inside the playground and offers three view modes: Graph, Kanban, and Table.

Node execution statuses

Every node in a running pipeline is assigned one of these statuses by the backend:
StatusMeaning
idleJob created; dependencies not yet met
pendingReady to run; waiting in queue
runningCurrently executing
pausedExecution paused (e.g. rate limit, wait step)
interruptedWaiting for human input (human-in-the-loop)
completedFinished successfully
skippedNot executed — workflow completed/branched before this node ran
failedExecution failed
cancelledExplicitly cancelled

Kanban view

The kanban board groups nodes into columns by status. By default it uses a 4-column layout:
ColumnStatusesLogic
Pendingidle, pendingNot yet started
In Progressrunning, paused, interruptedActively in flight
Donecompleted, skippedTerminal success
Failedfailed, cancelledTerminal failure
When a column maps multiple statuses, each card displays a status pill showing the node’s exact status. This makes it easy to distinguish, for example, a paused node from a running one inside the same “In Progress” column.

Customising the kanban layout

Your backend can override the column layout per pipeline by returning a kanban_config object in the GET /pipelines/:id response. If this field is absent the frontend falls back to the 4-column default above.

Response shape

{
  "status": "running",
  "node_statuses": { ... },
  "job_status_summary": { ... },
  "kanban_config": {
    "columns": [
      {
        "key": "pending",
        "label": "Pending",
        "statuses": ["idle", "pending"],
        "icon": "mdi:clock-outline",
        "color": "var(--fd-muted-foreground)"
      },
      {
        "key": "in_progress",
        "label": "In Progress",
        "statuses": ["running", "paused", "interrupted"],
        "icon": "mdi:play-circle-outline",
        "color": "var(--fd-warning)"
      },
      {
        "key": "done",
        "label": "Done",
        "statuses": ["completed", "skipped"],
        "icon": "mdi:check-circle",
        "color": "var(--fd-success)"
      },
      {
        "key": "failed",
        "label": "Failed",
        "statuses": ["failed", "cancelled"],
        "icon": "mdi:alert-circle",
        "color": "var(--fd-error)"
      }
    ]
  }
}

Column fields

FieldTypeRequiredDescription
keystringUnique column identifier
labelstringColumn heading shown in the UI
statusesstring[]One or more node statuses that belong to this column
iconstringIconify icon name, e.g. mdi:check-circle
colorstringCSS color for the column accent — any valid CSS value, including var(--fd-success)

Status pill behaviour

The status pill on a card is shown automatically when a column’s statuses array has more than one entry. Single-status columns are assumed to be self-explanatory and show no pill.

Example: 3-column layout for a simple approval workflow

"kanban_config": {
  "columns": [
    {
      "key": "waiting",
      "label": "Waiting",
      "statuses": ["idle", "pending", "interrupted"],
      "icon": "mdi:clock-outline",
      "color": "var(--fd-muted-foreground)"
    },
    {
      "key": "active",
      "label": "Active",
      "statuses": ["running", "paused"],
      "icon": "mdi:play-circle-outline",
      "color": "var(--fd-warning)"
    },
    {
      "key": "terminal",
      "label": "Terminal",
      "statuses": ["completed", "skipped", "failed", "cancelled"],
      "icon": "mdi:flag-checkered",
      "color": "var(--fd-foreground)"
    }
  ]
}

Table view

The table view lists all nodes sorted by activity (running nodes first), with expandable rows showing execution details — last executed time, duration, and error message.

Custom views

Register additional views alongside the built-in three by passing a pipelineViews array. Each entry needs a unique key, a toggle button icon and label, and a Svelte component that receives PipelineViewProps.

Svelte component

<!-- MyTimelineView.svelte -->
<script lang="ts">
  import type { PipelineViewProps } from '@flowdrop/flowdrop/playground';

  let { pipelineId, workflow, endpointConfig, refreshTrigger }: PipelineViewProps = $props();
</script>

<div>Timeline for pipeline {pipelineId}</div>

Registering via mountPlaygroundStudio

import { mountPlaygroundStudio, createEndpointConfig } from '@flowdrop/flowdrop/playground';
import MyTimelineView from './MyTimelineView.svelte';

await mountPlaygroundStudio(container, {
  workflowId: 'wf-123',
  endpointConfig: createEndpointConfig('/api/flowdrop'),
  pipelineViews: [
    {
      key: 'timeline',
      label: 'Timeline',
      icon: 'mdi:chart-timeline-variant',
      component: MyTimelineView
    }
  ]
});

Registering via Svelte component

<script lang="ts">
  import { PlaygroundStudio } from '@flowdrop/flowdrop/playground';
  import MyTimelineView from './MyTimelineView.svelte';

  const extraViews = [
    { key: 'timeline', label: 'Timeline', icon: 'mdi:chart-timeline-variant', component: MyTimelineView }
  ];
</script>

<PlaygroundStudio workflowId="wf-123" extraPipelineViews={extraViews} />

PipelineViewDef fields

FieldTypeDescription
keystringUnique identifier — must not clash with graph, kanban, or table
labelstringTooltip text on the toggle button
iconstringIconify icon name
componentComponent<PipelineViewProps>Svelte component that receives the view props
The selected view key persists in localStorage under fd-pipeline-view-mode, so switching to a custom view and reloading restores it automatically.

Graph view

The graph view renders the workflow canvas in read-only mode with colour-coded node overlays:
Overlay colourStatuses
Blue (running)running, paused, interrupted
Green (completed)completed, skipped
Red (error)failed, cancelled
Amber (pending)pending, idle