# flowdiff: readable diffs and Git versioning for n8n workflows

**URL:** <https://community.n8n.io/t/flowdiff-readable-diffs-and-git-versioning-for-n8n-workflows/328122>\
**Category:** Built with n8n\
**Created:** [November 11, 2026, 2:46pm UTC](https://community.n8n.io/t/flowdiff-readable-diffs-and-git-versioning-for-n8n-workflows/328122 "2026-11-11T14:46:17Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![akfdev](https://dub1.discourse-cdn.com/n8n/user_avatar/community.n8n.io/akfdev/32/199152_2.png) [@akfdev](https://community.n8n.io/u/akfdev)\
**Post date:** [November 11, 2026, 2:46pm UTC](https://community.n8n.io/t/flowdiff-readable-diffs-and-git-versioning-for-n8n-workflows/328122/1 "2026-11-11T14:46:17Z")

</div>

Hi everyone,

I run n8n for my own automations, and I kept running into the same question after something broke: _what actually changed?_ Version history is short on the free self-hosted edition, and when I backed my workflows up to GitHub, the diffs were hundreds of lines of raw JSON: timestamps, IDs and canvas positions, with the real change buried somewhere in the middle.

 ![image](https://europe1.discourse-cdn.com/n8n/original/3X/c/e/cedcf6a743dc9ab98a176f3d070f941b97b7a50a.png)

So I built **flowdiff** , a free, open-source CLI that works with any n8n edition through the public API. It pulls your workflows into Git and shows every change as a readable line:

```auto
~ node "Set Defaults" renamed to "Prepare Request"
⚠ "Fetch Items" › url references "Set Defaults",
  which is not a node in this workflow
~ param "Is Active?" › "active" → "enabled"

```

## What it does

- `pull`, `diff`, `status` and `push`, where push shows exactly what will change, asks first, backs up the current version and refuses if someone edited the workflow in the meantime
- Line-by-line diffs for Code nodes and AI prompts
- Warnings when a rename breaks a node reference, or when a key looks hard-coded (values are redacted in the output)
- A GitHub Action that posts the readable diff as a pull request comment, so teammates can review workflow changes like code
- Pull, diff and status work with a read-only API key; push never activates a workflow on its own

## A few things I learned about n8n along the way

- Saving in the editor removes parameters that match their defaults, so one rename showed up as seven changes. flowdiff now groups those separately as “possible defaults.”
- Updating an active workflow through the API publishes it immediately unless you pass `publishIfActive=false`, which flowdiff always does.

## Try it

```auto
npm install -g @akojif/flowdiff
flowdiff init
flowdiff pull
flowdiff diff

```

- GitHub: [GitHub - akojif/flowdiff: Version control and readable diffs for n8n workflows, via the n8n public API. · GitHub](https://github.com/akojif/flowdiff)
- Demo pull request with the Action’s comment: [Sample changes: rename, IF branch, Code edit, pasted token by akojif · Pull Request #3 · akojif/flowdiff-demo · GitHub](https://github.com/akojif/flowdiff-demo/pull/3)
- The story of how I built it: [https://medium.com/@akfdev/my-n8n-workflow-broke-i-couldnt-tell-what-changed-44065b913a66](https://medium.com/@akfdev/my-n8n-workflow-broke-i-couldnt-tell-what-changed-44065b913a66)

If you’re on Enterprise, n8n’s built-in Git source control may already cover what you need; flowdiff is aimed at readable review and checks for everyone else. It’s an independent project, not affiliated with n8n.

I’d really appreciate feedback, especially from teams with many workflows: what would make this useful in your setup? Next ideas are scheduled backups and an MCP mode.
