This workflow corresponds to n8n.io template #6357 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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": "YOUR_WORKFLOW_ID",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "My blog",
"tags": [],
"nodes": [
{
"id": "2108f067-2829-4b5c-8ed5-23400753b134",
"name": "Generate Blog with Gemini",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-208,
144
],
"parameters": {
"text": "=Write a technical blog post in Markdown using the context and topic below.\n\n## Topic:\n\"{{$json[\"Topic\"]}}\"\n\n## Context:\n{{$json[\"Context\"]}}",
"options": {
"systemMessage": "=You are a blogging assistant. Your job is to generate a complete, high-quality technical blog post in Markdown (`.md`) format. Follow these strict formatting and structure rules so the post can be directly used in a static site generator like Jekyll.\n\n---\n\n## \ud83d\udd39 Front Matter Block\n\nAt the top of the file, include the following YAML front matter:\n\n---\ntitle: \"BLOG_TITLE\"\ndate: \"{{$now.toFormat('yyyy-MM-dd')}}\"\ncategories: [<blog categories with separtaed by comma>]\ntags: [<comma separated tags for the blog>]\nexcerpt: \"SHORT_EXCERPT_SUMMARIZING_THE_POST\"\nauthor: \"YOUR_NAME\"\n---\n\n## \ud83e\uddf1 Blog Content Structure\n\nAfter the front matter, structure the blog with clear, scannable sections using proper Markdown heading levels.\n\n## Table of Contents\n\nAdd a clickable table of contents using Markdown anchor links:\n## Table of Contents\n- [Introduction](#introduction)\n- [Main Section 1](#main-section-1)\n- [Main Section 2](#main-section-2)\n- ...\n- [Conclusion](#conclusion)\n\n## Introduction\nWrite 1\u20132 short paragraphs introducing the topic and its relevance to developers or the tech industry.\n\n## Main Content\nBreak down the main body using:\n# for top-level sections\n## for subsections\n### include:\n#### Code snippets using fenced code blocks with language tags (e.g. dart, yaml, bash)\n#### Bullet points and numbered lists\n#### Images using \n#### Links with [Link Text](https://url.com)\n#### Quotes with >\n\n## Conclusion\nSummarize the key takeaways from the blog. You may also include:\nA call to action (e.g. \"Try it yourself!\")\nSuggested reading or resources.\n\n## Markdown Formatting Guidelines\nUse proper heading levels (#, ##, ###)\n\n# Use **bold** and *italic* for emphasis\n# Always format code using triple backticks and the correct language\n# Avoid raw HTML unless absolutely required\n# Keep the writing technical but friendly and easy to follow\n\n## Output Requirements\n\n# Output only the Markdown content\n# Start with the YAML front matter\n# Do not include any explanation, metadata, or extra comments\n# The output must be ready to save as a .md file and publish directly\n\nYou have the access of multiple tools.\n\n## Wikipedia\nuse this tool to search about the blog topic . Also if possiable use the wikipedia image for the blog.\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "2f9e8ada-a1c2-4ff7-ab77-473fdcd5904d",
"name": "Fetch Wikipedia Context",
"type": "@n8n/n8n-nodes-langchain.toolWikipedia",
"position": [
-32,
384
],
"parameters": {},
"typeVersion": 1
},
{
"id": "cdf3b5fb-31f5-4584-bc74-0cf4f3a8d025",
"name": "Extract Blog Title",
"type": "n8n-nodes-base.set",
"position": [
-1216,
144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "303ff84c-3343-4ac5-8e4d-4b12c36bdb4f",
"name": "topic",
"type": "string",
"value": "={{ $json.Title }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e9a37489-7d3f-43d0-aca3-f449ff032b07",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-224,
352
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-pro"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "44ff6820-0d5d-449f-94f8-1a5b9166b35b",
"name": "Summarize Search Results",
"type": "n8n-nodes-base.code",
"position": [
-592,
144
],
"parameters": {
"jsCode": "const topic = $json[\"query\"];\nconst results = $json[\"results\"];\n\nconst context = results.slice(0, 3).map(r => {\n return `### ${r.title}\\n${r.content}\\n[Source](${r.url})\\n`;\n}).join('\\n\\n');\n\nreturn [\n {\n json: {\n Topic: topic,\n Context: context\n }\n }\n];\n\n"
},
"typeVersion": 2
},
{
"id": "6e072fdd-4a78-4105-b443-3eb0e7ae79de",
"name": "Commit Blog Post to GitHub",
"type": "n8n-nodes-base.github",
"position": [
704,
176
],
"parameters": {
"owner": {
"__rl": true,
"mode": "list",
"value": "YOUR_GITHUB_USERNAME",
"cachedResultUrl": "https://github.com/YOUR_GITHUB_USERNAME",
"cachedResultName": "YOUR_GITHUB_USERNAME"
},
"filePath": "=_posts/{{ $json.filePath }}",
"resource": "file",
"repository": {
"__rl": true,
"mode": "list",
"value": "YOUR_REPOSITORY_NAME",
"cachedResultUrl": "https://github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME",
"cachedResultName": "YOUR_REPOSITORY_NAME"
},
"fileContent": "={{ $json.fileContent }}",
"commitMessage": "={{ $json.commitMessage }}",
"authentication": "oAuth2"
},
"credentials": {
"githubOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "30e90692-ca16-43f3-beeb-32c113da36a6",
"name": "Prepare File for Commit",
"type": "n8n-nodes-base.set",
"position": [
384,
192
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a6800e46-165a-4713-b789-e0047a2196af",
"name": "filePath",
"type": "string",
"value": "={{ $now.format('yyyy-MM-dd') }}-{{ $('Extract Topic').item.json.topic.toLowerCase().replace(/ /g, '-') }}.md"
},
{
"id": "e8672360-e389-498d-8b79-8cccc1a7f918",
"name": "fileContent",
"type": "string",
"value": "={{$json[\"output\"]}}"
},
{
"id": "9794aa09-d0a0-4333-97a6-76364c0f14b1",
"name": "commitMessage",
"type": "string",
"value": "=Add blog post: {{ $('get topic').item.json.Title }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "9a2cac57-7930-48ee-a493-8ca39580a660",
"name": "Tavily Web Search",
"type": "@tavily/n8n-nodes-tavily.tavily",
"position": [
-928,
144
],
"parameters": {
"query": "={{ $json.topic }}",
"options": {
"search_depth": "advanced"
}
},
"credentials": {
"tavilyApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "453f3a77-15c5-41a0-bb67-c5a50369079c",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1776,
144
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "fa2c8c82-6590-45b1-9727-fff9954dd1c0",
"name": "Get Topic from Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1488,
144
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "=",
"lookupColumn": "status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=0",
"cachedResultName": "blog list"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit?usp=drivesdk",
"cachedResultName": "My blogs"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "00c15394-315b-4038-a0c9-203439935c90",
"name": "Mark Topic as Done in Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1184,
176
],
"parameters": {
"columns": {
"value": {
"status": "done",
"row_number": "={{ $json.row_number }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=0",
"cachedResultName": "blog list"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit?usp=drivesdk",
"cachedResultName": "My blogs"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "3ece85bb-0962-40e9-b16e-c6a7f42b8072",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2656,
-784
],
"parameters": {
"width": 752,
"height": 640,
"content": "## Automated Blog Creation \n\n**Description:**\nThis workflow automatically generates a complete blog post from a user-provided topic using an LLM (e.g., OpenAI, Gemini). It formats the content as Markdown, commits it directly to a specified GitHub repository, and triggers a Jekyll build\u2014so your blog is live in minutes.\n\n**Features:**\n- User inputs a topic or prompts the workflow.\n- LLM generates and formats the blog post in Markdown.\n- The generated file is committed/pushed to GitHub.\n- (Optional) Triggers GitHub Pages + Jekyll build to update your site.\n- Fully automated, customizable, and end-to-end.\n\n**Required Integrations:**\n- LLM (OpenAI or similar; set API key in credentials)\n- GitHub (personal access token, target repository)\n- Jekyll static site (hosted on GitHub Pages)\n\n**Instructions/Setup:**\n1. Import the attached workflow JSON in your n8n instance.\n2. Set up credentials for Gemini (or chosen LLM provider).\n3. Set up GitHub credentials and specify repository path.\n4. (Optional) Adjust prompt/parameters for the LLM as desired.\n5. Deploy. On run, your blog will be generated and published automatically."
},
"typeVersion": 1
},
{
"id": "4acd5668-eab7-4883-b531-729a7c2b6a1c",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1840,
16
],
"parameters": {
"width": 256,
"height": 288,
"content": "## Trigger node\n##### Configure the node for your preference or else you can use other option as well."
},
"typeVersion": 1
},
{
"id": "ac9b8a20-36dc-4231-9317-6c026325ce35",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1552,
16
],
"parameters": {
"height": 288,
"content": "## Get Topic from spreadsheet\n##### This will capture the topic which is not done yet."
},
"typeVersion": 1
},
{
"id": "1be2f024-a34d-4b0c-980f-74b1ebd520b5",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1280,
16
],
"parameters": {
"height": 288,
"content": "## Extract topic\n##### This will extract topic text from the sheet node."
},
"typeVersion": 1
},
{
"id": "0d800dd4-0e8d-4558-b5bd-f632026a144c",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
-32
],
"parameters": {
"width": 320,
"height": 336,
"content": "## Deep Search about topic\n##### We have a system node that gathers information about a given topic from the web, providing relevant links and concise summaries."
},
"typeVersion": 1
},
{
"id": "7cffee89-e9aa-474b-83d9-08081767c575",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-688,
-32
],
"parameters": {
"width": 320,
"height": 336,
"content": "## Format the result\n##### We have a system that receives input containing details about a topic along with associated links from a prior node. This new node extracts those details and formats them in a predefined sequence or structure.."
},
"typeVersion": 1
},
{
"id": "8524831c-4db2-4124-9eb9-a404d9e9fcbb",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
16
],
"parameters": {
"width": 496,
"height": 528,
"content": "## Ai agent\n##### We have a standardized system prompt that accepts a topic and a set of relevant search results from Tavily. The prompt then generates a well-structured markdown file formatted as a blog post"
},
"typeVersion": 1
},
{
"id": "82fe6efb-29e8-4253-9e96-47ba5ae81e95",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
16
],
"parameters": {
"width": 400,
"height": 368,
"content": "## Set the file for github upload\n#####This node retrieves data generated by the AI agent and formats it according to standardized conventions, preparing the content for seamless upload and integration into a GitHub repository."
},
"typeVersion": 1
},
{
"id": "43e7bf08-4d0e-413a-b3ac-17d7aabc64a0",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
624,
16
],
"parameters": {
"width": 336,
"height": 384,
"content": "## Github upload\n##### This will upload to a github repo."
},
"typeVersion": 1
},
{
"id": "d515051d-b03e-4329-9a11-a53996b9a9dd",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
16
],
"parameters": {
"width": 416,
"height": 384,
"content": "## Change status\n##### Once the file is uploaded to GitHub, the status of the corresponding topic in the Google Spreadsheet will be updated to \u201cDone.\u201d"
},
"typeVersion": 1
},
{
"id": "5d623cb5-f839-4412-9e54-18de267dc2ee",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2656,
-128
],
"parameters": {
"width": 752,
"height": 832,
"content": "# n8n Integrations & GitHub Pages Jekyll Setup\n\n## Prerequisites\n- n8n account access\n- Tavily API key\n- Google Account for Sheets\n- LLM API key\n- GitHub account\n\n## Steps\n\n1. **Tavily API Key**\n - Sign up at [https://www.tavily.com/](https://www.tavily.com/)\n - Obtain your API key from the dashboard\n\n2. **Google Sheets Setup**\n - Add credentials in n8n and authenticate\n\n3. **LLM Connection**\n - Add LLM credentials in n8n and test\n\n4. **GitHub OAuth Setup**\n - Authorize and connect via OAuth in n8n\n\n5. **Jekyll Setup for GitHub Pages**\n - Create a repository (`<username>.github.io`)\n - Initialize a Jekyll site locally\n - Push site files to GitHub\n - Enable GitHub Pages for the repository\n - Configure `_config.yml` if needed\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"timezone": "Asia/Kolkata",
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1"
},
"versionId": "YOUR_VERSION_ID",
"connections": {
"Search": {
"main": [
[
{
"node": "summerise the resut",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "set files",
"type": "main",
"index": 0
}
]
]
},
"Wikipedia": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get topic": {
"main": [
[
{
"node": "Extract Topic",
"type": "main",
"index": 0
}
]
]
},
"set files": {
"main": [
[
{
"node": "Create a file",
"type": "main",
"index": 0
}
]
]
},
"Create a file": {
"main": [
[
{
"node": "Update Status",
"type": "main",
"index": 0
}
]
]
},
"Extract Topic": {
"main": [
[
{
"node": "Search",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "get topic",
"type": "main",
"index": 0
}
]
]
},
"summerise the resut": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"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.
githubOAuth2ApigooglePalmApigoogleSheetsOAuth2ApitavilyApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow automates the creation and publication of technical blog posts based on a list of topics stored in Google Sheets. It fetches context using Tavily and Wikipedia, generates Markdown-formatted content with Gemini AI, commits it to a GitHub repository, and updates…
Source: https://n8n.io/workflows/6357/ — 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.
The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe
Who Is This For?
This workflow automates the complete blog publishing process. It removes manual work from content creation, image generation, category management, and WordPress publishing by using AI and n8n. It help
This project is an automated news publisher for LinkedIn. It uses RSS feeds to fetch news, processes the content with the Gemini API to generate precise summaries, and automatically publishes to Linke
This template is for clinics, hospitals, care teams, and telemedicine providers who need a structured, automated system for post-surgery follow-up. It helps reduce manual workload while ensuring every