Resume & Cover Letter Writer
Craft professional job application documents with ease.
Personal Information
Work Experience
Education
Skills
Cover Letter Details
Ready to Build
You've entered all your information. Click the button below to generate your documents.
Resume Preview
Cover Letter Preview
Dear ${coverLetter.hiringManager || 'Hiring Team'},
${coverLetter.letterBody || ''}
Sincerely,
${personal.fullName || ''}
`; document.getElementById('letter-preview').innerHTML = html; } function downloadPDF(type) { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const data = getFormData(); const margin = 20; const pageWidth = doc.internal.pageSize.getWidth(); let yPos = margin; doc.setFont('Times', 'normal'); doc.setFontSize(12); const renderWrappedText = (text, x, y, options) => { const lines = doc.splitTextToSize(text, options.maxWidth || (pageWidth - margin * 2)); doc.text(lines, x, y); return y + (lines.length * (options.lineHeight || 5)); }; if (type === 'resume') { const { personal, experience, education, skills } = data; // Header doc.setFont('Times', 'bold'); doc.setFontSize(24); doc.text(personal.fullName, pageWidth / 2, yPos, { align: 'center' }); yPos += 8; doc.setFont('Times', 'normal'); doc.setFontSize(10); const contactLine = `${personal.address} | ${personal.phone} | ${personal.email}${personal.linkedin ? ' | ' + personal.linkedin : ''}`; doc.text(contactLine, pageWidth / 2, yPos, { align: 'center' }); yPos += 5; doc.setLineWidth(0.5); doc.line(margin, yPos, pageWidth - margin, yPos); yPos += 10; // Experience if (experience.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Experience', margin, yPos); yPos += 6; experience.forEach(exp => { doc.setFontSize(12); doc.text(exp.title + ' - ' + exp.company, margin, yPos); doc.text(formatMonthYear(exp.startDate) + ' - ' + formatMonthYear(exp.endDate), pageWidth - margin, yPos, {align: 'right'}); yPos += 5; doc.setFont('Times', 'italic'); doc.setFontSize(10); doc.text(exp.location, margin, yPos); yPos += 5; doc.setFont('Times', 'normal'); const descItems = exp.description.split('-').map(i => i.trim()).filter(Boolean); descItems.forEach(item => { yPos = renderWrappedText(`• ${item}`, margin + 4, yPos, { lineHeight: 6 }); }); yPos += 4; }); } // Education if (education.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Education', margin, yPos); yPos += 6; education.forEach(edu => { doc.setFontSize(12); doc.text(`${edu.degree}, ${edu.institution}`, margin, yPos); doc.text(formatMonthYear(edu.gradDate), pageWidth - margin, yPos, {align: 'right'}); yPos += 5; doc.setFont('Times', 'italic'); doc.setFontSize(10); doc.text(edu.location, margin, yPos); yPos += 8; }); } // Skills if (skills.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Skills', margin, yPos); yPos += 6; doc.setFont('Times', 'normal'); doc.setFontSize(12); renderWrappedText(skills.join(', '), margin, yPos, {}); } doc.save(`Resume_${personal.fullName.replace(/\s/g, '_')}.pdf`); } else if (type === 'letter') { const { personal, coverLetter } = data; const today = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' }); doc.setFontSize(12); // Sender info doc.text(personal.fullName, pageWidth - margin, yPos, { align: 'right' }); yPos += 5; doc.text(personal.address, pageWidth - margin, yPos, { align: 'right' }); yPos += 5; doc.text(`${personal.phone} | ${personal.email}`, pageWidth - margin, yPos, { align: 'right' }); yPos += 15; // Date doc.text(today, margin, yPos); yPos += 10; // Recipient info doc.text(coverLetter.hiringManager || 'Hiring Manager', margin, yPos); yPos += 5; doc.text(coverLetter.companyName, margin, yPos); yPos += 5; doc.text(coverLetter.companyAddress, margin, yPos); yPos += 15; // Body doc.text(`Dear ${coverLetter.hiringManager || 'Hiring Team'},`, margin, yPos); yPos += 10; yPos = renderWrappedText(coverLetter.letterBody, margin, yPos, { lineHeight: 7 }); yPos += 10; doc.text('Sincerely,', margin, yPos); yPos += 15; doc.text(personal.fullName, margin, yPos); doc.save(`Cover_Letter_${personal.fullName.replace(/\s/g, '_')}.pdf`); } } // Initialize showTab(currentTab); addEntry('experience-template', elements.expEntries); addEntry('education-template', elements.eduEntries); });