AutomationFlowsWeb Scraping › Generate an Auto-updating Svg Stats Badge on Github From Your Creator Profile

Generate an Auto-updating Svg Stats Badge on Github From Your Creator Profile

ByMihajlo @mihajlo on n8n.io

Showcase your n8n creator profile with a dynamically generated SVG stats badge, automatically pushed to any GitHub repository on a schedule — ready to embed in your README in seconds.

Cron / scheduled trigger★★★★☆ complexity16 nodesHTTP RequestGitHub
Web Scraping Trigger: Cron / scheduled Nodes: 16 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #15643 — we link there as the canonical source.

This workflow follows the GitHub → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "7cda91ee-7ca0-4412-82d0-c6d974f2c052",
      "name": "README \u2013 Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 500,
        "height": 712,
        "content": "## \ud83d\udcca n8n Creator Stats Card\n**Automatically generates and pushes an SVG profile badge to GitHub, showing your n8n creator stats \u2014 perfect for embedding in a GitHub README.**\n\n---\n\n### \ud83d\udc64 Who is this for?\nAnyone who publishes templates on n8n.io and wants a live stats badge on their GitHub profile or repository README.\n\n---\n\n### \u2699\ufe0f How it works\n1. **Schedule Trigger** fires on your chosen interval (default: daily)\n2. **Config** \u2014 single node where you set all your personal details\n3. **Fetch Creator Profile** \u2014 pulls your stats from the n8n community API\n4. **Parse User** \u2014 extracts name, avatar URL, and workflow counts\n5. **Download & Encode Avatar** \u2014 fetches your avatar image and converts it to Base64\n6. **Build SVG** \u2014 assembles a styled 495\u00d7190px SVG card with your stats\n7. **GitHub Push** \u2014 edits the existing file, or creates it if it doesn't exist yet\n8. **Final URLs** \u2014 outputs the raw and CDN-cached URLs to embed\n\n---\n\n### \ud83d\ude80 Setup (5 steps)\n1. Open the **\u2699\ufe0f Config** node and fill in all 7 fields\n2. Add your **GitHub credentials** to both GitHub nodes (Edit & Create)\n3. Make sure the target GitHub repository exists and is **public**\n4. *(Optional)* Adjust the **Schedule Trigger** interval\n5. **Activate** the workflow \u2014 it will run automatically going forward\n\n---\n\n### \ud83d\uddbc\ufe0f Embed in your README\n```\n![n8n Stats](https://raw.githubusercontent.com/YOUR_GH_USERNAME/YOUR_REPO/main/n8n-stats.svg)\n```"
      },
      "typeVersion": 1
    },
    {
      "id": "9a61cdc2-4b7d-4fc5-a6d0-eee7d7b283d9",
      "name": "Note \u2013 Config Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        528,
        112
      ],
      "parameters": {
        "color": 4,
        "width": 260,
        "height": 100,
        "content": "### \ud83d\udd27 Step 1 \u2014 Configure\nEdit the **\u2699\ufe0f Config** node below.\nFill in every field before activating."
      },
      "typeVersion": 1
    },
    {
      "id": "a321bd7f-82c7-4575-bea0-eeeb0d1b725a",
      "name": "Note \u2013 Fetch Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        112
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 120,
        "content": "### \ud83c\udf10 Step 2 \u2014 Fetch & Parse\nRetrieves your public creator profile\nfrom the n8n community API and\nextracts name, avatar, and workflow counts."
      },
      "typeVersion": 1
    },
    {
      "id": "ce13f560-e72a-404f-95f3-b23f38dd267d",
      "name": "Note \u2013 SVG Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1248,
        112
      ],
      "parameters": {
        "color": 6,
        "width": 300,
        "height": 110,
        "content": "### \ud83d\uddbc\ufe0f Step 3 \u2014 Build SVG\nDownloads your avatar, encodes it\nto Base64, then assembles the\nfull SVG stats card."
      },
      "typeVersion": 1
    },
    {
      "id": "19058e58-d618-4257-9f7d-8e7a551c8f7d",
      "name": "Note \u2013 GitHub Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1824,
        32
      ],
      "parameters": {
        "color": 3,
        "width": 300,
        "height": 140,
        "content": "### \ud83d\udce4 Step 4 \u2014 Push to GitHub\nTries to **edit** the existing file first.\nIf the file doesn't exist yet, the error\noutput routes to **Create** instead.\n\n\u26a0\ufe0f Add GitHub credentials to **both** nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "af926830-51a6-4f0f-9857-e8abadaa2a73",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        384,
        288
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "3232f21a-03ec-4d97-b160-be439324d8a4",
      "name": "\u2699\ufe0f Config",
      "type": "n8n-nodes-base.set",
      "position": [
        608,
        288
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "n8n_creator_username",
              "stringValue": "YOUR_N8N_COMMUNITY_USERNAME"
            },
            {
              "name": "text_color_hex",
              "stringValue": "#ffffff"
            },
            {
              "name": "icons_color_hex",
              "stringValue": "#ffffff"
            },
            {
              "name": "border_color_hex",
              "stringValue": "#ffffff"
            },
            {
              "name": "card_color_hex",
              "stringValue": "#3369b3"
            },
            {
              "name": "github_username",
              "stringValue": "YOUR_GITHUB_USERNAME"
            },
            {
              "name": "github_repository",
              "stringValue": "YOUR_GITHUB_REPOSITORY"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "2aa177c2-32a3-4c2d-8c13-e47e029c00c1",
      "name": "Fetch Creator Profile",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        864,
        288
      ],
      "parameters": {
        "url": "=https://n8n-s4.nskha.com/creators/{{ $json['n8n_creator_username'] }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "+https://openai.com/bot"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "44a38753-78a5-48f6-bfde-92a0c01a68ec",
      "name": "Parse Creator Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1088,
        288
      ],
      "parameters": {
        "jsCode": "const d = items[0].json.data || items[0].json;\n\nconst name   = d.name || d.username || 'Creator';\nconst avatar = d.avatar\n  ? d.avatar.replace('size=200', 'size=100')\n  : `https://api.dicebear.com/7.x/initials/png?seed=${encodeURIComponent(name)}&backgroundColor=ea4b71&textColor=ffffff`;\n\nconst total    = d.workflowsCount || 0;\nconst approved = d.workflowsCount || 0;\n\nreturn [{ json: { name, avatar, total, approved } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "e14cb4b9-bb4b-484d-8595-261e0b795aa2",
      "name": "Download Avatar",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1264,
        288
      ],
      "parameters": {
        "url": "={{ $json.avatar }}",
        "options": {}
      },
      "typeVersion": 4.1
    },
    {
      "id": "6de52db1-457f-45e0-ad41-16c652dca0ce",
      "name": "Encode Avatar to Base64",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1472,
        288
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery",
        "destinationKey": "imgdata"
      },
      "typeVersion": 1
    },
    {
      "id": "029f4f7b-d669-45a2-a370-5a6c113d3677",
      "name": "Build SVG Card",
      "type": "n8n-nodes-base.set",
      "position": [
        1664,
        288
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "svg",
              "stringValue": "=<svg width=\"495\" height=\"190\" viewBox=\"0 0 495 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<style>\n<![CDATA[\n.text{ font-family: Tahoma, Geneva, Verdana, sans-serif; fill: {{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"text_color_hex\"] }}; font-size: 13px;}\n.sub{ font-family: Tahoma, Geneva, Verdana, sans-serif; fill: {{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"text_color_hex\"] }}; font-size: 11px; opacity:0.75;}\n.namepl{ font-family: Helvetica, sans-serif; fill: {{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"text_color_hex\"] }}; font-size: 15px; font-weight: 600; text-anchor: middle;}\n.icon{ fill: {{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"icons_color_hex\"] }};}\n.row{ opacity:0; animation: fade 0.3s ease-in-out forwards;}\n@keyframes fade{ from{opacity:0.5;} to{opacity:1;}}\n]]>\n</style>\n<rect x=\"0.5\" y=\"0.5\" rx=\"4.5\" height=\"99%\" width=\"494\" fill=\"{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"card_color_hex\"] }}\" stroke=\"{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"border_color_hex\"] }}\" stroke-opacity=\"1\"/>\n<g transform=\"translate(0,20)\">\n  <defs>\n    <pattern id=\"av\" x=\"0%\" y=\"0%\" height=\"100%\" width=\"100%\" viewBox=\"0 0 100 100\">\n      <image x=\"0%\" y=\"0%\" width=\"100\" height=\"100\" xlink:href=\"data:image/png;base64,{{ $item(\"0\").$node[\"Encode Avatar to Base64\"].json.imgdata }}\"></image>\n    </pattern>\n  </defs>\n  <circle cx=\"76\" cy=\"52\" r=\"44\" fill=\"{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"border_color_hex\"] }}\"/>\n  <circle cx=\"76\" cy=\"52\" r=\"42\" fill=\"url(#av)\"/>\n  <text x=\"76\" y=\"112\" class=\"namepl\">{{ $item(\"0\").$node[\"Parse Creator Data\"].json.name }}</text>\n  <text x=\"76\" y=\"130\" class=\"sub\" text-anchor=\"middle\">n8n Creator</text>\n  <line x1=\"160\" y1=\"10\" x2=\"160\" y2=\"160\" stroke=\"{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"border_color_hex\"] }}\" stroke-width=\"0.5\"/>\n  <g class=\"row\" style=\"animation-delay:100ms\" transform=\"translate(175,15)\">\n    <svg class=\"icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" y=\"1\"><path fill-rule=\"evenodd\" d=\"M0 1.75A.75.75 0 01.75 1h4.253c1.227 0 2.317.59 3 1.501A3.744 3.744 0 0111.006 1h4.245a.75.75 0 01.75.75v10.5a.75.75 0 01-.75.75h-4.507a2.25 2.25 0 00-1.591.659l-.622.621a.75.75 0 01-1.06 0l-.622-.621A2.25 2.25 0 005.258 13H.75a.75.75 0 01-.75-.75V1.75z\"/></svg>\n    <text class=\"text\" x=\"22\" y=\"13\">Total Workflows</text>\n    <text class=\"text\" font-weight=\"700\" x=\"295\" y=\"13\" text-anchor=\"end\">{{ $item(\"0\").$node[\"Parse Creator Data\"].json.total }}</text>\n  </g>\n  <g class=\"row\" style=\"animation-delay:200ms\" transform=\"translate(175,55)\">\n    <svg class=\"icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" y=\"1\"><path fill-rule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"/></svg>\n    <text class=\"text\" x=\"22\" y=\"13\">Approved Workflows</text>\n    <text class=\"text\" font-weight=\"700\" x=\"295\" y=\"13\" text-anchor=\"end\">{{ $item(\"0\").$node[\"Parse Creator Data\"].json.approved }}</text>\n  </g>\n  <g class=\"row\" style=\"animation-delay:300ms\" transform=\"translate(175,95)\">\n    <svg class=\"icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" y=\"1\"><path fill-rule=\"evenodd\" d=\"M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z\"/></svg>\n    <text class=\"text\" x=\"22\" y=\"13\">Community Username</text>\n    <text class=\"text\" font-weight=\"700\" x=\"295\" y=\"13\" text-anchor=\"end\">{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"n8n_creator_username\"] }}</text>\n  </g>\n  <g class=\"row\" style=\"animation-delay:400ms\" transform=\"translate(175,135)\">\n    <svg class=\"icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" y=\"1\"><path fill-rule=\"evenodd\" d=\"M1.679 7.932c.412-.621 1.242-1.75 2.366-2.717C5.175 4.242 6.527 3.5 8 3.5c1.473 0 2.824.742 3.955 1.715 1.124.967 1.954 2.096 2.366 2.717a.119.119 0 010 .136c-.412.621-1.242 1.75-2.366 2.717C10.825 11.758 9.473 12.5 8 12.5c-1.473 0-2.824-.742-3.955-1.715C2.92 9.818 2.09 8.69 1.679 8.068a.119.119 0 010-.136zM8 2c-1.981 0-3.67.992-4.933 2.078C1.797 5.169.88 6.423.43 7.1a1.619 1.619 0 000 1.798c.45.678 1.367 1.932 2.637 3.024C4.329 13.008 6.019 14 8 14c1.981 0 3.67-.992 4.933-2.078 1.27-1.092 2.187-2.346 2.637-3.024a1.619 1.619 0 000-1.798c-.45-.678-1.367-1.932-2.637-3.024C11.671 2.992 9.981 2 8 2zm0 8a2 2 0 100-4 2 2 0 000 4z\"/></svg>\n    <text class=\"text\" x=\"22\" y=\"13\">Profile</text>\n    <text class=\"text\" font-weight=\"700\" x=\"295\" y=\"13\" text-anchor=\"end\">n8n.io/creators/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"n8n_creator_username\"] }}</text>\n  </g>\n</g>\n</svg>"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "15572edd-6517-4db4-88ee-0b3e2b343c00",
      "name": "GitHub \u2013 Edit Existing File",
      "type": "n8n-nodes-base.github",
      "onError": "continueErrorOutput",
      "position": [
        1888,
        192
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_username\"] }}"
        },
        "filePath": "n8n-stats.svg",
        "resource": "file",
        "operation": "edit",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_repository\"] }}"
        },
        "fileContent": "={{ $item(\"0\").$node[\"Build SVG Card\"].json[\"svg\"] }}",
        "commitMessage": "=chore: update n8n stats badge {{ $now }}"
      },
      "typeVersion": 1
    },
    {
      "id": "9cf5fcbb-9684-4104-a985-56f524b100fb",
      "name": "GitHub \u2013 Create New File",
      "type": "n8n-nodes-base.github",
      "position": [
        1888,
        384
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_username\"] }}"
        },
        "filePath": "n8n-stats.svg",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_repository\"] }}"
        },
        "fileContent": "={{ $item(\"0\").$node[\"Build SVG Card\"].json[\"svg\"] }}",
        "commitMessage": "=chore: create n8n stats badge {{ $now }}"
      },
      "typeVersion": 1
    },
    {
      "id": "215d27a9-b869-4c62-8d5c-5a6ff34fe88d",
      "name": "Merge Results",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2112,
        288
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "397cf28b-f098-40a4-87dd-f10d2a1359f2",
      "name": "Output Embed URLs",
      "type": "n8n-nodes-base.set",
      "position": [
        2336,
        288
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "CDN URL (cached)",
              "stringValue": "=https://cdn.statically.io/gh/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_username\"] }}/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_repository\"] }}/main/n8n-stats.svg"
            },
            {
              "name": "Direct GitHub URL",
              "stringValue": "=https://raw.githubusercontent.com/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_username\"] }}/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_repository\"] }}/main/n8n-stats.svg"
            },
            {
              "name": "README Markdown Embed",
              "stringValue": "=![n8n Stats](https://raw.githubusercontent.com/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_username\"] }}/{{ $item(\"0\").$node[\"\u2699\ufe0f Config\"].json[\"github_repository\"] }}/main/n8n-stats.svg)"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    }
  ],
  "connections": {
    "Merge Results": {
      "main": [
        [
          {
            "node": "Output Embed URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f Config": {
      "main": [
        [
          {
            "node": "Fetch Creator Profile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build SVG Card": {
      "main": [
        [
          {
            "node": "GitHub \u2013 Edit Existing File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Avatar": {
      "main": [
        [
          {
            "node": "Encode Avatar to Base64",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Creator Data": {
      "main": [
        [
          {
            "node": "Download Avatar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Creator Profile": {
      "main": [
        [
          {
            "node": "Parse Creator Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Encode Avatar to Base64": {
      "main": [
        [
          {
            "node": "Build SVG Card",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GitHub \u2013 Create New File": {
      "main": [
        [
          {
            "node": "Merge Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GitHub \u2013 Edit Existing File": {
      "main": [
        [
          {
            "node": "Merge Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "GitHub \u2013 Create New File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Showcase your n8n creator profile with a dynamically generated SVG stats badge, automatically pushed to any GitHub repository on a schedule — ready to embed in your README in seconds.

Source: https://n8n.io/workflows/15643/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

N8N-Workflow-Github-Manager. Uses github, httpRequest, n8n. Scheduled trigger; 38 nodes.

GitHub, HTTP Request, n8n
Web Scraping

This workflow will gather data every minute from the GitHub (https://github.com), Docker (https://www.docker.com/), npm (https://www.npmjs.com/) and Product Hunt (https://www.producthunt.com/) website

HTTP Request, GitHub
Web Scraping

This workflow creates a versioned backup of an entire Clockify workspace split up into monthly reports. This backup routine runs daily by default The Clockify reports API endpoint is used to get all d

Stop And Error, Clockify, HTTP Request +1
Web Scraping

This workflow automatically ingests newly-uploaded files, validates and transforms their contents, stores the processed files in a GitHub repository, and sends email notifications upon completion. It

HTTP Request, GitHub, Email Send
Web Scraping

This n8n workflow template is designed to automate the process of updating a creator's profile statistics, including total workflows, complex workflows, approved workflows, pending workflows, total no

HTTP Request, GitHub