Command line

CommandWhat it does
workflow-render export <file.json> -o <out.svg|out.png> [--scale N] [--theme light|dark] [--overlay <findings.json>]Render a workflow or an execution to SVG or PNG, with a tool's findings drawn over it
workflow-render view <file.json> [--port N]Open the file in the browser viewer
workflow-render --versionPrint the version
workflow-render --helpPrint usage

export

workflow-render export workflow.json -o workflow.svg
workflow-render export workflow.json -o workflow.png --scale 3

redact

workflow-render redact workflow.json -o workflow.public.json
workflow-render redact execution.json -o - --mask 'n8n\.mycompany\.com' > public.json

Writes a copy of a workflow or execution with what you would not publish masked in place as [redacted: <kind>], so the structure stays readable and the copy still renders. The input is never changed, and -o cannot be the input file.

WhatMasked as
Credential references (credentials anywhere, including the copy of a node inside an execution's error): id and name. The credential type stayscredential
Workflow id, versionId, meta.instanceId, webhookId, an execution's id and workflowId, and the people and projects in an API export (shared, homeProject, owner)identifier
The value of a field or header whose name contains password, secret, api key, token, authorization, cookie or private key (an expression that is only a reference, like ={{ $env.API_KEY }}, stays); the same names in text: query strings and form bodies (?api_key=…), connection strings (;Password=…;), .env lines, object literals, YAML and JSON textsecret field
Bearer and Basic credentials, JWTs, private-key blocks, AWS key ids, Stripe, OpenAI, Slack, GitHub, GitLab, Google and SendGrid key formats, wherever they appear; secrets in URL paths (Slack and Discord webhooks, Telegram bot tokens, any long path segment with a digit, such as a webhook id)token
Email addressesemail
The user:password@ part of a URLurl credentials
Pinned data and execution item values (keys and item counts stay)data
Anything matching --mask '<regex>'custom

It prints what it masked and the hosts still present in URLs:

masked 14 values in workflow.json
  credential      2  Store › credentials.postgres, Notify › credentials.slackApi
  identifier      4  id, versionId, …
  email           2  Format Reply › parameters.assignments.assignments[0].value, …
  data            1  pinData › Webhook
hosts kept: api.example.com, db.example.test

Masking is pattern-based, so read the report before you publish. It does not catch a person's name in free text, a phone number, a short secret in a field with an ordinary name, or your own n8n hostname: add --mask for anything the report shows you would rather hide. Node names are not masked, because connections refer to them.

Export every workflow in CI

for f in workflows/*.json; do
  npx workflow-render export "$f" -o "renders/$(basename "${f%.json}").png"
done

view

workflow-render view workflow.json
workflow-render view execution.json --port 4777

Expected output:

workflow-render viewing execution.json
  http://127.0.0.1:4777/
Press Ctrl+C to stop.

Executions

Give view or export an execution instead of a workflow and the canvas shows the run.

An execution in the viewer: status pill, check marks, item counts and a loop-back edge

Exit codes and warnings

Exit codeMeaning
0The file was written, or the viewer stopped normally
1The input could not be read, or is not a workflow or execution
2Usage error, such as an unknown flag

Warnings go to stderr, prefixed warning:. The file is still written.

workflow-render export dangling.json -o dangling.svg

Expected output:

wrote dangling.svg
warning: connection to unknown node "Ghost" dropped

Getting the JSON out of n8n

WhatHow
A workflowIn the editor, open the … menu and choose Download, or call GET /api/v1/workflows/:id
An executionSave the response of GET /api/v1/executions/:id?includeData=true