✦ Free · No Sign-Up · Upload PDF or Word

Build a Professional Resume
in Minutes

Upload your existing CV to auto-fill all fields instantly, or start fresh. 6 templates · Photo upload · ATS scanner · Free download.

📄 Upload PDF/Word
🎨 6 Templates
📷 Photo Upload
ATS Scanner
🔒 100% Private
[ Google AdSense 728x90 ]
📄

Upload Your Existing CV — Auto-Fill Everything Instantly

Supports PDF and Word (.docx) files. We extract your name, contact, all experiences, education, training, certifications, skills and more.

⚡ Try a demo:
Resume Strength0%
1Template
2Details
3Experience
4Education
5Training
6Skills
7Finish
🎨

Choose Your Template

MODERN
Modern
Clean & vibrant
CLASSIC
Classic
Traditional elegance
MINIMAL
Minimal
Less is more
BOLD
Bold
Dark & powerful
EXECUTIVE
Executive
Senior professionals
CREATIVE
Creative
Stand out
👤

Personal Details & Photo

📷 Photo upload is here ↓
👤
CLICK TO ADD
📷
📷 Profile Photo
Click the box on the left or use the button below.
Appears on your CV preview. Optional but recommended.
💼

Work Experience

0 entries
🎓

Education

0 entries
🏆

Training & Certifications

0 entries

Skills & Languages

🎉

You're Ready!

🎉
Your resume is ready!
Review the live preview on the right. Switch templates anytime by going back to Step 1.
[ Google AdSense 728x90 ]

📄 Live Preview — Modern

[ Google AdSense 300x250 ]

🤖 ATS Resume Scanner

Paste your resume and job description. We score keyword match, detect missing skills, and show Quick-Win fixes.

Frequently Asked Questions

Can I upload my existing CV?
Yes — upload a PDF or Word (.docx) file and we auto-extract your name, contact details, all work experience, education, training, certifications, and skills. All processing happens in your browser — nothing is sent to any server.
Is this CV builder really free?
100% free. Build, edit, and print at no cost. The $4 PDF download is optional styling upgrade.
Is my data private and safe?
Completely. Your CV data — including any uploaded file — never leaves your browser. We use zero server-side processing.
How many experiences can I add?
Unlimited. Add as many work experiences, education entries, training courses and certifications as you need.
Can I switch templates after filling in my details?
Yes — go back to Step 1 at any time to switch between all 6 templates. Your data is preserved.

📎 Embed This Tool on Your Website

Visitors see only the CV builder — no ads, no navigation. Includes "Powered by LiberateTools" branding.

<iframe src="https://liberatetools.com/tools/cv-builder.html?embed=1" width="100%" height="700" frameborder="0" style="border-radius:12px;border:none"></iframe>
💡

Help Us Improve This Tool

Got an idea for a new feature or spotted something that could be better? Tell us — we read every suggestion.

Rate this tool
Powered by LiberateTools.com
'+cvHtml+''); win.document.close(); setTimeout(function(){win.focus();win.print();},700); } // ═══ ATS SCANNER ═══ function runATS(){ var cv=q('ats-cv').value,jd=q('ats-jd').value; if(!cv.trim()||!jd.trim()){toast('Please paste both resume and job description.');return;} var res=q('ats-results');res.style.display='block';res.innerHTML='
⌛ Scanning...
'; setTimeout(function(){ var cvl=cv.toLowerCase(),jdl=jd.toLowerCase(); var PHRASES=['project management','digital marketing','seo','sem','ppc','google analytics','google ads','hubspot','salesforce','content strategy','content marketing','social media','email marketing','marketing automation','budget management','team leadership','data analysis','data analytics','agile methodology','scrum','product management','customer service','account management','business development','strategic planning','stakeholder management','javascript','typescript','python','react','node js','aws','azure','machine learning','ux design','figma','financial modelling','bloomberg','portfolio management','risk management','microsoft excel','crm systems','erp systems','brand management','performance marketing','a/b testing','sql','tableau','power bi','communication skills','problem solving','critical thinking']; var found=[],miss=[]; PHRASES.forEach(function(ph){if(jdl.indexOf(ph)>=0){if(cvl.indexOf(ph)>=0)found.push(ph);else miss.push(ph);}}); var jdWords=jdl.replace(/[^a-z0-9\s]/g,' ').split(/\s+/); for(var i=0;i5&&PHRASES.indexOf(bg)<0&&found.indexOf(bg)<0&&miss.indexOf(bg)<0){if(cvl.indexOf(bg)>=0)found.push(bg);else miss.push(bg);}} found=found.filter(function(k,i,a){return a.indexOf(k)===i;}).slice(0,25); miss=miss.filter(function(k,i,a){return a.indexOf(k)===i;}).slice(0,20); var total=found.length+miss.length,score=total?Math.round(found.length/total*100):0; var verdict=score>=75?'🏔 Strong Match':score>=50?'🏅 Moderate Match':'🔴 Needs Work'; var sub=score>=75?'Great alignment with this role.':score>=50?'Add more matching keywords.':'Significant gaps — tailor your resume.'; var secs=['experience','education','skills','summary','contact'];var secL=['Experience','Education','Skills','Summary','Contact']; var fsecs=[],msecs=[];secs.forEach(function(s,i){if(cvl.indexOf(s)>=0)fsecs.push(secL[i]);else msecs.push(secL[i]);}); var tips=[]; if(miss.length>0)tips.push('Add these to your Skills section: '+miss.slice(0,4).join(', ')+'.'); if(cv.length<400)tips.push('Expand your experience descriptions with numbers and achievements.'); if(fsecs.indexOf('Summary')<0)tips.push('Add a Professional Summary section at the top.'); if(score>=75)tips.push('Strong match! Quantify achievements with revenue, %, or team size figures.'); var circ=188.5,offset=circ-(score/100)*circ; res.innerHTML='
'+ '
0%
'+ '
'+verdict+'
'+sub+'
'+ '
Keyword Match Rate'+score+'%
'+ '
📋 Sections Detected
'+fsecs.map(function(s){return'✓ '+s+'';}).join('')+msecs.map(function(s){return'✕ '+s+'';}).join('')+'
'+ '
✅ Matched Keywords ('+found.length+')
'+found.map(function(k){return''+k+'';}).join('')+'
'+ '
❌ Missing Keywords ('+miss.length+')
'+miss.map(function(k){return''+k+'';}).join('')+'
'+ (miss.length?'
💡 Quick Wins — Click to Add to Your Skills
'+miss.slice(0,8).map(function(k){return'';}).join('')+'
':'') + '
💡 Tips
'+tips.map(function(t){return'
'+t+'
';}).join('')+'
'; setTimeout(function(){ var ring=q('ats-ring');if(ring)ring.style.strokeDashoffset=circ-(score/100)*circ; var num=q('ats-num');if(!num)return; var cur=0,iv=setInterval(function(){cur=Math.min(cur+2,score);num.textContent=cur+'%';if(cur>=score)clearInterval(iv);},20); },60); },400); } // ═══ CV UPLOAD & PARSE ═══ function parseAndPopulate(text){ if(!text||text.trim().length<20){toast('Could not extract enough text from this file.');return;} var lines=text.split('\n').map(function(l){return l.trim();}).filter(function(l){return l.length>0;}); var lower=text.toLowerCase(); function clearAll(){ q('exp-list').innerHTML='';q('edu-list').innerHTML='';q('cert-list').innerHTML=''; expItems=[];eduItems=[];certItems=[];skills=[];langs=[]; ['f-name','f-title','f-email','f-phone','f-location','f-web','f-summary','f-nationality','f-dob'].forEach(function(id){var e=q(id);if(e)e.value='';}); } clearAll(); // ── Extract email ── var emailM=text.match(/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/); if(emailM){var e=q('f-email');if(e)e.value=emailM[0];} // ── Extract phone ── var phoneM=text.match(/(?:\+?[\d\s\-().]{7,20})/); if(phoneM){var ph=q('f-phone');if(ph)ph.value=phoneM[0].trim();} // ── Extract LinkedIn ── var liM=text.match(/linkedin\.com\/in\/[\w\-]+/i); if(liM){var lw=q('f-web');if(lw)lw.value=liM[0];} // ── Extract name (first line that looks like a name) ── for(var i=0;i3&&l.length<60&&!/[@\d]/.test(l)&&l===l.replace(/[^a-zA-Z\s\-'\.]/g,'')){ var nf=q('f-name');if(nf)nf.value=l;break; } } // ── Extract job title (line after name, before summary) ── for(var i=1;i3&&l.length<80&&titleKws.some(function(kw){return l.toLowerCase().indexOf(kw)>=0;})){ var tf=q('f-title');if(tf)tf.value=l;break; } } // ── Extract summary ── var summaryKws=['summary','objective','profile','about me','professional background','career objective']; var summaryIdx=-1; for(var i=0;i=0;})){summaryIdx=i;break;} } if(summaryIdx>=0){ var summaryLines=[]; for(var i=summaryIdx+1;i20&&!/^(experience|education|skills|certification|work|employment)/i.test(lines[i]))summaryLines.push(lines[i]); else if(summaryLines.length>0)break; } if(summaryLines.length){var sf=q('f-summary');if(sf)sf.value=summaryLines.join(' ');} } // ── SECTION DETECTION ── var expKws=['experience','employment','work history','career history','professional experience','positions']; var eduKws=['education','academic','qualifications','academic background','university','degree']; var certKws=['certification','training','courses','professional development','licens','accreditation','credential']; var skillKws=['skills','competencies','expertise','technical skills','core skills','key skills']; var langKws=['languages','language skills']; function findSectionStart(kws){ for(var i=0;i=0&&lines[i].length<60;}))return i; return -1; } function extractSection(startIdx,endKws){ if(startIdx<0)return[]; var sec=[]; for(var i=startIdx+1;i=0&&l.length<60;}); if(isHeader)break; sec.push(l); } return sec; } var allSectionStarts=[expKws,eduKws,certKws,skillKws,langKws].map(findSectionStart); var nextSectionKws=expKws.concat(eduKws,certKws,skillKws,langKws,['references','hobbies','interests','volunteer','awards','publications']); // ── Parse Experience ── var expStart=findSectionStart(expKws); if(expStart>=0){ var expLines=extractSection(expStart,nextSectionKws.filter(function(k){return expKws.indexOf(k)<0;})); var dateRx=/\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|june|july|august|september|october|november|december)?\s*\d{4}\b/i; var currentExp=null; var descBuf=[]; function flushExp(){if(currentExp&&(currentExp.title||currentExp.company)){if(descBuf.length)currentExp.desc=descBuf.join(' ');addExp(currentExp);}currentExp=null;descBuf=[];} expLines.forEach(function(l){ var hasDate=dateRx.test(l); var looksLikeRole=/\b(manager|engineer|developer|analyst|director|specialist|consultant|lead|head|officer|executive|architect|nurse|doctor|supervisor|coordinator|associate)\b/i.test(l); if((hasDate&&l.length<100)||(looksLikeRole&&l.length<80)){ flushExp(); currentExp={title:l,company:'',start:'',end:'',desc:''}; var dateMatches=l.match(/\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|june|july|august|september|october|november|december)?\s*\d{4}\b/gi)||[]; if(dateMatches.length>=1)currentExp.start=dateMatches[0]; if(dateMatches.length>=2)currentExp.end=dateMatches[1]; if(/present|current|now/i.test(l))currentExp.end='Present'; currentExp.title=l.replace(/\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|june|july|august|september|october|november|december)?\s*\d{4}\s*[\-–—to]*\s*(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|june|july|august|september|october|november|december)?\s*\d{4}|\bpresent\b|\bcurrent\b/gi,'').replace(/\s{2,}/g,' ').trim(); } else if(currentExp&&!currentExp.company&&l.length>2&&l.length<80&&!/^\d/.test(l)){ currentExp.company=l; } else if(currentExp&&l.length>5){ descBuf.push(l); } }); flushExp(); } // ── Parse Education ── var eduStart=findSectionStart(eduKws); if(eduStart>=0){ var eduLines=extractSection(eduStart,nextSectionKws.filter(function(k){return eduKws.indexOf(k)<0;})); var degreeKws=['bsc','ba','msc','ma','mba','phd','bachelor','master','degree','diploma','certificate','hnd','a-level','gcse','engineering','science','arts','commerce','medicine','law','nursing','design']; var currentEdu=null; eduLines.forEach(function(l){ var isDegree=degreeKws.some(function(k){return l.toLowerCase().indexOf(k)>=0;}); var yearM=l.match(/\b(19|20)\d{2}\b/); if(isDegree||yearM){ if(currentEdu&&(currentEdu.degree||currentEdu.school))addEdu(currentEdu); currentEdu={degree:l,school:'',year:yearM?yearM[0]:'',grade:''}; if(yearM)currentEdu.degree=l.replace(yearM[0],'').replace(/\s{2,}/g,' ').trim(); var gradeM=l.match(/\b(first class|second class|upper|lower|distinction|merit|pass|honours?|cum laude|summa|magna|gpa[\s:]+[\d.]+)\b/i); if(gradeM)currentEdu.grade=gradeM[0]; } else if(currentEdu&&!currentEdu.school&&l.length>3&&l.length<100){ currentEdu.school=l; } }); if(currentEdu&&(currentEdu.degree||currentEdu.school))addEdu(currentEdu); } // ── Parse Certifications ── var certStart=findSectionStart(certKws); if(certStart>=0){ var certLines=extractSection(certStart,nextSectionKws.filter(function(k){return certKws.indexOf(k)<0;})); certLines.forEach(function(l){ if(l.length>5&&l.length<150){ var yearM=l.match(/\b(19|20)\d{2}\b/); var parts=l.split(/[|·\-–—]/); addCert({name:parts[0]?parts[0].trim():l,issuer:parts[1]?parts[1].trim():'',year:yearM?yearM[0]:''}); } }); } // ── Parse Skills ── var skillStart=findSectionStart(skillKws); if(skillStart>=0){ var skillLines=extractSection(skillStart,nextSectionKws.filter(function(k){return skillKws.indexOf(k)<0;})); skillLines.forEach(function(l){ var items=l.split(/[,;|•·\t]+/); items.forEach(function(s){s=s.trim();if(s.length>1&&s.length<50&&skills.indexOf(s)<0)skills.push(s);}); }); renderSkills(); } // ── Parse Languages ── var langStart=findSectionStart(langKws); if(langStart>=0){ var langLines=extractSection(langStart,nextSectionKws.filter(function(k){return langKws.indexOf(k)<0;})); langLines.forEach(function(l){ var items=l.split(/[,;|•·\t]+/); items.forEach(function(s){s=s.trim();if(s.length>1&&s.length<60&&langs.indexOf(s)<0)langs.push(s);}); }); renderLangs(); } updatePreview();updateProgress(); var filled=document.querySelectorAll('#exp-list .sec-item').length+document.querySelectorAll('#edu-list .sec-item').length+skills.length; toast('✅ CV parsed! '+filled+' items auto-filled. Review each section and make edits.'); var stat=q('upload-status');if(stat){stat.textContent='✅ Parsed successfully — review and edit each section';stat.className='upload-status done';} goStep(1); } // ═══ DOMContentLoaded ═══ document.addEventListener('DOMContentLoaded',function(){ // Stepper document.querySelectorAll('.step-tab').forEach(function(tab){tab.addEventListener('click',function(){goStep(parseInt(this.getAttribute('data-step')));});}); // Templates document.querySelectorAll('.tpl-card').forEach(function(card){card.addEventListener('click',function(){setTemplate(this.getAttribute('data-tpl'));});}); // Nav buttons var nav={'btn-next-0':function(){goStep(1);},'btn-back-1':function(){goStep(0);},'btn-next-1':function(){goStep(2);},'btn-back-2':function(){goStep(1);},'btn-next-2':function(){goStep(3);},'btn-back-3':function(){goStep(2);},'btn-next-3':function(){goStep(4);},'btn-back-4':function(){goStep(3);},'btn-next-4':function(){goStep(5);},'btn-back-5':function(){goStep(4);},'btn-next-5':function(){goStep(6);},'btn-back-6':function(){goStep(5);},'btn-print':freePrint,'btn-upgrade':function(){q('upgrade-modal').classList.add('open');},'prev-print-btn':freePrint,'prev-upgrade-btn':function(){q('upgrade-modal').classList.add('open');}}; Object.keys(nav).forEach(function(id){var el=q(id);if(el)el.addEventListener('click',nav[id]);}); // Live input update document.querySelectorAll('#sec-1 input,#sec-1 textarea').forEach(function(el){el.addEventListener('input',function(){updatePreview();updateProgress();});}); // Add sections q('add-exp-btn').addEventListener('click',function(){addExp({});}); q('add-edu-btn').addEventListener('click',function(){addEdu({});}); q('add-cert-btn').addEventListener('click',function(){addCert({});}); // Skills/langs q('add-skill-btn').addEventListener('click',addSkill); q('skill-input').addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();addSkill();}}); q('add-lang-btn').addEventListener('click',addLang); q('lang-input').addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();addLang();}}); // Demo strip var strip=q('demo-strip'); if(strip){strip.innerHTML=DEMOS.map(function(p,i){return'';}).join('');strip.querySelectorAll('.demo-btn').forEach(function(b){b.addEventListener('click',function(){loadDemo(parseInt(this.getAttribute('data-idx')));});});} // Photo var photoInput=q('photo-input'); var photoBtn=q('photo-btn'); var photoPreview=q('photo-preview'); if(photoBtn)photoBtn.addEventListener('click',function(){photoInput.click();}); if(photoPreview)photoPreview.addEventListener('click',function(){photoInput.click();}); if(photoInput)photoInput.addEventListener('change',function(){if(this.files[0])handlePhoto(this.files[0]);}); var rmBtn=q('photo-rm-btn'); if(rmBtn)rmBtn.addEventListener('click',function(){photoData='';var img=q('photo-img');var ph=q('photo-placeholder');if(img){img.src='';img.style.display='none';}if(ph)ph.style.display='block';this.style.display='none';updatePreview();toast('Photo removed.');}); // CV Upload var uploadInput=q('cv-upload-input'); if(uploadInput){ uploadInput.addEventListener('change',function(){ var file=this.files[0];if(!file)return; var stat=q('upload-status'); if(stat){stat.textContent='⌛ Parsing your CV...';stat.className='upload-status parsing';} var ext=file.name.split('.').pop().toLowerCase(); if(ext==='pdf'){ var reader=new FileReader(); reader.onload=function(e){ var arr=new Uint8Array(e.target.result); if(typeof pdfjsLib==='undefined'){ if(stat){stat.textContent='❌ PDF library not loaded. Please try a .docx file.';stat.className='upload-status error';} return; } pdfjsLib.GlobalWorkerOptions.workerSrc='https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js'; pdfjsLib.getDocument({data:arr}).promise.then(function(pdf){ var pages=[]; var promises=[]; for(var i=1;i<=pdf.numPages;i++){ promises.push(pdf.getPage(i).then(function(page){return page.getTextContent();})); } Promise.all(promises).then(function(contents){ var fullText=contents.map(function(c){return c.items.map(function(it){return it.str;}).join(' ');}).join('\n'); parseAndPopulate(fullText); }); }).catch(function(err){ if(stat){stat.textContent='❌ Could not parse PDF. Try copy-pasting your CV text instead.';stat.className='upload-status error';} }); }; reader.readAsArrayBuffer(file); } else if(ext==='docx'||ext==='doc'){ var reader=new FileReader(); reader.onload=function(e){ if(typeof mammoth==='undefined'){ if(stat){stat.textContent='❌ DOCX library not loaded.';stat.className='upload-status error';} return; } mammoth.extractRawText({arrayBuffer:e.target.result}).then(function(result){ parseAndPopulate(result.value); }).catch(function(){ if(stat){stat.textContent='❌ Could not parse DOCX file.';stat.className='upload-status error';} }); }; reader.readAsArrayBuffer(file); } else { if(stat){stat.textContent='❌ Please upload a PDF or DOCX file.';stat.className='upload-status error';} } }); } // ATS q('ats-scan-btn').addEventListener('click',runATS); q('ats-demo-btn').addEventListener('click',function(){q('ats-cv').value=ATS_CV;q('ats-jd').value=ATS_JD;toast('Demo loaded — click Scan!');}); q('ats-clear-btn').addEventListener('click',function(){q('ats-cv').value='';q('ats-jd').value='';q('ats-results').style.display='none';}); // FAQ document.querySelectorAll('.faq-item').forEach(function(item){item.addEventListener('click',function(){var a=this.querySelector('.faq-a');if(a)a.style.display=a.style.display==='block'?'none':'block';});}); // Modal q('modal-close-btn').addEventListener('click',function(){q('upgrade-modal').classList.remove('open');}); q('modal-pay-btn').addEventListener('click',function(){q('upgrade-modal').classList.remove('open');toast('Payment successful! Preparing PDF...');setTimeout(freePrint,800);}); q('upgrade-modal').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');}); // Embed copy q('copy-embed-btn').addEventListener('click',function(){var code=q('embed-code-box').textContent;if(navigator.clipboard){navigator.clipboard.writeText(code).then(function(){toast('Embed code copied!');});}else{var ta=document.createElement('textarea');ta.value=code;document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);toast('Embed code copied!');}}); // Embed mode if(new URLSearchParams(window.location.search).get('embed')==='1'){ ['site-header','hero-section','ad-top','upload-banner','demo-strip-wrap','ats-section','faq-section','embed-section','site-footer','ad-mid','ad-side'].forEach(function(id){var el=q(id);if(el)el.style.display='none';}); var pb=q('powered-by-badge');if(pb)pb.style.display='flex'; } loadLocal(); updatePreview(); updateProgress(); setInterval(saveLocal,3000); // Star rating var selectedRating=0; document.querySelectorAll('.star-btn').forEach(function(btn){ btn.addEventListener('mouseover',function(){ var v=parseInt(this.getAttribute('data-v')); document.querySelectorAll('.star-btn').forEach(function(b,i){b.style.opacity=i