This workflow corresponds to n8n.io template #10242 — we link there as the canonical source.
This workflow follows the Agent → Chat Trigger 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": "Llj4X6Re9MaRJKtz",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "jobs resume & cover letter automation with resume html template",
"tags": [],
"nodes": [
{
"id": "3ba543ec-62cb-4dd6-bd11-cd625dbfdbe3",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
-320,
208
],
"parameters": {
"url": "http://000.00.00:3000/forms/chromium/convert/url",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"name": "url",
"value": "https://evenkik.github.io/Resume_url/"
}
]
}
},
"retryOnFail": false,
"typeVersion": 4.2
},
{
"id": "f96a1856-6ff4-4304-b6ae-ff497392eed2",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-272,
1152
],
"parameters": {
"options": {
"systemMessage": "You are an AI assistant that structures professional experience data for a resume-matching and vector-search system.\n\nYour task is to convert the given unstructured experience text into a clean, professional, and factual JSON object.\n\nGuidelines:\n- Use concise, resume-appropriate language.\n- Keep the tone factual and professional.\n- You may infer missing details in a general, realistic way \u2014 but never invent unrelated or false information.\n- If the input text does not contain enough valid or general professional information to create a meaningful entry, output an empty JSON object: {}\n- Each array (tasks, skills, tools) must include at least two relevant and specific items.\n- The summary should briefly describe the main purpose and impact of the experience.\n- Output only valid JSON \u2014 no comments, explanations, or extra text.\n\n---\n\nOutput format:\n{\n \"role\": \"\",\n \"summary\": \"\",\n \"tasks\": \"\",\n \"skills\": \"\",\n \"tools\": \"\",\n \"industry\": \"\"\n}\n\n"
},
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "6c30b321-16ee-4540-8f69-b4b10dda1292",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-320,
1376
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5",
"cachedResultName": "gpt-5"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "1c6f3c2f-996a-436e-ad9c-adce7b64875a",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-192,
1376
],
"parameters": {
"contextWindowLength": 10
},
"typeVersion": 1.3
},
{
"id": "be71fb62-719d-4cbb-9c41-be6438f97e18",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-64,
1376
],
"parameters": {
"jsonSchemaExample": "{\n \"role\": \"\",\n \"summary\": \"\",\n \"tasks\": \"\",\n \"skills\": \"\",\n \"tools\": \"\",\n \"industry\": \"\"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "b08a88e5-0ec8-407f-a230-08ab97c0c1ec",
"name": "Insert row",
"type": "n8n-nodes-base.dataTable",
"position": [
144,
1152
],
"parameters": {
"columns": {
"value": {
"Role": "={{ $json.output.role }}",
"Tasks": "={{ $json.output.tasks }}",
"tools": "={{ $json.output.tools }}",
"Skills": "={{ $json.output.skills }}",
"Summary": "={{ $json.output.summary }}",
"industry": "={{ $json.output.industry }}"
},
"schema": [
{
"id": "Role",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Role",
"defaultMatch": false
},
{
"id": "Summary",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Summary",
"defaultMatch": false
},
{
"id": "Tasks",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Tasks",
"defaultMatch": false
},
{
"id": "Skills",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Skills",
"defaultMatch": false
},
{
"id": "tools",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "tools",
"defaultMatch": false
},
{
"id": "industry",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "industry",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "uD4RCsZ5q6GncPRD",
"cachedResultUrl": "/projects/ty2N3FKN04d75oM7/datatables/uD4RCsZ5q6GncPRD",
"cachedResultName": "experience"
}
},
"typeVersion": 1
},
{
"id": "66b3e574-4da5-4e4c-9012-d98bc15eba52",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-208,
544
],
"parameters": {
"text": "={{ $json.message.text }}",
"options": {
"systemMessage": "You are a smart resume personalization agent.\n\nYour task:\n1. Receive a **job description** (list of required skills, responsibilities, or qualifications).\n2. Access my **experience data** from a data table tool (includes my past roles, tasks, and known skills).\n3. Compare my experience to the job description to find **matching skills**.\n4. If some required skills are missing, **add them only if they are not advanced skills**.\n - A skill is considered **advanced** if it typically takes more than 6 months to learn.\n - I can learn new apps or workflow integrations for automation within 2 weeks \u2014 so these are **not advanced** and can be added.\n5. Generate a personalized application letter tailored to the job description, highlighting my relevant experience, skills, and accomplishments. The letter should be professional, concise, and persuasive, with a clear introduction, body, and closing paragraph. Avoid generic statements; tailor it specifically to the job description.\n\n### Output Format:\nReturn the result as valid JSON in the following structure:\n\n{\n \"company\": \"company name\",\n \"job_description\": \"short summary of the job description or title\",\n \"skills\": [\n \"skill1\",\n \"skill2\",\n \"skill3\"\n ],\n \"tools_expertise\": [\n \"tool1\",\n \"tool2\",\n \"tool3\"\n ],\n \"application_letter\": \"Your generated application letter here.\"\n}\n\n\n### Example Output:\n{\n \"company\": \"News Times\",\n \"job_description\": \"Front-End Web Developer responsible for building responsive and user-friendly interfaces.\",\n \"skills\": [\n \"HTML\",\n \"CSS\",\n \"JavaScript\"\n ],\n \"tools_expertise\": [\n \"make.com\",\n \"React\",\n \"Google Sheets\"\n ],\n \"cover_letter\": \"Dear Hiring Manager, I am excited to apply for the [Job Title] role... \n\nSincerely, \n}\n\n### Rules:\n- Only include **skills relevant to the job**. \n- Use **clear, human-readable** skill names (no duplicates). \n- Keep the HTML indentation and `class` attributes exactly as shown. \n- The JSON must be **valid and clean**.\n- **Do not add language skills** - it already add manually.\n- Maximum of 5 skills and 5 tools_expertise should be included in the output.\n- The application letter must be fully tailored to the job description and emphasize relevant experience\n- Always end the application letter with:\n\nSincerely, \n<your name> \n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "12f2baf2-f14b-4e84-b8a0-67cf3cb7053d",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-320,
768
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini",
"cachedResultName": "gpt-5-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ed668501-c588-48c2-9dcb-ea2c5277f97c",
"name": "Simple Memory1",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-192,
768
],
"parameters": {
"sessionKey": "={{ $json.message.from.id }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "db7a86f1-dfbc-4b25-bbd7-39a47ca74d42",
"name": "experience table",
"type": "n8n-nodes-base.dataTableTool",
"position": [
-64,
768
],
"parameters": {
"operation": "get",
"returnAll": true,
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "uD4RCsZ5q6GncPRD",
"cachedResultUrl": "/projects/ty2N3FKN04d75oM7/datatables/uD4RCsZ5q6GncPRD",
"cachedResultName": "experience"
}
},
"typeVersion": 1
},
{
"id": "d69e9a32-9769-476d-9f94-c64c9f25687c",
"name": "Append row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
880,
656
],
"parameters": {
"columns": {
"value": {
"link": "={{ $('Telegram Trigger').item.json.message.link_preview_options.url }}",
"company": "={{ $('AI Agent1').item.json.output.company }}",
"surat-lamaran": "={{ $('AI Agent1').item.json.output.application_letter }}\n\nsorry before, but i think action works more then just some words, what i want to say is this job aplying process is actualy using n8n automation workflow. that i can explain more at interview.",
"job description": "={{ $('AI Agent1').item.json.output.job_description }}"
},
"schema": [
{
"id": "company",
"type": "string",
"display": true,
"required": false,
"displayName": "company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "job description",
"type": "string",
"display": true,
"required": false,
"displayName": "job description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "surat-lamaran",
"type": "string",
"display": true,
"required": false,
"displayName": "surat-lamaran",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "resume",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "resume",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "link",
"type": "string",
"display": true,
"required": false,
"displayName": "link",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit?usp=drivesdk",
"cachedResultName": "loker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "4c0b027e-9e1f-4327-88d8-feab5efb824b",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
128,
208
],
"parameters": {
"columns": {
"value": {
"resume": "={{ $json.webContentLink }}",
"company": "={{ $('github change trigger').item.json.body.message }}",
"surat-lamaran": "="
},
"schema": [
{
"id": "company",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "job description",
"type": "string",
"display": true,
"required": false,
"displayName": "job description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "surat-lamaran",
"type": "string",
"display": true,
"required": false,
"displayName": "surat-lamaran",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "resume",
"type": "string",
"display": true,
"required": false,
"displayName": "resume",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "link",
"type": "string",
"display": true,
"required": false,
"displayName": "link",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"company"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit?usp=drivesdk",
"cachedResultName": "loker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "ce6bb6f0-7b8f-42b2-bc28-dbcad6cd0cc0",
"name": "Upload file",
"type": "n8n-nodes-base.googleDrive",
"position": [
-96,
208
],
"parameters": {
"name": "=resume-{{ $json.body.message }}.pdf",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1f3IB0LnlUjaFFTiLL1grQYnbBxuduPpi",
"cachedResultUrl": "https://drive.google.com/drive/folders/1f3IB0LnlUjaFFTiLL1grQYnbBxuduPpi",
"cachedResultName": "resume"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "ef72e3a6-aca5-4931-8805-e76dc1000556",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
352,
208
],
"parameters": {
"text": "Done...",
"chatId": "<add your telegram chat ID>",
"additionalFields": {
"appendAttribution": true
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "a7497b30-26ed-405f-9417-cb0c31dcbb45",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-544,
1152
],
"parameters": {
"options": {}
},
"typeVersion": 1.3
},
{
"id": "e73b3a9d-ea8f-44b7-94af-585ed3c9788e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
960
],
"parameters": {
"width": 1040,
"height": 560,
"content": "## Experience Input Agent\n\nThis agent is a simple database input tool for recording your experiences. \nThe stored data can then be used by the main agent for **RAG (Retrieval-Augmented Generation)**. \n\nYou can also upgrade this agent to a **vector database** if you have many experience entries and want to **reduce token consumption** by the LLM.\n"
},
"typeVersion": 1
},
{
"id": "eafb9833-a865-43bb-ae73-74e3d0a507db",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-544,
592
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "977d5a7a-478a-430f-af1d-ef818fe056c6",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
96
],
"parameters": {
"color": 6,
"width": 1184,
"height": 288,
"content": "## Resume Download and Link Transfer\n\nThis workflow downloads the crafted resume, uploads it to Google Drive, and adds the download link to a sheet.\n"
},
"typeVersion": 1
},
{
"id": "7df0a64b-f251-4e43-94c3-f757fe7f86e9",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-512,
208
],
"parameters": {
"path": "fc896fbb-4a70-48d2-a416-564a3eeeae91",
"options": {}
},
"typeVersion": 2.1
},
{
"id": "5e7da90c-db6c-4d45-8d7b-0f81019a1fbe",
"name": "style.css",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
416
],
"parameters": {
"color": 4,
"width": 1696,
"height": 512,
"content": "## Job Analyst Agent (Main)\n\nThis is the main agent responsible for analyzing job descriptions, generating cover letters, and creating personalized resumes.\n"
},
"typeVersion": 1
},
{
"id": "51668f0e-825f-47d9-9377-5334f16c9ab9",
"name": "JSON Output",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
64,
768
],
"parameters": {
"jsonSchemaExample": "{\n \"company\": \"\",\n \"job_description\": \"\",\n \"skills\": [\n \"skills\",\n \"skills\",\n \"skills\"\n ],\n \"tools_expertise\": [\n \"tool\",\n \"tool\",\n \"tool\"\n ],\n\"application_letter\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "cb28789d-0675-4f15-aaa3-ba6f0db75316",
"name": "github",
"type": "n8n-nodes-base.github",
"position": [
688,
656
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/<username>"
},
"filePath": "docs/index.html",
"resource": "file",
"operation": "edit",
"repository": {
"__rl": true,
"mode": "list",
"value": "Job-apply"
},
"fileContent": "={{ $json.html }}",
"commitMessage": "={{ $('AI Agent1').item.json.output.company }}"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "0b427fa3-4612-40ec-a139-404738acfe9d",
"name": "HTML code",
"type": "n8n-nodes-base.html",
"position": [
496,
656
],
"parameters": {
"html": "<!DOCTYPE html>\n<html lang=\"en\">\n\n <head>\n <meta charset=\"UTF-8\">\n <title>Lorem Ipsum Resume</title>\n <link rel=\"stylesheet\" href=\"https://public.codepenassets.com/css/reset-2.0.min.css\">\n <link rel=\"stylesheet\" href=\"./style.css\">\n </head>\n \n <body>\n <!-- FONTS -->\n <link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet' type='text/css'>\n <link href='https://fonts.googleapis.com/css?family=Raleway:100' rel='stylesheet' type='text/css'>\n <link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>\n\n <!-- PAGE STUFF -->\n <div class=\"rela-block page\">\n <div class=\"rela-block top-bar\">\n <div class=\"caps name\">\n <div class=\"abs-center\">\n Lorem Ipsum\n <div class=\"contact-info\">\n <p>1234 Dolor Sit Street</p>\n <p>Amet City, Consectetur 56789</p>\n <p>+1234567890</p>\n <p>user@example.com</p>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"side-bar\">\n <div class=\"mugshot\">\n <div class=\"logo\">\n <svg viewbox=\"0 0 80 80\" class=\"rela-block logo-svg\">\n <path d=\"M 10 10 L 52 10 L 72 30 L 72 70 L 30 70 L 10 50 Z\" stroke-width=\"2.5\" fill=\"none\"/>\n </svg>\n <p class=\"logo-text\">LIP</p>\n </div>\n </div><br>\n <p class=\"rela-block social twitter\">lorem_ipsum</p>\n <p class=\"rela-block social linked-in\">lorem-ipsum-dolor</p>\n\n <p class=\"rela-block caps side-header\">Skills</p>\n <p class=\"rela-block list-thing\">Lorem Ipsum</p>\n <p class=\"rela-block list-thing\">Dolor Sit</p>\n <p class=\"rela-block list-thing\">Amet Consectetur</p>\n\n <p class=\"rela-block caps side-header\">Expertise</p>\n <p class=\"rela-block list-thing\">Adipiscing Elit</p>\n <p class=\"rela-block list-thing\">Sed Do Eiusmod</p>\n <p class=\"rela-block list-thing\">Tempor Incididunt</p>\n </div>\n\n <div class=\"rela-block content-container\">\n <h2 class=\"rela-block caps title\">Lorem Ipsum Developer</h2>\n <div class=\"rela-block separator\"></div>\n\n <div class=\"rela-block caps greyed\">Profile</div>\n <p class=\"long-margin\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n </p>\n\n <div class=\"rela-block caps greyed\">Experience</div>\n\n <h3>#1 job</h3>\n <p class=\"light\">job description</p>\n <p class=\"justified\">\n Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n </p>\n \n <h3>#2 job</h3>\n <p class=\"light\">Job description</p>\n <p class=\"justified\">\n Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Integer nec odio. Praesent libero. Sed cursus ante dapibus diam.\n </p>\n \n <div class=\"rela-block caps greyed\">Education</div>\n <h3>Bachelor of Lorem Engineering</h3>\n <p class=\"light\">At Ipsum University, Dolorland - 2023</p>\n\n <div class=\"rela-block caps greyed\">Language</div>\n <h3>Loremese - native</h3>\n <h3>Ipsumish - fluent</h3>\n </div>\n </div>\n \n <script src='https://code.jquery.com/jquery-2.2.4.min.js'></script>\n <script src=\"./script.js\"></script>\n\n </body>\n</html>\n"
},
"typeVersion": 1.2
},
{
"id": "c801830f-6fb9-464d-9509-e8629f6d722c",
"name": "change JSON to HTML",
"type": "n8n-nodes-base.code",
"position": [
272,
656
],
"parameters": {
"jsCode": "// Function to trim LinkedIn job URLs\nconst trimLinkedInJobUrl = (url) => {\n const match = url.match(/^(https:\\/\\/www\\.linkedin\\.com\\/jobs\\/view\\/\\d+)/);\n return match ? match[1] : url;\n};\n\n// Main n8n Code node\nreturn items.map(item => {\n // Access data\n const skills = item.json.output.skills || [];\n const tools = item.json.output.tools_expertise || [];\n\n // Get LinkedIn URL from Telegram Trigger\n const rawUrl = $('Telegram Trigger').first().json.message.link_preview_options.url;\n const trimmedUrl = rawUrl ? trimLinkedInJobUrl(rawUrl) : null;\n\n // Build HTML for skills\n const htmlOutput = skills\n .map(skill => `<p class=\"rela-block list-thing\">${skill}</p>`)\n .join(\"\\n\");\n\n // Build HTML for tools\n const htmlTools = tools\n .map(tool => `<p class=\"rela-block list-thing\">${tool}</p>`)\n .join(\"\\n\");\n\n // Return data\n return {\n json: {\n skill: htmlOutput,\n tool: htmlTools,\n trimmed_url: trimmedUrl\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "c122c601-741b-4ee4-b005-3ffa18cea1cb",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
528,
1216
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ee9faca1-649e-45ed-99c2-780398c076d7",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
464,
960
],
"parameters": {
"color": 3,
"width": 1152,
"height": 416,
"content": "## GITHUB SETUP\nRun this once to add **style.css** to the GitHub repository.\n\n## Note\n\nReplace `<your_webhook_url>` at the end of the **notify-n8n.yml** in set node with your actual n8n webhook URL.\n"
},
"typeVersion": 1
},
{
"id": "9f8e5e61-65f6-4df7-9a1a-76aad7ba4479",
"name": "style.css1",
"type": "n8n-nodes-base.github",
"position": [
976,
1216
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/<username>"
},
"filePath": "docs/style.css",
"resource": "file",
"repository": {
"__rl": true,
"mode": "list",
"value": "Job-apply"
},
"fileContent": "={{ $json.css }}",
"commitMessage": "=style.css"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "09b59cb1-78e6-48e5-9fc9-7b6cd1331505",
"name": "css +yml code",
"type": "n8n-nodes-base.set",
"position": [
752,
1216
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "7b21573f-1530-4841-9b3a-9311b30237d2",
"name": "css",
"type": "string",
"value": "* {\n box-sizing: border-box;\n transition: 0.35s ease;\n}\n\n.rela-block {\n display: block;\n position: relative;\n margin: auto;\n}\n\n.rela-inline {\n display: inline-block;\n position: relative;\n margin: auto;\n}\n\n.floated {\n display: inline-block;\n position: relative;\n float: left;\n}\n\n.abs-center {\n position: absolute;\n top: 25%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n width: 88%;\n}\n\nbody {\n font-family: 'Open Sans';\n font-size: 14px;\n letter-spacing: 0;\n font-weight: 400;\n line-height: 14px;\n background: url(\"http://kingofwallpapers.com/leaves/leaves-016.jpg\") right no-repeat;\n background-size: cover;\n}\n\nbody:before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.92);\n}\n\n.caps {\n text-transform: uppercase;\n}\n\n.justified {\n text-align: justify;\n}\n\np.light {\n color: #777;\n}\n\nh2 {\n font-family: 'Open Sans';\n font-size: 24px;\n letter-spacing: 5px;\n font-weight: 600;\n line-height: 30px;\n color: #000;\n}\n\nh3 {\n font-family: 'Open Sans';\n font-size: 21px;\n letter-spacing: 1px;\n font-weight: 600;\n line-height: 15px;\n color: #000;\n}\n\n.page {\n width: 100%;\n height: 100vh;\n margin: 0;\n background-color: #fff;\n box-shadow: none;\n}\n\n.top-bar {\n height: 150px;\n background-color: #848484;\n color: #fff;\n}\n\n.name {\n position: absolute;\n left: calc(200px + 5%);\n right: 0;\n height: 90px;\n text-align: center;\n font-family: 'Raleway';\n font-size: 32px;\n letter-spacing: 8px;\n font-weight: 100;\n line-height: 60px;\n}\n\n.name div {\n width: 94%;\n}\n\n.side-bar {\n position: absolute;\n top: 40px;\n left: 1%;\n bottom: 40px;\n width: 150px;\n background-color: #f7e0c1;\n padding: 220px 3px 2px;\n}\n\n.mugshot {\n position: absolute;\n top: 50px;\n left: 25px;\n height: 100px;\n width: 100px;\n}\n\n.mugshot .logo {\n margin: 0;\n}\n\n.logo {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 100;\n color: #000;\n height: 120px;\n width: 120px;\n}\n\n.logo .logo-svg {\n height: 100%;\n width: 100%;\n stroke: #000;\n cursor: pointer;\n}\n\n.logo .logo-text {\n position: absolute;\n top: 45%;\n right: 16%;\n cursor: pointer;\n font-family: \"Montserrat\";\n font-size: 25px;\n font-weight: 400;\n line-height: 58px;\n}\n\n.social {\n padding-left: 25px;\n margin-bottom: 25px;\n cursor: pointer;\n position: relative;\n}\n\n.social:before {\n content: \"\";\n position: absolute;\n top: -4px;\n left: 0;\n height: 20px;\n width: 20px;\n background-size: cover !important;\n}\n\n.social.twitter:before {\n background: url(\"https://cdn4.iconfinder.com/data/icons/iconsimple-logotypes/512/github-256.png\") center no-repeat;\n}\n\n.social.github:before {\n background: url(\"https://cdn3.iconfinder.com/data/icons/social-media-2026/60/Socialmedia_icons_Pinterest-23-128.png\") center no-repeat;\n}\n\n.social.linked-in:before {\n background: url(\"https://cdn3.iconfinder.com/data/icons/social-media-2026/60/Socialmedia_icons_LinkedIn-128.png\") center no-repeat;\n}\n\n.side-header {\n font-family: 'Open Sans';\n font-size: 18px;\n letter-spacing: 1px;\n font-weight: 600;\n line-height: 21px;\n margin: 40px auto 10px;\n padding-bottom: 5px;\n border-bottom: 1px solid #888;\n}\n\n.list-thing {\n padding-left: 25px;\n margin-bottom: 10px;\n}\n\n.content-container {\n margin-right: 0;\n width: calc(95% - 150px);\n padding: 25px 20px 50px;\n}\n\n.content-container > * {\n margin: 0 auto 15px;\n}\n\n.content-container > h3 {\n margin: 0 auto 10px;\n}\n\n.contact-block {\n position: relative;\n text-align: center;\n width: 88%;\n"
},
{
"id": "91801897-70b0-4ebb-91c4-a7097e2cf4e4",
"name": "html",
"type": "string",
"value": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <title>Lorem Ipsum Resume</title>\n <link rel=\"stylesheet\" href=\"https://public.codepenassets.com/css/reset-2.0.min.css\">\n <link rel=\"stylesheet\" href=\"./style.css\">\n</head>\n\n<body>\n <!-- FONTS -->\n <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\" type=\"text/css\">\n <link href=\"https://fonts.googleapis.com/css?family=Raleway:100\" rel=\"stylesheet\" type=\"text/css\">\n <link href=\"https://fonts.googleapis.com/css?family=Montserrat\" rel=\"stylesheet\" type=\"text/css\">\n\n <!-- PAGE STUFF -->\n <div class=\"rela-block page\">\n <div class=\"rela-block top-bar\">\n <div class=\"caps name\">\n <div class=\"abs-center\">\n Lorem Ipsum\n <div class=\"contact-info\">\n <p>1234 Dolor Sit Street</p>\n <p>Amet City, Consectetur 56789</p>\n <p>+1234567890</p>\n <p>user@example.com</p>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"side-bar\">\n <div class=\"mugshot\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 80 80\" class=\"rela-block logo-svg\">\n <path d=\"M 10 10 L 52 10 L 72 30 L 72 70 L 30 70 L 10 50 Z\" stroke-width=\"2.5\" fill=\"none\" />\n </svg>\n <p class=\"logo-text\">LIP</p>\n </div>\n </div>\n <br>\n <p class=\"rela-block social twitter\">lorem_ipsum</p>\n <p class=\"rela-block social linked-in\">lorem-ipsum-dolor</p>\n\n <p class=\"rela-block caps side-header\">Skills</p>\n <p class=\"rela-block list-thing\">Lorem Ipsum</p>\n <p class=\"rela-block list-thing\">Dolor Sit</p>\n <p class=\"rela-block list-thing\">Amet Consectetur</p>\n\n <p class=\"rela-block caps side-header\">Expertise</p>\n <p class=\"rela-block list-thing\">Adipiscing Elit</p>\n <p class=\"rela-block list-thing\">Sed Do Eiusmod</p>\n <p class=\"rela-block list-thing\">Tempor Incididunt</p>\n </div>\n\n <div class=\"rela-block content-container\">\n <h2 class=\"rela-block caps title\">Lorem Ipsum Developer</h2>\n <div class=\"rela-block separator\"></div>\n\n <div class=\"rela-block caps greyed\">Profile</div>\n <p class=\"long-margin\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore\n magna aliqua.\n Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n </p>\n\n <div class=\"rela-block caps greyed\">Experience</div>\n\n <h3>#1 Job</h3>\n <p class=\"light\">Job description</p>\n <p class=\"justified\">\n Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n </p>\n\n <h3>#2 Job</h3>\n <p class=\"light\">Job description</p>\n <p class=\"justified\">\n Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Integer nec odio. Praesent libero. Sed cursus ante dapibus diam.\n </p>\n\n <div class=\"rela-block caps greyed\">Education</div>\n <h3>Bachelor of Lorem Engineering</h3>\n <p class=\"light\">At Ipsum University, Dolorland - 2023</p>\n\n <div class=\"rela-block caps greyed\">Language</div>\n <h3>Loremese - native</h3>\n <h3>Ipsumish - fluent</h3>\n </div>\n </div>\n\n <script src=\"https://code.jquery.com/jquery-2.2.4.min.js\"></script>\n <script src=\"./script.js\"></script>\n</body>\n\n</html>\n"
},
{
"id": "6872f821-95f7-4815-8929-d3bb23a30681",
"name": "yml",
"type": "string",
"value": "name: Notify n8n on GitHub Pages Deploy\n\non:\n workflow_run:\n workflows: [\"pages-build-deployment\"]\n types:\n - completed\n\njobs:\n notify:\n if: ${{ github.event.workflow_run.conclusion == 'success' }}\n runs-on: ubuntu-latest\n steps:\n - name: Get commit message\n id: get_message\n run: |\n COMMIT_MESSAGE=$(curl -s \\\n -H \"Accept: application/vnd.github+json\" \\\n -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n https://api.github.com/repos/${{ github.repository }}/commits/${{ github.event.workflow_run.head_sha }} \\\n | jq -r '.commit.message')\n echo \"message=$COMMIT_MESSAGE\" >> $GITHUB_OUTPUT\n\n - name: Send POST to n8n webhook\n run: |\n curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d \"{\\\"status\\\": \\\"deployed\\\", \\\n \\\"repo\\\": \\\"${{ github.repository }}\\\", \\\n \\\"branch\\\": \\\"${{ github.ref_name }}\\\", \\\n \\\"commit\\\": \\\"${{ github.event.workflow_run.head_sha }}\\\", \\\n \\\"message\\\": \\\"${{ steps.get_message.outputs.message }}\\\"}\" \\\n <your_webhook_url>"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "588cea32-465d-464d-a1e7-60d6fe3293bb",
"name": "index.html setup",
"type": "n8n-nodes-base.github",
"position": [
1200,
1216
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/<username>"
},
"filePath": "docs/index.html",
"resource": "file",
"repository": {
"__rl": true,
"mode": "list",
"value": "Job-apply"
},
"fileContent": "={{ $json.html }}",
"commitMessage": "index.html"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "af933dd6-1a3a-4887-96f5-16f9f963bbe9",
"name": "yml setup",
"type": "n8n-nodes-base.github",
"position": [
1424,
1216
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/<username>"
},
"filePath": "github/workflows/notify-n8n.yml",
"resource": "file",
"repository": {
"__rl": true,
"mode": "list",
"value": "Job-apply"
},
"fileContent": "={{ $json['notify-n8n'].yml }}",
"commitMessage": "=notify-n8n.yml"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "d616be1b-9745-4449-8838-467ae97036fa",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
432,
544
],
"parameters": {
"height": 272,
"content": "## HTML template\nEdit this to your liking can use llm to help found where can be edited\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "p3JNAkab4FftCjPL",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "4829d028-5a80-4a2a-9fa9-2abd8f697bd1",
"connections": {
"github": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Insert row",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "change JSON to HTML",
"type": "main",
"index": 0
}
]
]
},
"HTML code": {
"main": [
[
{
"node": "github",
"type": "main",
"index": 0
}
]
]
},
"style.css1": {
"main": [
[
{
"node": "index.html setup",
"type": "main",
"index": 0
}
]
]
},
"JSON Output": {
"ai_outputParser": [
[
{
"node": "AI Agent1",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Upload file": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"css +yml code": {
"main": [
[
{
"node": "style.css1",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory1": {
"ai_memory": [
[
{
"node": "AI Agent1",
"type": "ai_memory",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"experience table": {
"ai_tool": [
[
{
"node": "AI Agent1",
"type": "ai_tool",
"index": 0
}
]
]
},
"index.html setup": {
"main": [
[
{
"node": "yml setup",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"change JSON to HTML": {
"main": [
[
{
"node": "HTML code",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Append or update row in sheet": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "css +yml code",
"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.
githubApigoogleDriveOAuth2ApigoogleSheetsOAuth2ApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This project is an automation workflow that generates a personalized resume and cover letter for each job listing. Generates an HTML resume from your data. Hosts it live on GitHub Pages. Converts it to PDF using Gotenberg and saves it to Google Drive. Uses an LLM to create a…
Source: https://n8n.io/workflows/10242/ — 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.
HDW Lead Geländewagen. Uses chatTrigger, lmChatOpenAi, memoryBufferWindow, outputParserStructured. Chat trigger; 92 nodes.
This comprehensive workflow automates the complete financial document processing pipeline using AI. Upload invoices via chat, drop expense receipts into a folder, or add bank statements - the system a
by Varritech Technologies
Who’s it for Creators who want to create faceless videos automatically, while keeping human oversight and quality control.
The Best Linkedin Posting System. Uses httpRequest, lmChatOpenAi, agent, chatTrigger. Chat trigger; 49 nodes.