{"meta":{"instanceId":"0a7ae129a7d703150135f6cc24d0469f20ffd22b5ed59c23ee3e0608264e6d98","templateCredsSetupCompleted":true},"nodes":[{"id":"bdf7d44b-b13e-4bfc-bbb5-0fabe8abd40a","name":"Send Acknowledgement Email","type":"n8n-nodes-base.gmail","position":[-20,1140],"webhookId":"959be407-da29-4fef-bb85-ac5cc6b41a6d","parameters":{"sendTo":"={{ $json.contact_info.email }}","message":"We will get in touch shortly.","options":{"senderName":"VLM Run","appendAttribution":false},"subject":"Thanks for Your Interest"},"credentials":{"gmailOAuth2":{"id":"7MVziRpoyD8arghO","name":"Gmail account 2"}},"typeVersion":2.1},{"id":"72290874-1493-4980-a445-ac5d5f752ebd","name":"🔍 GitHub Analysis Documentation3","type":"n8n-nodes-base.stickyNote","position":[-1460,100],"parameters":{"color":7,"width":1260,"height":640,"content":"## 🔍 GitHub Intelligence Engine\n\n**Deep analysis of candidate's GitHub profile and repositories.**\n\n**Profile Analysis:**\n- Account age & experience\n- Follower/following metrics\n- Public repository count\n- Bio and company info\n\n**Repository Intelligence:**\n- Language distribution\n- Framework detection (30+)\n- Total stars & forks\n- Recent activity tracking\n\n**Technology Detection:**\n- Frontend: React, Vue, Angular\n- Backend: Express, Django, Flask\n- Mobile: React Native, Flutter\n- DevOps: Docker, AWS, Kubernetes\n\n**Smart Features:**\n- Handles missing profiles gracefully\n- Calculates experience automatically\n- Ranks technologies by usage\n- Identifies trending skills"},"typeVersion":1},{"id":"2cc059ed-deb1-4cd6-bc35-a840e7e3fb9f","name":"🤖 AI Processing Documentation1","type":"n8n-nodes-base.stickyNote","position":[-1860,100],"parameters":{"color":3,"width":380,"height":880,"content":"## 🤖 AI Resume Analysis\n\n**VLM Run processes resumes to extract structured candidate data.**\n\n**Features:**\n- Contact information extraction\n- Skills identification\n- Experience parsing\n- Education details\n- Social profile detection\n\n**Advanced Extraction:**\n- Name, email, phone\n- GitHub & LinkedIn URLs\n- Work history\n- Technical skills\n- Certifications\n\n**Output:**\n- Structured JSON data\n- Normalized fields\n- Ready for analysis\n\n**Benefits:**\n- Eliminates manual data entry\n- Consistent formatting\n- Accurate extraction\n- Scalable processing"},"typeVersion":1},{"id":"92d64d61-d690-4d68-8ee7-ebb0f231c02c","name":"📧 Intake Documentation1","type":"n8n-nodes-base.stickyNote","position":[-2260,100],"parameters":{"color":7,"width":380,"height":880,"content":"## 📧 Resume Intake Processing\n\n**Monitors Gmail for incoming resume submissions and automatically triggers processing.**\n\n**Process:**\n1. Watches inbox every minute\n2. Detects emails with attachments\n3. Auto-triggers on new resumes\n4. Downloads PDF attachments\n\n**Supported Formats:**\n- PDF resumes\n- DOC/DOCX files\n- Various layouts\n- Multi-page documents\n\n**Trigger Conditions:**\n- New email received\n- Contains attachments\n- Attachment download enabled\n- Real-time processing"},"typeVersion":1},{"id":"a6a81e04-0f29-44c6-aa81-0b642517b7bb","name":"📋 Workflow Overview1","type":"n8n-nodes-base.stickyNote","position":[-2740,100],"parameters":{"color":7,"width":460,"height":880,"content":"## 📋 AI Resume Processing & GitHub Analysis\n\n**Overview:**\nAutomatically processes resumes received via email and generates comprehensive candidate profiles with AI-powered resume parsing and GitHub analysis.\n\n**Workflow:**\n1. 📧 Monitor Gmail for resume submissions\n2. 🤖 Parse resume with AI extraction\n3. 🔍 Analyze GitHub profile (if available)\n4. 📊 Create comprehensive candidate profile\n5. 💬 Notify team via Slack + save to Sheets\n6. ✉️ Send acknowledgment to candidate\n\n**Perfect for:**\n- HR departments\n- Technical recruiting\n- Talent acquisition teams\n- Startup hiring\n- Developer assessment\n\n**Requirements:**\n- VLM Run API access\n- Gmail OAuth2\n- Google Sheets access\n- Slack webhook\n- GitHub API (optional authentication)"},"typeVersion":1},{"id":"3d3a320b-b63d-4248-a01e-6f75fb77b716","name":"📊 Output Documentation1","type":"n8n-nodes-base.stickyNote","position":[-180,100],"parameters":{"color":7,"width":420,"height":1240,"content":"## 📊 Multi-Channel Output\n\n**Delivers comprehensive candidate data across multiple platforms.**\n\n**Google Sheets Integration:**\n- Structured candidate database\n- 20+ data columns\n- Searchable & filterable\n- Historical tracking\n\n**Slack Notifications:**\n- Instant team alerts\n- Rich candidate summaries\n- GitHub profile highlights\n- Technology breakdown\n\n**Email Automation:**\n- Professional acknowledgments\n- Personalized messages\n- GitHub profile mentions\n- Builds candidate experience\n\n**Benefits:**\n- Centralized data storage\n- Real-time team updates\n- Professional communication\n- Streamlined hiring process"},"typeVersion":1},{"id":"4c4d9503-4b4a-4a95-bf64-67d4e0acc7b2","name":"Monitor Gmail for Resumes","type":"n8n-nodes-base.gmailTrigger","position":[-2160,760],"parameters":{"simple":false,"filters":{},"options":{"downloadAttachments":true},"pollTimes":{"item":[{"mode":"everyMinute"}]}},"credentials":{"gmailOAuth2":{"id":"7MVziRpoyD8arghO","name":"Gmail account 2"}},"typeVersion":1.2},{"id":"a888c038-d826-4cd0-aefc-f9aca346a7f2","name":"Parse Resume with VLM Run","type":"@vlm-run/n8n-nodes-vlmrun.vlmRun","position":[-1720,760],"parameters":{"file":"attachment_0","domain":"document.resume"},"credentials":{"vlmRunApi":{"id":"cF5KpbVmnt36bdWr","name":"VLM Run account 6"}},"typeVersion":1},{"id":"1134c82c-77e6-438d-8fbc-77807837db17","name":"Check for Github Profile","type":"n8n-nodes-base.if","position":[-1360,760],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e28a7d82-d42c-4ce0-9a7d-7f9ef94090c2","operator":{"type":"string","operation":"exists","singleValue":true},"leftValue":"={{ $json.response.contact_info.github }}","rightValue":""}]}},"typeVersion":2.2},{"id":"29ef7e94-6c03-4e0c-98e6-3720b6e078cb","name":"Extract GitHub Username","type":"n8n-nodes-base.code","position":[-1080,540],"parameters":{"jsCode":"const url = $input.first().json.response.contact_info.github\nconst username = url.split('github.com/')[1].split('/')[0];\nreturn [{ json: { username } }];"},"typeVersion":2},{"id":"2c851eda-2501-4b8a-a855-9ac5cb750d3c","name":"Fetch GitHub Profile","type":"n8n-nodes-base.httpRequest","position":[-840,340],"parameters":{"url":"=https://api.github.com/users/{{ $json.username }}","options":{}},"typeVersion":4.2},{"id":"19528631-4eab-420b-9601-25d96e65b9c8","name":"Fetch GitHub Repositories","type":"n8n-nodes-base.httpRequest","position":[-840,540],"parameters":{"url":"=https://api.github.com/users/{{ $json.username }}/repos","options":{}},"typeVersion":4.2},{"id":"7ac5cbc4-828c-42d1-addf-162458ac6fda","name":"Process Profile Data","type":"n8n-nodes-base.code","position":[-620,340],"parameters":{"jsCode":"const user = items[0].json;\n\n// Parse creation and update dates\nconst created = new Date(user.created_at);\nconst updated = new Date(user.updated_at);\n\n// Calculate difference in milliseconds\nconst diffTime = Math.abs(updated - created);\n\n// Convert milliseconds to years\nconst years = diffTime / (1000 * 60 * 60 * 24 * 365.25);\n\n// Round to nearest whole number\nconst experience = `~${Math.round(years)}`;\n\n// Return desired output\nreturn [\n  {\n    json: {\n      login: user.login,\n      public_repos: user.public_repos,\n      followers: user.followers,\n      experience\n    }\n  }\n];"},"typeVersion":2},{"id":"1b32ce5f-3213-43b0-a604-be204c1ae476","name":"Analyze Repository Data","type":"n8n-nodes-base.code","position":[-600,540],"parameters":{"jsCode":"// Initialize counts\nlet languageCount = {};\nlet frameworkCount = {};\nlet totalStars = 0;\nlet totalForks = 0;\n\n// Full list of frameworks, libraries, and tools\nconst knownFrameworks = [\n  \"React\", \"Angular\", \"Vue\", \"Bootstrap\", \"Tailwind\", \"jQuery\",\n  \"Node\", \"Express\", \"Django\", \"Flask\", \"Spring Boot\", \"Laravel\", \"Rails\",\n  \"React Native\", \"Flutter\", \"Ionic\",\n  \"MongoDB\", \"MySQL\", \"PostgreSQL\", \"Firebase\",\n  \"Docker\", \"Jenkins\", \"GitHub\", \"GitLab\", \"AWS\", \"Azure\", \"Netlify\", \"Vercel\",\n  \"Jest\", \"Mocha\", \"Cypress\", \"Selenium\",\n  \"FastAPI\", \"Redux\", \"Redux Toolkit\"\n];\n\n// Helper function to extract frameworks\nfunction extractFrameworks(text) {\n  if (!text) return [];\n\n  const matches = new Set();\n  const lowerText = text.toLowerCase();\n\n  for (const fw of knownFrameworks) {\n    if (lowerText.includes(fw.toLowerCase())) {\n      matches.add(fw);\n    }\n  }\n\n  return Array.from(matches);\n}\n\n// Loop through repositories\nfor (const item of items) {\n  const repo = item.json;\n\n  // Count languages\n  const lang = repo.language;\n  if (lang) {\n    languageCount[lang] = (languageCount[lang] || 0) + 1;\n  }\n\n  // Count frameworks from description and topics\n  const descFrameworks = extractFrameworks(repo.description);\n  const topicFrameworks = extractFrameworks((repo.topics || []).join(\" \"));\n  const allFrameworks = new Set([...descFrameworks, ...topicFrameworks]);\n\n  for (const fw of allFrameworks) {\n    frameworkCount[fw] = (frameworkCount[fw] || 0) + 1;\n  }\n\n  // Add stars and forks\n  totalStars += repo.stargazers_count || 0;\n  totalForks += repo.forks_count || 0;\n}\n\n// Return combined result\nreturn [\n  {\n    json: {\n      languageCount,\n      frameworkCount,\n      totalStars,\n      totalForks\n    }\n  }\n];"},"typeVersion":2},{"id":"7f58201c-7656-4aae-9423-52680aa37b82","name":"Combine GitHub Data","type":"n8n-nodes-base.merge","position":[-360,540],"parameters":{"numberInputs":3},"typeVersion":3.1},{"id":"09f1229a-4638-44b2-8244-139b9b9022de","name":"Flatten Response","type":"n8n-nodes-base.code","position":[-500,780],"parameters":{"jsCode":"const allItems = $input.all();\n\n// Defensive checks to ensure indexes exist\nconst resumeData = allItems[0]?.json?.response || {};\nconst githubData = allItems[1]?.json || {};\nconst repoData = allItems[2]?.json || {};\n\n// Merge into one object\nconst mergedData = {\n  ...githubData,\n  ...resumeData,\n  ...repoData\n};\n\n// Return as single item array\nreturn [\n  {\n    json: mergedData\n  }\n];"},"typeVersion":2},{"id":"e8f89ee8-2bcd-464a-8ec8-2be11bf1c2b2","name":"Save to Google Sheet","type":"n8n-nodes-base.googleSheets","position":[-20,780],"parameters":{"columns":{"value":{"Name":"={{ $json.contact_info.full_name }}","Email":"={{ $json.contact_info.email }}","Phone no.":"={{ $json.contact_info.phone }}","Github URL":"={{ $json.contact_info.github }}","C++ Projects":"={{ $json.languageCount?.cpp || null }}","LinkedIn URL":"={{ $json.contact_info.linkedin }}","Java Projects":"={{ $json.languageCount?.Java || null }}","React Projects":"={{ $json.languageCount?.React || null }}","Python Projects":"={{ $json.languageCount?.Python || null }}","GitHub Experience":"={{ $json.expeience || null }}","GitHub Fork Count":"={{ $json.totalForks || null}}","GitHub Star Count":"={{ $json.totalStars || null }}","Github Repo Count":"={{ $json.public_repos || null }}","Javascript Projects":"={{ $json.languageCount?.JavaScript || null }}","TypeScript Projects":"={{ $json.languageCount?.TypeScript || null }}","Github follower count":"={{ $json.followers || null }}"},"schema":[{"id":"Name","type":"string","display":true,"removed":false,"required":false,"displayName":"Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Email","type":"string","display":true,"required":false,"displayName":"Email","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Phone no.","type":"string","display":true,"required":false,"displayName":"Phone no.","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Github URL","type":"string","display":true,"required":false,"displayName":"Github URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LinkedIn URL","type":"string","display":true,"required":false,"displayName":"LinkedIn URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"GitHub Experience","type":"string","display":true,"required":false,"displayName":"GitHub Experience","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Github follower count","type":"string","display":true,"required":false,"displayName":"Github follower count","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Github Repo Count","type":"string","display":true,"required":false,"displayName":"Github Repo Count","defaultMatch":false,"canBeUsedToMatch":true},{"id":"GitHub Star Count","type":"string","display":true,"required":false,"displayName":"GitHub Star Count","defaultMatch":false,"canBeUsedToMatch":true},{"id":"GitHub Fork Count","type":"string","display":true,"required":false,"displayName":"GitHub Fork Count","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Javascript Projects","type":"string","display":true,"required":false,"displayName":"Javascript Projects","defaultMatch":false,"canBeUsedToMatch":true},{"id":"TypeScript Projects","type":"string","display":true,"required":false,"displayName":"TypeScript Projects","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Python Projects","type":"string","display":true,"required":false,"displayName":"Python Projects","defaultMatch":false,"canBeUsedToMatch":true},{"id":"C++ Projects","type":"string","display":true,"required":false,"displayName":"C++ Projects","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Java Projects","type":"string","display":true,"required":false,"displayName":"Java Projects","defaultMatch":false,"canBeUsedToMatch":true},{"id":"React Projects","type":"string","display":true,"required":false,"displayName":"React Projects","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Name"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8/edit?usp=drivesdk","cachedResultName":"Candidate VLM Run n8n"}},"credentials":{"googleSheetsOAuth2Api":{"id":"PUb43NJG1YGrwYl2","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"4f4fd7ca-fc02-44c1-a617-02eec8aedbdb","name":"Send Slack Notification","type":"n8n-nodes-base.slack","position":[-20,960],"webhookId":"40bb1048-877d-4221-91ff-3cb7923dbdd8","parameters":{"text":"=🚨 *New Job Application Received!*\n\n📨 *Candidate Name:* {{ $json.contact_info.full_name }}\n📧 *Email:* <mailto:{{ $json.contact_info.email }}|{{ $json.contact_info.email }}>\n\n📝 A new application has just been submitted. Check <https://docs.google.com/spreadsheets/d/1DWi8rZy6LPHFe7JDzPXuIh_VO027P20C3Om9Owf--1g/edit?gid=0#gid=0/|here> for full details.","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C08S3SR2LUW","cachedResultName":"workflow-testing"},"otherOptions":{"mrkdwn":true}},"credentials":{"slackApi":{"id":"sNMFh7sXAUyWsuXd","name":"Slack account 2"}},"typeVersion":2.3}],"pinData":{},"connections":{"Flatten Response":{"main":[[{"node":"Send Slack Notification","type":"main","index":0},{"node":"Send Acknowledgement Email","type":"main","index":0},{"node":"Save to Google Sheet","type":"main","index":0}]]},"Combine GitHub Data":{"main":[[{"node":"Flatten Response","type":"main","index":0}]]},"Fetch GitHub Profile":{"main":[[{"node":"Process Profile Data","type":"main","index":0}]]},"Process Profile Data":{"main":[[{"node":"Combine GitHub Data","type":"main","index":0}]]},"Analyze Repository Data":{"main":[[{"node":"Combine GitHub Data","type":"main","index":1}]]},"Extract GitHub Username":{"main":[[{"node":"Fetch GitHub Profile","type":"main","index":0},{"node":"Fetch GitHub Repositories","type":"main","index":0}]]},"Check for Github Profile":{"main":[[{"node":"Extract GitHub Username","type":"main","index":0}],[{"node":"Flatten Response","type":"main","index":0}]]},"Fetch GitHub Repositories":{"main":[[{"node":"Analyze Repository Data","type":"main","index":0}]]},"Monitor Gmail for Resumes":{"main":[[{"node":"Parse Resume with VLM Run","type":"main","index":0}]]},"Parse Resume with VLM Run":{"main":[[{"node":"Check for Github Profile","type":"main","index":0}]]}}}