Automated Twitter Banner with Latest Followers' Avatars
Automate your Twitter presence by dynamically updating your banner image with the profile pictures of your latest followers. This n8n workflow fetches followers, processes their avatars, and composites them onto a custom banner.
Overview
Automatically creates and updates a dynamic Twitter banner featuring the profile pictures of your most recent followers to foster community engagement.
🧠 Description & Use Case
This workflow automatically generates a new Twitter banner by featuring the profile pictures of your latest followers and updates your profile. It's a great way to welcome new members of your community and create a dynamic, engaging Twitter presence.
🔄 How It Works:
-
Trigger: The workflow is initiated manually by clicking 'execute'.
-
Fetch & Process Followers:
Fetch new followers(HTTP Request): Retrieves the 3 most recent followers from your Twitter account using the Twitter v2 API.Item Lists: Splits the list of followers into individual items so each one can be processed separately.- For each follower, the workflow performs a series of image manipulations:
Fetching images: Downloads the follower's profile picture, requesting a higher resolution version (400x400).Resize: Scales the image down to 200x200 pixels.Crop: Uses a multi-step operation to crop the square image into a perfect circle.Resize1: Resizes the final circular avatar to 75x75 pixels, ready to be placed on the banner.
-
Prepare for Composition:
Functionnode: Gathers all the processed circular avatars from the parallel executions and organizes them into a single data object with unique binary properties (e.g.,data0,data1,data2).Fetch bg: In a parallel step, this node downloads a predefined background image that will serve as the template for your banner.
-
Create Final Banner & Update Twitter:
Merge: Combines the background image and the collected follower avatars into one item.Edit Image: Composites each follower's circular avatar onto the background image at specific X/Y coordinates.HTTP Request: Uploads the newly generated banner image to your Twitter profile using the Twitter v1.1 API, automatically updating your public-facing banner.
✅ Real-World Use Cases:
- Community Engagement: Show appreciation to new followers by featuring them on your profile.
- Brand Building: Create a dynamic and interactive profile that reflects a growing and active community.
- Social Proof: Visually demonstrate that your account is gaining new followers.
- Automation for Creators: Save time by automating a creative and engaging social media task.
Instructions
Basic steps
- Download workflow JSON
- Import into n8n
- Configure node parameters as needed
- Test and enable the workflow
💡 Tips
After importing, verify all connectors and credentials match your environment.
Preview
Workflow Visualization
Nodes
On clicking 'execute'
manualTrigger
Fetch new followers
httpRequest
Item Lists
itemLists
Function
function
Merge
merge
Fetching images
httpRequest
Fetch bg
httpRequest
Resize
editImage
Crop
editImage
Edit Image
editImage
Resize1
editImage
HTTP Request
httpRequest
Statistics
View full JSON structure
{
"nodes": [
{
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
260,
210
],
"parameters": {},
"typeVersion": 1
},
{
"name": "Fetch new followers",
"type": "n8n-nodes-base.httpRequest",
"position": [
460,
210
],
"parameters": {
"url": "https://api.twitter.com/2/users/{YOUR_USER_ID}/followers?user.fields=profile_image_url&max_results=3",
"options": {},
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "2",
"name": "Twitter Token"
}
},
"typeVersion": 1
},
{
"name": "Item Lists",
"type": "n8n-nodes-base.itemLists",
"position": [
660,
210
],
"parameters": {
"options": {},
"fieldToSplitOut": "data"
},
"typeVersion": 1
},
{
"name": "Function",
"type": "n8n-nodes-base.function",
"position": [
1660,
210
],
"parameters": {
"functionCode": "const binary = {};\nfor (let i=0; i < items.length; i++) {\n binary[`data${i}`] = items[i].binary.avatar;\n}\n\nreturn [\n {\n json: {\n numIcons: items.length,\n },\n binary,\n }\n];\n"
},
"typeVersion": 1
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1910,
110
],
"parameters": {
"mode": "mergeByIndex"
},
"typeVersion": 1
},
{
"name": "Fetching images",
"type": "n8n-nodes-base.httpRequest",
"position": [
860,
210
],
"parameters": {
"url": "={{$json[\"profile_image_url\"].replace('normal','400x400')}}",
"options": {},
"responseFormat": "file",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Fetch bg",
"type": "n8n-nodes-base.httpRequest",
"position": [
1660,
-40
],
"parameters": {
"url": "{TEMPLATE_IMAGE_URL}",
"options": {},
"responseFormat": "file",
"dataPropertyName": "bg"
},
"typeVersion": 1
},
{
"name": "Resize",
"type": "n8n-nodes-base.editImage",
"position": [
1060,
210
],
"parameters": {
"width": 200,
"height": 200,
"options": {},
"operation": "resize",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Crop",
"type": "n8n-nodes-base.editImage",
"position": [
1260,
210
],
"parameters": {
"options": {
"format": "png"
},
"operation": "multiStep",
"operations": {
"operations": [
{
"width": 200,
"height": 200,
"operation": "create",
"backgroundColor": "#000000ff"
},
{
"color": "#ffffff00",
"operation": "draw",
"primitive": "circle",
"endPositionX": 25,
"endPositionY": 50,
"startPositionX": 100,
"startPositionY": 100
},
{
"operator": "In",
"operation": "composite",
"dataPropertyNameComposite": "avatar"
}
]
},
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Edit Image",
"type": "n8n-nodes-base.editImage",
"position": [
2110,
110
],
"parameters": {
"options": {},
"operation": "multiStep",
"operations": {
"operations": [
{
"operation": "composite",
"positionX": 1000,
"positionY": 375,
"dataPropertyNameComposite": "data0"
},
{
"operation": "composite",
"positionX": 1100,
"positionY": 375,
"dataPropertyNameComposite": "data1"
},
{
"operation": "composite",
"positionX": 1200,
"positionY": 375,
"dataPropertyNameComposite": "data2"
}
]
},
"dataPropertyName": "bg"
},
"typeVersion": 1
},
{
"name": "Resize1",
"type": "n8n-nodes-base.editImage",
"position": [
1450,
210
],
"parameters": {
"width": 75,
"height": 75,
"options": {},
"operation": "resize",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
2310,
110
],
"parameters": {
"url": "https://api.twitter.com/1.1/account/update_profile_banner.json",
"options": {
"bodyContentType": "multipart-form-data"
},
"requestMethod": "POST",
"authentication": "oAuth1",
"jsonParameters": true,
"sendBinaryData": true,
"binaryPropertyName": "banner:bg"
},
"credentials": {
"oAuth1Api": {
"id": "13",
"name": "Twitter OAuth1.0"
}
},
"typeVersion": 1
}
],
"connections": {
"Crop": {
"main": [
[
{
"node": "Resize1",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Edit Image",
"type": "main",
"index": 0
}
]
]
},
"Resize": {
"main": [
[
{
"node": "Crop",
"type": "main",
"index": 0
}
]
]
},
"Resize1": {
"main": [
[
{
"node": "Function",
"type": "main",
"index": 0
}
]
]
},
"Fetch bg": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Function": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Edit Image": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Item Lists": {
"main": [
[
{
"node": "Fetching images",
"type": "main",
"index": 0
}
]
]
},
"Fetching images": {
"main": [
[
{
"node": "Resize",
"type": "main",
"index": 0
}
]
]
},
"Fetch new followers": {
"main": [
[
{
"node": "Item Lists",
"type": "main",
"index": 0
}
]
]
},
"On clicking 'execute'": {
"main": [
[
{
"node": "Fetch new followers",
"type": "main",
"index": 0
}
]
]
}
}
}Actions
Technical Specs
Compatibility
License
This workflow template follows MIT license, you can freely use, modify and distribute.
Please comply with relevant third-party service terms when using.