{
  "name": "Auto-generate social OG images per blog post with Rendex Render Link",
  "nodes": [
    {
      "parameters": {
        "content": "## 🖼️ Dynamic OG images — powered by Rendex Render Link\n\n**Who it's for:** blogs, docs, and marketing sites that want a branded social preview image for every post — without opening a design tool.\n\n**What it does:** builds a branded OG card from the post's title + author and mints a **hosted, signed image URL** with Rendex **Render Link**. Drop that URL straight into your `og:image` tag — no upload step, no storage to manage.\n\n**How it works:**\n1. A trigger supplies the post data (here Manual + sample **Post Data** — swap in an RSS trigger, a CMS webhook, or a new Google Sheets row)\n2. **Rendex — Render Link** returns a signed, auto-caching image URL (`{{ $json.url }}`)\n3. **Set og:image** exposes that URL, ready to write back to your CMS / Sheet\n\n**How to use:**\n1. Install `n8n-nodes-rendex` and add your **Rendex API** credential (free key at rendex.dev)\n2. Swap the trigger for your post source\n3. Wire **og:image** into your CMS update / Sheets write node\n\n📚 Docs: https://rendex.dev/docs/n8n",
        "height": 460,
        "width": 430
      },
      "id": "sticky-overview",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-370, 120]
    },
    {
      "parameters": {
        "content": "### 1 · Post source\nReplace Manual + Post Data with your real source — an **RSS Feed Trigger**, a CMS webhook, or a new **Google Sheets** row. Output a `title` and `author`.",
        "height": 300,
        "width": 300,
        "color": 4
      },
      "id": "sticky-source",
      "name": "Source note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [110, 120]
    },
    {
      "parameters": {},
      "id": "manual-trigger",
      "name": "When clicking Test",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [170, 320]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "b1", "name": "title", "value": "How we cut render times by 40%", "type": "string" },
            { "id": "b2", "name": "author", "value": "Jane Doe", "type": "string" }
          ]
        },
        "options": {}
      },
      "id": "post-data",
      "name": "Post Data",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [370, 320]
    },
    {
      "parameters": {
        "content": "### 2 · Mint the OG image URL\nThe **HTML** field is an expression, so `{{ $json.title }}` / `{{ $json.author }}` are injected. **Render Link** returns a signed URL that renders on first hit and caches after — perfect for `og:image`. Adjust **Link Expiry** for how long it stays valid.",
        "height": 320,
        "width": 340,
        "color": 5
      },
      "id": "sticky-render",
      "name": "Render note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [610, 110]
    },
    {
      "parameters": {
        "resource": "screenshot",
        "operation": "renderLink",
        "source": "html",
        "html": "=<!doctype html>\n<html>\n  <body style=\"margin:0; width:1200px; height:630px; background:linear-gradient(135deg,#1a1206,#2a1608); font-family:system-ui,-apple-system,sans-serif; color:#fff; box-sizing:border-box; padding:72px; display:flex; flex-direction:column; justify-content:space-between\">\n    <div style=\"height:6px; width:120px; background:linear-gradient(90deg,#ea580c,#22d3ee); border-radius:3px\"></div>\n    <h1 style=\"font-size:64px; line-height:1.1; margin:0; max-width:1000px\">{{ $json.title }}</h1>\n    <div style=\"display:flex; justify-content:space-between; align-items:center; font-size:26px; color:#f5c6a5\">\n      <span>{{ $json.author }}</span>\n      <span style=\"color:#ea580c; font-weight:700\">yourcompany.com</span>\n    </div>\n  </body>\n</html>",
        "format": "png",
        "expiresIn": 2592000,
        "additionalOptions": {
          "width": 1200,
          "height": 630
        }
      },
      "id": "rendex-render-link",
      "name": "Rendex — Render Link",
      "type": "n8n-nodes-rendex.rendex",
      "typeVersion": 1,
      "position": [690, 320]
    },
    {
      "parameters": {
        "content": "### 3 · Use the URL\n`{{ $json.url }}` is your `og:image`. Wire this into an **HTTP Request** (CMS update), a **Google Sheets** write, or a **WordPress** node to publish the preview image with the post.",
        "height": 300,
        "width": 300,
        "color": 3
      },
      "id": "sticky-use",
      "name": "Use note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [980, 120]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "c1", "name": "ogImage", "value": "={{ $json.url }}", "type": "string" }
          ]
        },
        "options": {}
      },
      "id": "set-og",
      "name": "Set og:image",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [1040, 320]
    }
  ],
  "connections": {
    "When clicking Test": {
      "main": [[{ "node": "Post Data", "type": "main", "index": 0 }]]
    },
    "Post Data": {
      "main": [[{ "node": "Rendex — Render Link", "type": "main", "index": 0 }]]
    },
    "Rendex — Render Link": {
      "main": [[{ "node": "Set og:image", "type": "main", "index": 0 }]]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "instanceId": ""
  }
}
