πŸ“„
Your Resume
Paste the text content of your resume
πŸ’Ό
Job Description
Paste the full job posting you're applying for
⚑ Powered by AI · Results in ~10 seconds · 100% free
0
ATS
Analyzing...
Please wait while we analyze your resume.
βœ… Keywords Found
❌ Keywords Missing
πŸ’‘ AI Suggestions to Improve Your Score

How to Maximize Your ATS Score

πŸ”‘
Use Exact Keywords
Copy exact keywords and phrases from the job description into your resume. ATS systems match exact strings, not synonyms.
πŸ“
Simple Formatting
Avoid tables, columns, graphics, and headers/footers. ATS bots read left-to-right, top-to-bottom β€” simple formatting wins.
πŸ“Š
Quantify Your Impact
Replace vague statements with numbers: "Improved performance" β†’ "Improved performance by 40%, reducing load time from 3s to 1.8s".
πŸ’ͺ
Strong Action Verbs
Start each bullet with a strong action verb: Led, Built, Designed, Implemented, Increased, Reduced, Managed, Launched.
πŸ“
Right Length
Fresher: 1 page. 1–5 years experience: 1–1.5 pages. 5+ years: 2 pages max. Quality over quantity every time.
🎯
Tailor for Each Job
Don't send the same resume everywhere. Customize your summary and skills for each specific job description you apply to.
const TOOL = 'ats'; async function analyzeATS() { const resume = document.getElementById('resume-text').value.trim(); const jd = document.getElementById('jd-text').value.trim(); if (!resume || !jd) { alert('Please paste both your resume and the job description.'); return; } const { allowed } = checkLimit(TOOL); if (!allowed) { alert(`You've used all ${AI_LIMITS[TOOL]} free ATS checks for today. Daily limit resets at IST midnight.`); return; } const btn = document.getElementById('analyze-btn'); const btnText = document.getElementById('analyze-btn-text'); const spinner = document.getElementById('analyze-spinner'); btnText.textContent = 'Analyzing...'; spinner.style.display = 'inline-block'; btn.disabled = true; try { const systemPrompt = `You are an expert ATS (Applicant Tracking System) analyzer. Analyze the resume against the job description and return a JSON object ONLY (no markdown, no explanation). Return this exact JSON structure: { "overall_score": , "score_title": "", "score_subtitle": "<1-2 sentence explanation of the overall result>", "metrics": { "keywords_match": <0-100>, "format_score": <0-100>, "action_verbs": <0-100>, "quantification": <0-100> }, "keywords_found": ["keyword1", "keyword2", ...], "keywords_missing": ["keyword1", "keyword2", ...], "suggestions": [ {"icon": "πŸ”‘", "title": "...", "desc": "..."}, {"icon": "πŸ“Š", "title": "...", "desc": "..."}, {"icon": "πŸ’ͺ", "title": "...", "desc": "..."}, {"icon": "✍️", "title": "...", "desc": "..."} ] }`; const userPrompt = `Resume:\n${resume}\n\nJob Description:\n${jd}`; const raw = await callAI(userPrompt, systemPrompt, 1000); const result = JSON.parse(raw.replace(/```json|```/g, '').trim()); displayResults(result); consumeLimit(TOOL); } catch (err) { console.error(err); if (err.message === 'NO_WORKER_URL') { alert('Cloudflare Worker not yet configured. Set CF_WORKER_URL in the script to enable AI analysis.'); } else if (err.message === 'RATE_LIMIT_SERVER') { alert('Server-side daily limit reached. Please try again tomorrow.'); } else { alert('Analysis failed. Please try again in a moment.'); } } finally { btnText.textContent = '🎯 Analyze Again'; spinner.style.display = 'none'; btn.disabled = false; } } function displayResults(r) { document.getElementById('results-section').style.display = 'block'; document.getElementById('results-section').scrollIntoView({ behavior: 'smooth', block: 'start' }); // Score circle animation const score = r.overall_score; const arc = document.getElementById('score-arc'); const circumference = 276.46; const offset = circumference - (score / 100) * circumference; let color = '#22c55e'; if (score < 50) color = '#ef4444'; else if (score < 75) color = '#f59e0b'; arc.style.stroke = color; arc.style.strokeDashoffset = offset; // Animate number let n = 0; const numEl = document.getElementById('score-display'); numEl.style.color = color; const interval = setInterval(() => { n = Math.min(n + 2, score); numEl.textContent = n; if (n >= score) clearInterval(interval); }, 20); document.getElementById('score-title').textContent = r.score_title || 'Analysis Complete'; document.getElementById('score-subtitle').textContent = r.score_subtitle || ''; // Quick stats const metrics = r.metrics || {}; const qs = document.getElementById('quick-stats'); qs.innerHTML = Object.entries(metrics).map(([k, v]) => { const label = k.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()); let cls = v >= 75 ? 'good' : v >= 50 ? 'warn' : 'bad'; return `
${label}
${v}%
`; }).join(''); // Keywords const found = r.keywords_found || []; const missing = r.keywords_missing || []; document.getElementById('keywords-found').innerHTML = found.map(k => `βœ“ ${k}` ).join('') || 'None identified'; document.getElementById('keywords-missing').innerHTML = missing.map(k => `βœ— ${k}` ).join('') || 'βœ“ All keywords found!'; // Suggestions const sug = r.suggestions || []; document.getElementById('suggestions-list').innerHTML = sug.map(s => `
${s.icon}
${s.title}
${s.desc}
` ).join(''); } function resetAnalysis() { document.getElementById('results-section').style.display = 'none'; document.getElementById('resume-text').value = ''; document.getElementById('jd-text').value = ''; window.scrollTo({ top: 0, behavior: 'smooth' }); }