Mistral OCR 및 Gemini AI 이력서 분석을 사용한 후보자 스크리닝 자동화
이것은HR, Multimodal AI분야의자동화 워크플로우로, 18개의 노드를 포함합니다.주로 MistralAi, FormTrigger, GoogleSheets, ManualTrigger, ChainLlm 등의 노드를 사용하며. Mistral OCR과 Gemini AI 이력서 분석을 사용한 후보자 스크리닝 자동화
- •Google Sheets API 인증 정보
- •Google Gemini API Key
사용된 노드 (18)
{
"meta": {
"instanceId": "e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"
},
"nodes": [
{
"id": "821d52da-591f-44db-b218-ee3974855a05",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 스프레드시트 생성1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-1408,
608
],
"parameters": {
"color": 7,
"width": 272,
"height": 272,
"content": "Initializes a new Google Sheet with columns for applicant data. Can be replaced with Airtable, Notion, etc."
},
"typeVersion": 1
},
{
"id": "72c7af0e-d8f8-4498-a849-b95c323a6cd6",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 행 추가1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-720,
256
],
"parameters": {
"color": 7,
"width": 320,
"height": 288,
"content": "Adds the applicant's name and email to the Google Sheet right after they submit the form to have it logged even if the workflow fails."
},
"typeVersion": 1
},
{
"id": "b8076a35-fb6e-481d-9d92-3a95e9c3c732",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 텍스트 추출1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-704,
576
],
"parameters": {
"color": 7,
"width": 224,
"height": 304,
"content": "This uses **[Mistral OCR](https://mistral.ai/fr/news/mistral-ocr)**, it extracts the text perfectly from a candidate's CV (PDF).\n\n**[Get your Mistral API key here](https://console.mistral.ai/api-keys)**"
},
"typeVersion": 1
},
{
"id": "f7d1f44f-2d84-4a97-adad-2923f6ba1736",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - LLM 체인1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-464,
608
],
"parameters": {
"color": 6,
"width": 320,
"height": 248,
"content": "Adapt the `job requirements` in the prompt to **your position & criteria**."
},
"typeVersion": 1
},
{
"id": "a1e153ae-1a1b-4a4f-b901-b999c31b4059",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 출력 파서1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-320,
912
],
"parameters": {
"color": 7,
"width": 368,
"height": 256,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\nEnsures the AI's response is perfectly structured as JSON (e.g., `qualificationRate`, `explanation`), making the data reliable and easy to use."
},
"typeVersion": 1
},
{
"id": "641d597c-400b-4d6c-a21c-5fc28099c9be",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 행 업데이트1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-128,
608
],
"parameters": {
"color": 7,
"width": 272,
"height": 256,
"content": "Check your Google Sheets! You now have the analysis of the candidate."
},
"typeVersion": 1
},
{
"id": "704e43dd-ee85-4514-8a41-cb3daaf71eee",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모 - 워크플로우 목표1",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-1872,
288
],
"parameters": {
"width": 448,
"height": 592,
"content": "## Automated CV Scanner\n\nThis workflow automates your hiring pipeline:\n1. **Collects** applications via a web form.\n2. **Extracts** text from the CV (PDF).\n3. **Analyzes** the CV with AI against your job description.\n4. **Stores** the candidate's score and a detailed explanation in Google Sheets.\n\n\n### Questions or Feedback?\nFor feedback, coaching, built-for-you workflows, or any questions, use my unified AI-powered contact form.\n\n➡️ **[Get in Touch Here](https://api.ia2s.app/form/templates/academy)**\n\n*Happy Automating! —Lucas Peyrin*"
},
"typeVersion": 1
},
{
"id": "cb5ef831-79f7-4129-9642-6ece79a3603e",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "지원서 양식",
"type": "n8n-nodes-base.formTrigger",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-928,
704
],
"webhookId": "230e09f7-33df-4266-917d-ce3398cae141",
"parameters": {
"options": {
"path": "230e09f7-33df-4266-917d-ce3398cae141",
"customCss": "/* --- ROOT VARIABLES (Dark Professional Theme) --- */\n:root {\n\t/* --- FONT MAPPING --- */\n\t--font-family: 'Inter', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 14px;\n\t--font-size-label: 14px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--line-height-base: 1.6;\n\n\t/* --- COLOR MAPPING (Dark Slate/Purple Theme) --- */\n\t--color-page-bg: #111827; /* Dark Slate */\n\t--color-card-bg-glass: rgba(29, 39, 53, 0.65); /* Darker, less transparent glass */\n\t--color-card-border-glass: rgba(255, 255, 255, 0.1); /* Subtle light border */\n\t--color-input-bg: #1F2937; /* Slightly lighter than page bg */\n\t--color-header: #F9FAFB; /* Off-white for high contrast */\n\t--color-label: #9CA3AF; /* Light gray for secondary text */\n\t--color-input-text: #F9FAFB;\n\t--color-input-border: #4B5563; /* Mid-gray border */\n\t--color-focus-border: #8B5CF6; /* Vibrant Purple */\n\t--color-link: #8B5CF6;\n\t--color-submit-btn-bg: #8B5CF6;\n\t--color-submit-btn-hover-bg: #7C3AED; /* Darker Purple */\n\t--color-submit-btn-text: #FFFFFF;\n\t--color-error: #F43F5E; /* Vibrant Rose for errors */\n\t--color-required: #F43F5E;\n\n\t/* --- DIMENSIONS & SPACING --- */\n\t--container-width: 550px;\n\t--border-radius-card: 16px;\n\t--border-radius-input: 8px;\n\t--padding-card: 32px;\n\t--padding-form-input: 14px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 20px;\n\n\t/* --- EFFECTS & ANIMATIONS --- */\n\t--box-shadow-card: 0 16px 50px rgba(0, 0, 0, 0.3); /* Deeper shadow for dark mode */\n\t--transition-speed: 0.25s;\n\t--animation-speed-fast: 0.2s;\n\t--animation-speed-normal: 0.4s;\n}\n\n/* === KEYFRAME ANIMATIONS === */\n@keyframes fadeInSlideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes backgroundPan {\n\t0% { background-position: 0% 50%; }\n\t50% { background-position: 100% 50%; }\n\t100% { background-position: 0% 50%; }\n}\n\n/* === GLOBAL LAYOUT & STYLES === */\nbody {\n /* Dynamic animated aurora gradient background */\n background-color: var(--color-page-bg);\n background-image:\n radial-gradient(at 20% 100%, hsla(278, 60%, 45%, 0.2) 0px, transparent 50%),\n radial-gradient(at 80% 0%, hsla(215, 60%, 40%, 0.2) 0px, transparent 50%),\n radial-gradient(at 50% 50%, hsla(259, 70%, 55%, 0.1) 0px, transparent 50%);\n background-size: 200% 200%;\n animation: backgroundPan 15s ease-in-out infinite;\n\n line-height: var(--line-height-base);\n font-size: var(--font-size-body);\n color: var(--color-label); /* Set default text color for body */\n\n /* Flexbox properties for true centering */\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n overflow-x: hidden; /* Prevent horizontal scroll from large gradients */\n}\n\n.form-container {\n padding: 2rem 1rem;\n}\n\n/* === THE GLASSMORPHISM CARD === */\n.card {\n background: var(--color-card-bg-glass);\n backdrop-filter: blur(16px) saturate(150%);\n -webkit-backdrop-filter: blur(16px) saturate(150%);\n border-radius: var(--border-radius-card);\n border: 1px solid var(--color-card-border-glass);\n box-shadow: var(--box-shadow-card);\n transition: box-shadow var(--animation-speed-normal) ease;\n\n /* Card Load-in Animation */\n animation: fadeInSlideUp 0.6s ease-out forwards;\n}\n.card:hover {\n box-shadow: 0 0 50px rgba(139, 92, 246, 0.15); /* Subtle purple glow on hover */\n}\n\n/* === FORM ELEMENT STYLING === */\n.form-input {\n border-radius: var(--border-radius-input);\n transition: border-color var(--transition-speed) ease, box-shadow var(--transition-speed) ease;\n background-color: var(--color-input-bg);\n border: 1px solid var(--color-input-border);\n color: var(--color-input-text);\n}\n.form-input::placeholder {\n color: var(--color-label);\n opacity: 0.7;\n}\n.form-input:focus {\n /* Glow effect on focus */\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.25);\n border-color: var(--color-focus-border);\n outline: none; /* Remove default outline */\n}\n\ntextarea.form-input {\n min-height: 150px;\n resize: vertical;\n}\n\n/* Submit Button */\nbutton.submit-btn {\n transition: all var(--transition-speed) ease-in-out;\n font-family: var(--font-family);\n font-weight: var(--font-weight-bold);\n color: var(--color-submit-btn-text);\n background-color: var(--color-submit-btn-bg);\n border-radius: var(--border-radius-input);\n border: none;\n cursor: pointer;\n}\nbutton.submit-btn:hover {\n background-color: var(--color-submit-btn-hover-bg);\n /* Add a lift and glow effect on hover */\n transform: translateY(-3px);\n box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);\n}\n\n/* === MODERN CHECKBOX STYLING === */\nlabel.multiselect-label {\n display: flex;\n align-items: center;\n cursor: pointer;\n position: relative;\n padding: 8px 0;\n}\nlabel.multiselect-label span {\n padding-left: 12px;\n color: var(--color-label);\n transition: color var(--transition-speed) ease;\n}\nlabel.multiselect-label:hover span {\n color: var(--color-input-text); /* Lighten label text on hover */\n}\nlabel.multiselect-label input[type=\"checkbox\"] {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n height: 0;\n width: 0;\n}\nlabel.multiselect-label span::before {\n content: '';\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n width: var(--checkbox-size);\n height: var(--checkbox-size);\n background-color: var(--color-input-bg);\n border: 1px solid var(--color-input-border);\n border-radius: 6px;\n transition: all var(--animation-speed-fast) ease-in-out;\n}\nlabel.multiselect-label input[type=\"checkbox\"]:checked + span::before {\n background-color: var(--color-focus-border);\n border-color: var(--color-focus-border);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n background-position: center;\n background-repeat: no-repeat;\n /* Animation for the checkmark appearing */\n transform: translateY(-50%) scale(1.05);\n}\nlabel.multiselect-label input[type=\"checkbox\"]:focus-visible + span::before {\n /* Use a glow for focus instead of a harsh outline */\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.3);\n}",
"buttonLabel": "Submit Application",
"appendAttribution": false
},
"formTitle": "Submit Your Application",
"formFields": {
"values": [
{
"fieldLabel": "Full Name",
"placeholder": "e.g., Jane Doe",
"requiredField": true
},
{
"fieldLabel": "Email",
"placeholder": "e.g., jane.doe@example.com",
"requiredField": true
},
{
"fieldType": "file",
"fieldLabel": "Upload CV",
"requiredField": true,
"acceptFileTypes": ".pdf"
}
]
},
"responseMode": "lastNode",
"formDescription": "Please fill out the form below and upload your CV to apply."
},
"typeVersion": 2.2
},
{
"id": "8af8707e-de1b-4687-8d7a-c853dfec2b31",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "여기서 시작",
"type": "n8n-nodes-base.manualTrigger",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-1648,
704
],
"parameters": {},
"typeVersion": 1
},
{
"id": "3b04b67b-d4dc-44e6-90e1-d239dbbc40d1",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "이력서 텍스트 추출",
"type": "n8n-nodes-base.mistralAi",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-640,
704
],
"parameters": {
"options": {},
"binaryProperty": "={{ $('Application Form').last().binary.keys()[0] }}"
},
"credentials": {
"mistralCloudApi": {
"id": "CVHf7SBQRl2FcHwb",
"name": "Mistral Template Key"
}
},
"typeVersion": 1
},
{
"id": "483377db-ede2-4dcb-8ce0-a77b9f9d1b09",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "후보자 제출 기록",
"type": "n8n-nodes-base.googleSheets",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-624,
368
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $json.Email }}",
"FullName": "={{ $json[\"Full Name\"] }}"
},
"schema": [
{
"id": "FullName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "FullName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "QualificationRate",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "QualificationRate",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "QualificationDescription",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "QualificationDescription",
"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/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit#gid=0",
"cachedResultName": "Feuille 1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit?usp=drivesdk",
"cachedResultName": "CVs"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "csiCs0Ukgbs3jYYk",
"name": "Calvin"
}
},
"typeVersion": 4.6
},
{
"id": "d4aa8091-6577-44b5-9541-c0cc87f83e93",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "이력서 분석 추가",
"type": "n8n-nodes-base.googleSheets",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-64,
704
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Application Form').last().json.Email }}",
"QualificationRate": "={{ $json.output.qualificationRate }}",
"QualificationDescription": "={{ $json.output.explanation }}"
},
"schema": [
{
"id": "FullName",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "FullName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "QualificationRate",
"type": "string",
"display": true,
"required": false,
"displayName": "QualificationRate",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "QualificationDescription",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "QualificationDescription",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit#gid=0",
"cachedResultName": "Feuille 1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit?usp=drivesdk",
"cachedResultName": "CVs"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "csiCs0Ukgbs3jYYk",
"name": "Calvin"
}
},
"typeVersion": 4.6
},
{
"id": "05672977-b212-4dc6-9315-9d2c191c43a6",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "JSON 출력 파서",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-176,
960
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"qualificationRate\": {\n \"type\": \"number\",\n \"description\": \"The qualification rate, typically a number between 0 and 1 or a percentage.\"\n },\n \"explanation\": {\n \"type\": \"string\",\n \"description\": \"A textual explanation or description of the qualification rate.\"\n }\n },\n \"required\": [\n \"qualificationRate\",\n \"explanation\"\n ],\n \"additionalProperties\": false\n}"
},
"typeVersion": 1.3
},
{
"id": "e94d6fac-a882-4573-a52d-11a90b15302f",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "Gemini 2.5 Flash Lite",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-512,
944
],
"parameters": {
"options": {
"temperature": 0.4
},
"modelName": "models/gemini-2.5-flash-lite"
},
"credentials": {
"googlePalmApi": {
"id": "Tfw18hAjsu3IwEqi",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "7f185e06-146b-4949-a2b9-c840f1fbf556",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "'이력서' 스프레드시트 생성",
"type": "n8n-nodes-base.googleSheets",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-1328,
704
],
"parameters": {
"title": "CVs",
"options": {},
"resource": "spreadsheet",
"sheetsUi": {
"sheetValues": [
{
"title": "FullName"
},
{
"title": "Email"
},
{
"title": "QualificationRate"
},
{
"title": "QualificationDescription"
}
]
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "csiCs0Ukgbs3jYYk",
"name": "Calvin"
}
},
"typeVersion": 4.6
},
{
"id": "21587944-8fd4-4583-8697-a7bf04441850",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모12",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-1024,
608
],
"parameters": {
"color": 7,
"width": 300,
"height": 268,
"content": "💡 Later, activate this workflow and share the public form URL to let candidates share their CV!"
},
"typeVersion": 1
},
{
"id": "f7e475cb-a354-4e10-9bc1-662cc81d13df",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "메모",
"type": "n8n-nodes-base.stickyNote",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-624,
912
],
"parameters": {
"color": 7,
"width": 294,
"height": 316,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n1. [In Google AI Studio](https://aistudio.google.com/app/apikey) click **“Create API key in new project”** and copy it.\n\n2. Open the ```Connect Gemini``` node:\n * **Select Credential → Create New**\n * Paste into **API Key** and **Save**\n"
},
"typeVersion": 1
},
{
"id": "d75d53de-6040-4620-b102-0621829c0666",
"cid": "Ikx1Y2FzIFBleXJpbiI",
"name": "AI 자격 평가",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"notes": "© 2025 Lucas Peyrin",
"creator": "Lucas Peyrin",
"position": [
-416,
704
],
"parameters": {
"text": "=<goal>\nYour primary goal is to evaluate a candidate's CV against the provided job requirements for the Senior Frontend Developer position. You must determine if the prospect is qualified and produce a raw JSON output containing a qualification score and a detailed, evidence-based explanation for that score.\n</goal>\n\n<context>\n<job_requirements>\n\n# Position Profile: Senior Frontend Developer\n\nJob Title: Senior Frontend Developer\nLocation: Remote (US-based)\n\nAbout the Role:\nWe are looking for an experienced and passionate Senior Frontend Developer to join our core product team. You will be responsible for building and maintaining the user-facing components of our flagship SaaS platform, ensuring a seamless, responsive, and high-performance user experience. You will collaborate closely with UI/UX designers, product managers, and backend engineers to bring new features to life and mentor other developers on the team.\n\nKey Responsibilities:\n- Develop, test, and deploy high-quality, scalable, and user-friendly web applications using React and TypeScript.\n- Collaborate with cross-functional teams to define, design, and ship new features.\n- Mentor junior and mid-level developers through code reviews, pair programming, and technical guidance.\n- Optimize applications for maximum speed, scalability, and accessibility.\n- Ensure the technical feasibility of UI/UX designs and maintain a high standard of code quality.\n- Stay up-to-date with emerging technologies and advocate for their adoption where it makes sense.\n\n# EVALUATION CRITERIA\n\n## Core Requirements (Must-Haves)\n\n- Experience: 5+ years of professional experience in frontend development.\n- Project Leadership: Proven experience leading frontend projects from conception to completion.\n- JavaScript/TypeScript: Expert-level proficiency in modern JavaScript (ES6+) and TypeScript.\n- Framework Expertise: Deep, hands-on experience with React.\n- State Management: Strong experience with state management libraries such as Redux, Zustand, or React Query.\n- Styling: Proficiency in modern CSS, including CSS-in-JS (e.g., Styled Components) or utility-first CSS (e.g., Tailwind CSS).\n- API Integration: Extensive experience consuming RESTful or GraphQL APIs.\n- Testing: Solid experience with frontend testing frameworks like Jest and React Testing Library.\n- Version Control: Mastery of Git and collaborative workflows (e.g., GitFlow).\n- Communication: Excellent written and verbal communication skills (assessed through the clarity and professionalism of the CV).\n\n## Preferred Qualifications (Nice-to-Haves)\n\n- Meta-Frameworks: Experience with Next.js or a similar framework.\n- Backend Knowledge: Familiarity with Node.js and server-side development.\n- CI/CD: Experience setting up and maintaining CI/CD pipelines (e.g., GitHub Actions, Vercel).\n- Design Acumen: A strong eye for UI/UX design.\n- Performance Tuning: Experience with web performance optimization tools like Lighthouse.\n\n</job_requirements>\n\n<qualifiaction>\n# How I Evaluate\nI operate based on a strict set of evaluation criteria provided for a specific role. My analysis is broken down into two main categories: \"Core Requirements\" (which are non-negotiable) and \"Preferred Qualifications\" (which act as bonuses). My final output is a qualification score and a detailed justification, citing specific evidence from the candidate's CV.\n\n# Evaluation Logic\n- The `qualificationRate` is a score from 0.0 to 1.0.\n- **Core Requirements** are critical. A candidate missing one or more core requirements cannot score above 0.6. A candidate meeting all core requirements should score at least 0.75.\n- **Preferred Qualifications** are bonuses. Each met preferred qualification adds to the score, pushing it closer to 1.0.\n- The `explanation` must be a detailed, point-by-point analysis, justifying the score by citing evidence (or lack thereof) from the CV for each requirement.\n</qualifiaction>\n</context>\n\n<output_format>\nYou must produce a single, raw JSON object. Do not add any conversational text, greetings, or explanations outside of the JSON structure. The JSON object must strictly adhere to the following format:\n```json\n{\n \"explanation\": \"<string>\",\n \"qualificationRate\": <number>\n}\n```\n</output_format>\n</instructions>",
"batching": {},
"messages": {
"messageValues": [
{
"message": "You are the AI Hiring Assistant, a specialized AI agent designed to meticulously analyze and evaluate candidate CVs against specific job requirements. Your personality is professional, objective, and detail-oriented. You provide clear, evidence-based assessments to support hiring decisions."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
}
],
"pinData": {},
"connections": {
"8af8707e-de1b-4687-8d7a-c853dfec2b31": {
"main": [
[
{
"node": "7f185e06-146b-4949-a2b9-c840f1fbf556",
"type": "main",
"index": 0
}
]
]
},
"3b04b67b-d4dc-44e6-90e1-d239dbbc40d1": {
"main": [
[
{
"node": "d75d53de-6040-4620-b102-0621829c0666",
"type": "main",
"index": 0
}
]
]
},
"d75d53de-6040-4620-b102-0621829c0666": {
"main": [
[
{
"node": "d4aa8091-6577-44b5-9541-c0cc87f83e93",
"type": "main",
"index": 0
}
]
]
},
"cb5ef831-79f7-4129-9642-6ece79a3603e": {
"main": [
[
{
"node": "3b04b67b-d4dc-44e6-90e1-d239dbbc40d1",
"type": "main",
"index": 0
},
{
"node": "483377db-ede2-4dcb-8ce0-a77b9f9d1b09",
"type": "main",
"index": 0
}
]
]
},
"05672977-b212-4dc6-9315-9d2c191c43a6": {
"ai_outputParser": [
[
{
"node": "d75d53de-6040-4620-b102-0621829c0666",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"e94d6fac-a882-4573-a52d-11a90b15302f": {
"ai_languageModel": [
[
{
"node": "d75d53de-6040-4620-b102-0621829c0666",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 인사, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Lucas Peyrin
@lucaspeyrinInnovative builder with a passion for crafting automation solutions that solve real-world challenges. From streamlining workflows to driving efficiency, my work empowers teams and individuals to achieve more with less effort. Experienced in developing scalable tools and strategies that deliver results with n8n, supabase and cline.
이 워크플로우 공유