This workflow corresponds to n8n.io template #5546 — we link there as the canonical source.
This workflow follows the Editimage → 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 →
{
"id": "FVsgc9AjW27LUTIf",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Create auto-updating images and redirect URL for your content",
"tags": [],
"nodes": [
{
"id": "d74bab24-d81c-4d18-8539-4aa0d71cb22a",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
1680,
140
],
"parameters": {},
"typeVersion": 1
},
{
"id": "10c33346-1562-4dff-afdd-abeaa146ea20",
"name": "Create new URL redirection",
"type": "n8n-nodes-base.httpRequest",
"position": [
0,
-180
],
"parameters": {
"url": "https://api.shorten.rest/aliases",
"method": "POST",
"options": {},
"jsonBody": "={\n \"destinations\":[{\"url\":\"https://en.wikipedia.org/wiki/{{ $now.format('DDD').split(',')[0].replaceAll(' ','_') }}\"}]\n}",
"sendBody": true,
"sendQuery": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "domainName",
"value": "short.fyi"
},
{
"name": "aliasName",
"value": "today-in-history"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "ebf4281e-fc0b-4309-bfed-0aa417fdf638",
"name": "Update URL redirection",
"type": "n8n-nodes-base.httpRequest",
"position": [
220,
160
],
"parameters": {
"url": "https://api.shorten.rest/aliases",
"method": "PUT",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"jsonBody": "={\n \"destinations\":[{\"url\":\"https://en.wikipedia.org/wiki/{{ $now.format('DDD').split(',')[0].replaceAll(' ','_') }}\"}]\n}",
"sendBody": true,
"sendQuery": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "domainName",
"value": "short.fyi"
},
{
"name": "aliasName",
"value": "today-in-history"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "847b893b-fc79-40b8-8eee-5844be6e9dd6",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-20,
160
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtMinute": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "bb20131d-cb3e-4a78-aa54-e931dbe183d0",
"name": "Schedule Trigger1",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-20,
320
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"triggerAtMinute": 1
}
]
}
},
"typeVersion": 1.2
},
{
"id": "e8944262-fe50-4a22-84f6-09ce10576073",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
700,
-180
],
"parameters": {
"width": 480,
"height": 520,
"content": "## 1. Inside workflow stickers\nContent of both an image and URL are dynamic. Try this out:\n- https://short.fyi/today-in-history\n- https://github.com/ed-parsadanyan/public-tests/blob/main/n8n-examples/dynamic-images/dynamic_img.png\n\n[](https://short.fyi/today-in-history)"
},
"typeVersion": 1
},
{
"id": "1c2c841d-4a28-4b5d-bb95-ccc3fdd9530c",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-320
],
"parameters": {
"width": 700,
"height": 360,
"content": "## Run these nodes only once\n1. to create initial URL alias\n2. to create an initial GitHub file\n3. to get downloadable image URL"
},
"typeVersion": 1
},
{
"id": "6d21ad0c-1f3f-48c8-8e12-b15b45f4dfd8",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
60
],
"parameters": {
"color": 5,
"width": 700,
"height": 440,
"content": "## These triggers periodically update image and URL\n- By default, URLs are updated daily and point to the today's Wiki article\n- Image is updated on the hourly basis"
},
"typeVersion": 1
},
{
"id": "fe74d1cb-9274-4c51-891e-f5ec3564d1e5",
"name": "Create Image",
"type": "n8n-nodes-base.editImage",
"position": [
220,
320
],
"parameters": {
"options": {
"fileName": "dynamic_img"
},
"operation": "multiStep",
"operations": {
"operations": [
{
"width": 640,
"height": 480,
"operation": "create"
},
{
"color": "#00a2bb00",
"operation": "draw",
"endPositionX": "={{ $parameter.operations.operations[0].width }}",
"endPositionY": "={{ $parameter.operations.operations[0].height }}",
"startPositionX": 0,
"startPositionY": 0
},
{
"color": "#efefef00",
"operation": "draw",
"endPositionX": "={{ $parameter.operations.operations[0].width-5 }}",
"endPositionY": "={{ $parameter.operations.operations[0].height-5 }}",
"startPositionX": 5,
"startPositionY": 5
},
{
"font": "/usr/share/fonts/truetype/msttcorefonts/Courier_New.ttf",
"text": "TODAY",
"fontSize": 72,
"operation": "text",
"positionX": 213,
"positionY": 120
},
{
"font": "/usr/share/fonts/truetype/msttcorefonts/Courier_New_Bold.ttf",
"text": "={{ $now.setLocale('en').toLocaleString(DateTime.DATE_MED) }}",
"fontSize": 72,
"operation": "text",
"positionX": "={{ ($parameter.operations.operations[0].width - ($parameter.operations.operations[0].width * $now.setLocale('en').toLocaleString(DateTime.DATE_MED).length / 15))/2 }}",
"positionY": 250
},
{
"font": "/usr/share/fonts/truetype/msttcorefonts/Courier_New_Bold.ttf",
"text": "={{ $now.toFormat('HH:mm') }}",
"fontSize": 72,
"operation": "text",
"positionX": "={{ ($parameter.operations.operations[0].width - ($parameter.operations.operations[0].width * $now.toFormat('HH:mm').length / 15))/2 }}",
"positionY": 350
}
]
}
},
"typeVersion": 1
},
{
"id": "169d25a7-c3b8-4fb6-abc4-2ced669e90cf",
"name": "Update GitHub file",
"type": "n8n-nodes-base.github",
"position": [
440,
320
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "ed-parsadanyan"
},
"filePath": "=n8n-examples/dynamic-images/{{ $binary.data.fileName }}.{{ $binary.data.fileExtension }}",
"resource": "file",
"operation": "edit",
"binaryData": true,
"repository": {
"__rl": true,
"mode": "list",
"value": "public-tests",
"cachedResultUrl": "https://github.com/ed-parsadanyan/public-tests",
"cachedResultName": "public-tests"
},
"commitMessage": "=dynamic_img_update",
"authentication": "oAuth2"
},
"credentials": {
"githubOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "b0a89ef7-862a-4648-9f9b-b941b117f25a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1220,
-180
],
"parameters": {
"width": 380,
"height": 520,
"content": "## 2. In the n8n forms\nTest this form and note the dynamic clickable image. Configure this via\n- custom HTML element\n- additional CSS styling for correct image size:\n\n```\ndiv.html img {\n\tmax-width: 100%;\n\theight: auto;\n\tdisplay: block;\n\tmargin-bottom: 8px;\n}\n```"
},
"typeVersion": 1
},
{
"id": "eb75a8d6-1e2f-442a-8ac3-14406bf7edc9",
"name": "Form with dynamic image",
"type": "n8n-nodes-base.formTrigger",
"position": [
1360,
140
],
"parameters": {
"options": {
"customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 20px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Colors */\n\t--color-background: #fbfcfe;\n\t--color-test-notice-text: #e6a23d;\n\t--color-test-notice-bg: #fefaf6;\n\t--color-test-notice-border: #f6dcb7;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #dbdfe7;\n\t--color-card-shadow: rgba(99, 77, 255, 0.06);\n\t--color-link: #7e8186;\n\t--color-header: #525356;\n\t--color-label: #555555;\n\t--color-input-border: #dbdfe7;\n\t--color-input-text: #71747A;\n\t--color-focus-border: rgb(90, 76, 194);\n\t--color-submit-btn-bg: #ff6d5a;\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #ea1f30;\n\t--color-required: #ff6d5a;\n\t--color-clear-button-bg: #7e8186;\n\t--color-html-text: #555;\n\t--color-html-link: #ff6d5a;\n\t--color-header-subtext: #7e8186;\n\n\t/* Border Radii */\n\t--border-radius-card: 8px;\n\t--border-radius-input: 6px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 8px;\n\n\t/* Spacing */\n\t--padding-container-top: 24px;\n\t--padding-card: 24px;\n\t--padding-test-notice-vertical: 12px;\n\t--padding-test-notice-horizontal: 24px;\n\t--margin-bottom-card: 16px;\n\t--padding-form-input: 12px;\n\t--card-padding: 24px;\n\t--card-margin-bottom: 16px;\n\n\t/* Dimensions */\n\t--container-width: 448px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 4px 16px 0px var(--color-card-shadow);\n\t--opacity-placeholder: 0.5;\n}\n\ndiv.html img {\n\tmax-width: 100%;\n\theight: auto;\n\tdisplay: block;\n\tmargin-bottom: 8px;\n}",
"appendAttribution": false
},
"formTitle": "Test Form",
"formFields": {
"values": [
{
"html": "<!-- Your custom HTML here --->\n<h2>Note: image is clickable!</h2>\n<a href=\"https://short.fyi/today-in-history\" target=\"_blank\">\n <img src=\"https://raw.githubusercontent.com/ed-parsadanyan/public-tests/main/n8n-examples/dynamic-images/dynamic_img.png\" alt=\"\">\n</a>",
"fieldType": "html",
"elementName": "test"
}
]
},
"formDescription": "This form contains a dynamic image"
},
"typeVersion": 2.2
},
{
"id": "ada5f98f-3b52-449b-b573-ef24bbdc4554",
"name": "Get a file",
"type": "n8n-nodes-base.github",
"position": [
1840,
140
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "ed-parsadanyan"
},
"filePath": "=n8n-examples/dynamic-images/dynamic_img.png",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "list",
"value": "public-tests",
"cachedResultUrl": "https://github.com/ed-parsadanyan/public-tests",
"cachedResultName": "public-tests"
},
"authentication": "oAuth2",
"asBinaryProperty": false,
"additionalParameters": {}
},
"credentials": {
"githubOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "0fd7ecea-7e0e-4318-8dbc-91d2e20778a6",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
2000,
140
],
"parameters": {
"sendTo": "user@example.com",
"message": "=<h2>Dynamic image</h2>\n<a href=\"https://short.fyi/today-in-history\" target=\"_blank\">\n <img src=\"{{ $json.download_url }}\" />\n</a>",
"options": {},
"subject": "Test Image"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "8058d4d0-a60f-4390-a335-5b5e494ec45b",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1640,
-180
],
"parameters": {
"width": 500,
"height": 520,
"content": "## 3. Via E-mail\nPrepare an HTML message and include the link to the image.\nYou can also place a custom clickable image as an e-mail footer\n\nHere's an example:\n\n<h2>Dynamic image</h2>\n<a href=\"https://short.fyi/today-in-history\" target=\"_blank\">\n <img src=\"{{ $json.download_url }}\" />\n</a>"
},
"typeVersion": 1
},
{
"id": "bb16c18e-17d8-4f07-8000-7e21acf0ac8e",
"name": "Create a file",
"type": "n8n-nodes-base.github",
"position": [
220,
-180
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "ed-parsadanyan"
},
"filePath": "=n8n-examples/dynamic-images/dynamic_img.png",
"resource": "file",
"repository": {
"__rl": true,
"mode": "list",
"value": "public-tests",
"cachedResultUrl": "https://github.com/ed-parsadanyan/public-tests",
"cachedResultName": "public-tests"
},
"fileContent": "some content",
"commitMessage": "initial creation",
"authentication": "oAuth2"
},
"credentials": {
"githubOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "e2a06369-6136-474b-a6f8-133f193aca83",
"name": "Get the download URL",
"type": "n8n-nodes-base.github",
"position": [
440,
-180
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "ed-parsadanyan"
},
"filePath": "=n8n-examples/dynamic-images/dynamic_img.png",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "list",
"value": "public-tests",
"cachedResultUrl": "https://github.com/ed-parsadanyan/public-tests",
"cachedResultName": "public-tests"
},
"authentication": "oAuth2",
"asBinaryProperty": false,
"additionalParameters": {}
},
"credentials": {
"githubOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "99117594-4f37-4d9a-b344-35264547ebe8",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
680,
-320
],
"parameters": {
"color": 4,
"width": 1480,
"height": 680,
"content": "# Use-cases\n## Here are three ideas for using dynamic image and URL in your promo materials"
},
"typeVersion": 1
},
{
"id": "8b3b3e7a-3c99-41b8-bcd5-3a8389a786ef",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-780
],
"parameters": {
"color": 3,
"width": 700,
"height": 440,
"content": "# What is this?\nWhen you publish workflow templates, create registration forms or send e-mails, these digital asses start living on their own. Users may find them long after creation.\n\nYou can keep contact with future audience by including dynamic images or links. Image path stays the same, but you can update the content. Similarly, a weblink can stay the same but have different redirect targets.\n\nThis way you can deliver your latest offers or messages even years after the digital assets were created. There's no need to update the whole content library - just keep the dynamic images and links fresh.\n\n## Requirements:\n- A [shorten.rest account ](https://shorten.rest/) for creating URL with dynamic redirect target URLs.\n- A [GitHub account](https://github.com/) to store the dynamic images\n\n*Both services work for free, but you can swap them with your own URL shortening / redirecting service or an S3 bucket for storing an image*"
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1",
"saveDataSuccessExecution": "all"
},
"versionId": "7747c3d6-0dc7-40af-b206-3804ed71b4b3",
"connections": {
"Get a file": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Create Image": {
"main": [
[
{
"node": "Update GitHub file",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Update URL redirection",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger1": {
"main": [
[
{
"node": "Create Image",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Get a file",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
githubOAuth2ApigmailOAuth2httpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform static digital assets into dynamic, self-updating powerhouses that stay relevant for years to come!
Source: https://n8n.io/workflows/5546/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Atlas Opco Import. Uses github, stopAndError, formTrigger, googleSheets. Event-driven trigger; 22 nodes.
Echo Brand Voice Analysis (Processor) - TASK-074 Dec 10 Fix. Uses formTrigger, httpRequest, executeWorkflowTrigger, moveBinaryData. Event-driven trigger; 40 nodes.
Streamline your content pipeline by bridging Notion and Instagram with a professional "review-before-publish" safeguard. This workflow allows team members to submit content via a simple form, generate
🎥 Analyze YouTube Video for Summaries, Transcripts & Content + Google Gemini AI. Uses stickyNote, httpRequest, googleDrive, gmail. Event-driven trigger; 33 nodes.
This n8n template automates PDF translation into 1 or 2 target languages while maintaining professional formatting. Users submit PDFs via web form and receive translated documents via email with prese