🧩 AI Tool

Skills Gap Analyzer

Compare your current skills against a job description to instantly see what you have, what's missing, and exactly what to learn to land the role.

📊 Your Profile vs Job
📊 Gap Analysis
✦ Sample output preview — add your skills and a job description to analyze
72% Match
Good Match — A Few Gaps
You meet most requirements. Close the gaps to be a strong candidate.
✅ Skills You Have (5)
Python
Core requirement — you're well covered here
REST API Design
Directly matches job requirement
PostgreSQL
Listed as required — strong match
❌ Missing Skills (3)
Kubernetes
🔴 High
Mentioned 4x in JD — high priority gap
System Design
🟡 Medium
Required for senior-level role
🚀 Action Plan
1
Complete a Kubernetes fundamentals course — CKA certification is a strong differentiator
2
Practice System Design with Grokking the System Design Interview — target 2 designs/week
const TOOL = 'skills'; renderLimitBadge(TOOL, 'rl-badge'); let activeTab = 'skills'; function switchTab(tab) { activeTab = tab; document.querySelectorAll('.input-tab').forEach((t,i) => t.classList.toggle('active', ['skills','resume'][i] === tab)); document.querySelectorAll('.tab-pane').forEach(p => p.classList.remove('active')); document.getElementById('tab-' + tab).classList.add('active'); } let lastReport = ''; async function analyzeGap() { const jd = document.getElementById('sg-jd').value.trim(); const myContent = activeTab === 'skills' ? document.getElementById('sg-skills').value.trim() : document.getElementById('sg-resume').value.trim(); if (!jd || !myContent) { if (!myContent) document.getElementById(activeTab === 'skills' ? 'sg-skills' : 'sg-resume').style.borderColor = 'var(--danger)'; if (!jd) document.getElementById('sg-jd').style.borderColor = 'var(--danger)'; return; } ['sg-skills','sg-resume','sg-jd'].forEach(id => { const el = document.getElementById(id); if (el) el.style.borderColor = ''; }); const { allowed } = checkLimit(TOOL); if (!allowed) { document.getElementById('sg-output').innerHTML = `
⛔ Daily limit reached — ${AI_LIMITS[TOOL]} analyses per day. Resets at IST midnight.
`; return; } const btn = document.getElementById('sg-btn'); btn.disabled = true; document.getElementById('sg-btn-text').textContent = 'Analyzing...'; document.getElementById('sg-spinner').style.display = 'inline-block'; const system = `You are an expert career coach and technical recruiter who analyzes skills gaps. Be honest but constructive. Focus on actionable insights. Respond ONLY in this JSON format (no markdown): { "match_pct": 72, "verdict": "Good Match", "summary": "One sentence summary", "have": [{"skill":"...","note":"why this helps"}], "missing": [{"skill":"...","priority":"high|medium|low","note":"why it matters"}], "partial": [{"skill":"...","note":"what's there and what's missing"}], "action_plan": ["Step 1...", "Step 2...", "Step 3..."] }`; const prompt = `Analyze the skills gap. Candidate's ${activeTab === 'skills' ? 'skills' : 'resume'}: ${myContent.slice(0, 2000)} Target Job Description: ${jd.slice(0, 2000)}`; try { const raw = await callAI(prompt, system, 1500); const data = JSON.parse(raw.replace(/```json|```/g,'').trim()); const pct = data.match_pct || 0; const gaugeCol = pct >= 70 ? '#4ade80' : pct >= 45 ? '#f59e0b' : '#f87171'; const border = `3px solid ${gaugeCol}`; let html = `
${pct}% Match
${escHtml(data.verdict)}
${escHtml(data.summary)}
`; // Have if (data.have?.length) { html += `
✅ Skills You Have (${data.have.length})
${data.have.map(s => `
${escHtml(s.skill)}
${escHtml(s.note||'')}
`).join('')}
`; } // Partial if (data.partial?.length) { html += `
⚡ Partial Match — Needs Strengthening (${data.partial.length})
${data.partial.map(s => `
${escHtml(s.skill)}
${escHtml(s.note||'')}
`).join('')}
`; } // Missing if (data.missing?.length) { const sorted = [...data.missing].sort((a,b) => ({high:0,medium:1,low:2}[a.priority]||1) - ({high:0,medium:1,low:2}[b.priority]||1)); html += `
❌ Missing Skills (${data.missing.length})
${sorted.map(s => { const pBadge = s.priority === 'high' ? '🔴 High' : s.priority === 'medium' ? '🟡 Medium' : '⚪ Low'; return `
${escHtml(s.skill)} ${pBadge}
${escHtml(s.note||'')}
`; }).join('')}
`; } // Action plan if (data.action_plan?.length) { html += `
🚀 Your Action Plan
${data.action_plan.map((step, i) => `
${i+1}
${escHtml(step)}
`).join('')}
`; } document.getElementById('sg-output').innerHTML = html; document.getElementById('sg-ghost').style.display = 'none'; lastReport = `SKILLS GAP ANALYSIS\n\nMatch Score: ${pct}% — ${data.verdict}\n${data.summary}\n\n` + `SKILLS YOU HAVE:\n${(data.have||[]).map(s=>`✅ ${s.skill}`).join('\n')}\n\n` + `MISSING SKILLS:\n${(data.missing||[]).map(s=>`❌ ${s.skill} (${s.priority} priority)`).join('\n')}\n\n` + `ACTION PLAN:\n${(data.action_plan||[]).map((s,i)=>`${i+1}. ${s}`).join('\n')}`; consumeLimit(TOOL); renderLimitBadge(TOOL, 'rl-badge'); } catch(err) { renderAIError(err, 'sg-output', 'worker-notice'); } finally { btn.disabled = false; document.getElementById('sg-btn-text').textContent = '🧩 Analyze Skills Gap'; document.getElementById('sg-spinner').style.display = 'none'; } } function copyReport() { if (!lastReport) return; navigator.clipboard.writeText(lastReport).then(() => { const btn = document.querySelector('.ai-copy-btn'); btn.textContent = '✅ Copied!'; setTimeout(() => btn.textContent = '📋 Copy Report', 2000); }); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>'); }