Dataflow Debugger

Developer tooling

Open application

Overview

Build, run and understand a dataflow in one local workspace.

A browser-based environment for building, running and debugging Azure Data Factory (ADF) Mapping Data Flows locally. These visual flows describe how data is filtered, combined and reshaped. I built it to shorten the wait between changing a flow and understanding its results.

The workspace combines a familiar graph editor with previews that update automatically after changes. Transformation View explains how transformations affect the data. Work is saved locally, and ADF-compatible import and export keep flows usable in Azure.

React TypeScript React Flow IndexedDB Vitest Playwright IIS

Flow editor

A familiar graph for local debugging.

I kept the graph layout and activity connections close to ADF’s visual editor, so existing flows feel familiar. The branching structure makes it easy to follow the data from input to output while working locally.

Dataflow Debugger graph branching from InputData through select, split, aggregate and derived-column activities, then combining results, sorting by date and writing OutputData.

THE PROBLEM & THE RESPONSE

A quicker path from Change Answer

Swipe or use ← → to compare Azure Data Factory and Dataflow Debugger.

Azure Data Factory

Debugging workflow

Checking an activity meant refreshing its preview and waiting for Azure to return the result. Every change restarted that cycle. Repeating it across activities made tracing a value through the flow time-consuming.

  1. Preview
  2. Wait
  3. Change
  4. Repeat

Preview coverage

One activity at a time

Refresh each activity’s preview separately.

Performance

21.64 s / per activity

Median time per activity with a 1,000-row preview limit. At the average preview time, 29 sequential previews would take ~14 minutes.

Data persistence

Rerun to revisit - ADF Data Preview results are transient. Revisiting an earlier activity after previewing further downstream can require rerunning its preview.

Dataflow Debugger

Debugging workflow

After an initial preview, changes propagate through the flow and affected previews update automatically. I can move between activities and inspect the results in one local workspace, without manually refreshing each preview.

  1. Preview
  2. Change
  3. Previews update automatically

Preview coverage

Entire dataflow

Populates every activity’s data preview in a single pass.

Performance

192 ms / whole dataflow

Median time to calculate and propagate all activity previews across the same 29-activity dataflow, each with a 1,000-row limit.

Data persistence

Previews persist - Preview data is retained for all activities. Jump freely between them and inspect the results without rerunning a data preview.

Transformation View

Data preview only shows the result, transformation view shows how it got there

Local execution made it easier to try a change. The next step was making the result easier to understand. Selecting Transformation View displays the selected activity’s manipulation of the data.

Engineering

An editor, execution engine and explanation layer.

React and TypeScript handle the workspace and local engine. The application parses ADF Data Flow Script, plans the order of dependent activities, evaluates expressions and runs transformations in the browser.

The production application needs no API for execution or storage. IIS serves the static files; IndexedDB retains the local workspace. Keeping these responsibilities in the browser makes the edit–run–inspect loop independent of an Azure debug session.

Components & relationships

Browser application architecture

IISStatic application hosting
Serves app files to the browser
Your browser Local execution & storage

Workspace UI

Flow editor

Import, edit and export ADF flows

Transformation View

Display results and their execution lineage

Flow definition UI to engine
Rows + provenance Engine to UI

Execution engine

Parser & dependency planner

Build execution order from the flow definition

Local executor

Run transformations; produce rows and provenance together

IndexedDBLocal workspace persistence
Local CSV filesInput data for transformations

Explain the execution that actually happened

The executor records which input rows produced each result as it runs. Transformation View uses that lineage rather than guessing from matching values, so duplicate values and unmatched join rows can be explained accurately.

Keep local work compatible with ADF

Import and export preserve ADF resource data while allowing controlled graph edits. The local workspace supports investigation without making the flow a separate, incompatible format.

Keep previews usable as data grows

Tables render the visible rows and columns rather than the entire dataset. Cooperative cancellation prevents stale or cancelled previews from replacing current results.

Outcome

Less waiting to inspect. More clarity about why.

I can follow an unexpected result back through a flow, test a change and check its effect while keeping the investigation in one workspace. What began as a way to reduce preview waiting has become a tool for understanding behaviour: the evidence behind a result is available alongside the result itself.

Dataflow Debugger graph