Spaces:
Running
Running
| /** | |
| * Writing Tips Service | |
| * Provides inline expert tips for each resume section. | |
| */ | |
| const TIPS = { | |
| summary: [ | |
| { | |
| id: 'sum_1', | |
| tip: 'Start with your job title and years of experience.', | |
| example: '"Results-driven Software Engineer with 5+ years building scalable web appsβ¦"', | |
| tags: ['opening', 'length'], | |
| }, | |
| { | |
| id: 'sum_2', | |
| tip: 'Mention 2β3 core competencies aligned with your target role.', | |
| example: '"Specialized in React, Node.js, and cloud-native architecture."', | |
| tags: ['skills', 'alignment'], | |
| }, | |
| { | |
| id: 'sum_3', | |
| tip: 'Close with a value statement β what you bring to an employer.', | |
| example: '"Passionate about delivering high-quality software on time and under budget."', | |
| tags: ['value', 'closing'], | |
| }, | |
| { | |
| id: 'sum_4', | |
| tip: 'Keep it to 40β80 words. Recruiters spend ~7 seconds on initial scan.', | |
| example: null, | |
| tags: ['length', 'ats'], | |
| }, | |
| { | |
| id: 'sum_5', | |
| tip: 'Avoid first-person pronouns ("I", "my"). Write in third-person implied.', | |
| example: '"Delivered 15+ client projects" not "I delivered 15+ client projects".', | |
| tags: ['style'], | |
| }, | |
| ], | |
| experience: [ | |
| { | |
| id: 'exp_1', | |
| tip: 'Use the CAR method: Context β Action β Result.', | |
| example: '"Redesigned checkout flow (C) using React + TypeScript (A), reducing cart abandonment by 22% (R)."', | |
| tags: ['structure', 'results'], | |
| }, | |
| { | |
| id: 'exp_2', | |
| tip: 'Start every bullet with a strong action verb.', | |
| example: '"Led, Built, Drove, Increased, Reduced, Streamlined, Launchedβ¦"', | |
| tags: ['verbs', 'ats'], | |
| }, | |
| { | |
| id: 'exp_3', | |
| tip: 'Quantify everything you can: %, $, users, time saved.', | |
| example: '"Cut CI/CD pipeline time from 45 min to 8 min (82% improvement)."', | |
| tags: ['metrics', 'ats'], | |
| }, | |
| { | |
| id: 'exp_4', | |
| tip: 'List most recent job first (reverse chronological order).', | |
| example: null, | |
| tags: ['format'], | |
| }, | |
| { | |
| id: 'exp_5', | |
| tip: 'Aim for 3β5 bullets per role; 6+ only for senior or long-tenure roles.', | |
| example: null, | |
| tags: ['length'], | |
| }, | |
| { | |
| id: 'exp_6', | |
| tip: 'Tailor bullet points to keywords in the job description.', | |
| example: '"Implemented microservices architecture" if the JD mentions microservices.', | |
| tags: ['ats', 'keywords'], | |
| }, | |
| ], | |
| education: [ | |
| { | |
| id: 'edu_1', | |
| tip: 'Include institution name, degree, field of study, and graduation year.', | |
| example: '"B.S. Computer Science, Stanford University, 2021"', | |
| tags: ['completeness'], | |
| }, | |
| { | |
| id: 'edu_2', | |
| tip: 'List GPA only if 3.5+ or specifically requested by the employer.', | |
| example: '"GPA: 3.8/4.0 (Magna Cum Laude)"', | |
| tags: ['optional'], | |
| }, | |
| { | |
| id: 'edu_3', | |
| tip: 'Recent graduates: place Education before Experience.', | |
| example: null, | |
| tags: ['order', 'new-grad'], | |
| }, | |
| { | |
| id: 'edu_4', | |
| tip: 'Include relevant coursework, thesis, or honors if under 3 years of experience.', | |
| example: '"Relevant: Machine Learning, Distributed Systems, Algorithms"', | |
| tags: ['new-grad', 'detail'], | |
| }, | |
| ], | |
| skills: [ | |
| { | |
| id: 'ski_1', | |
| tip: 'Group skills into categories for readability: Languages, Frameworks, Tools, Soft Skills.', | |
| example: '"Languages: Python, Go, TypeScript | Frameworks: React, FastAPI, Django"', | |
| tags: ['organization', 'readability'], | |
| }, | |
| { | |
| id: 'ski_2', | |
| tip: 'Mirror keywords from the job description exactly (ATS matches exact strings).', | |
| example: 'Job says "Kubernetes" β use "Kubernetes", not just "containers".', | |
| tags: ['ats', 'keywords'], | |
| }, | |
| { | |
| id: 'ski_3', | |
| tip: 'Only list skills you can discuss confidently in an interview.', | |
| example: null, | |
| tags: ['honesty'], | |
| }, | |
| { | |
| id: 'ski_4', | |
| tip: 'Omit outdated technologies unless the role requires them.', | |
| example: '"Internet Explorer 6 optimization" is probably not relevant today.', | |
| tags: ['relevance'], | |
| }, | |
| ], | |
| certifications: [ | |
| { | |
| id: 'cert_1', | |
| tip: 'Include full name, issuing organization, and expiry date if applicable.', | |
| example: '"AWS Certified Solutions Architect β Associate | Amazon, 2023 (expires 2026)"', | |
| tags: ['completeness'], | |
| }, | |
| { | |
| id: 'cert_2', | |
| tip: 'List industry-recognized certs prominently β they\'re major ATS keywords.', | |
| example: 'PMP, AWS, GCP, CPA, CISSP, Scrum Master, etc.', | |
| tags: ['ats', 'priority'], | |
| }, | |
| ], | |
| projects: [ | |
| { | |
| id: 'proj_1', | |
| tip: 'Include project name, tech stack, your role, and a measurable outcome.', | |
| example: '"Built a real-time chat app (React, Socket.io, Redis) used by 2,000+ users."', | |
| tags: ['structure', 'metrics'], | |
| }, | |
| { | |
| id: 'proj_2', | |
| tip: 'Link to GitHub or live demo for technical roles.', | |
| example: '"GitHub: github.com/username/project"', | |
| tags: ['links', 'tech'], | |
| }, | |
| { | |
| id: 'proj_3', | |
| tip: 'Prioritize projects relevant to the role you are applying for.', | |
| example: null, | |
| tags: ['relevance'], | |
| }, | |
| ], | |
| contact: [ | |
| { | |
| id: 'con_1', | |
| tip: 'Use a professional email (firstname.lastname@domain.com).', | |
| example: '"john.doe@gmail.com" is better than "coolkid99@yahoo.com".', | |
| tags: ['professionalism'], | |
| }, | |
| { | |
| id: 'con_2', | |
| tip: 'Add LinkedIn profile URL β recruiters will check it.', | |
| example: '"linkedin.com/in/johndoe"', | |
| tags: ['links'], | |
| }, | |
| { | |
| id: 'con_3', | |
| tip: 'City + State/Country is sufficient. No need for full street address.', | |
| example: '"San Francisco, CA" or "Remote"', | |
| tags: ['privacy', 'format'], | |
| }, | |
| { | |
| id: 'con_4', | |
| tip: 'Ensure your phone number has a professional voicemail set up.', | |
| example: null, | |
| tags: ['professionalism'], | |
| }, | |
| ], | |
| languages: [ | |
| { | |
| id: 'lang_1', | |
| tip: 'Use standard proficiency levels: Native, Fluent, Professional, Conversational, Elementary.', | |
| example: '"Spanish β Fluent | French β Conversational"', | |
| tags: ['format'], | |
| }, | |
| ], | |
| awards: [ | |
| { | |
| id: 'awd_1', | |
| tip: 'Include the award name, issuing body, and year.', | |
| example: '"Dean\'s List, University of Michigan, 2019β2021"', | |
| tags: ['completeness'], | |
| }, | |
| { | |
| id: 'awd_2', | |
| tip: 'Briefly explain the significance if the award is not well-known.', | |
| example: '"Top 5% of graduating class (awarded to 12 of 250 students)"', | |
| tags: ['context'], | |
| }, | |
| ], | |
| }; | |
| /** | |
| * Returns all tips for a given section. | |
| * @param {string} section - e.g. 'experience', 'skills', 'summary' | |
| */ | |
| function getTipsForSection(section) { | |
| return TIPS[section.toLowerCase()] || []; | |
| } | |
| /** | |
| * Returns a random tip for a section (useful for inline prompts). | |
| */ | |
| function getRandomTip(section) { | |
| const tips = getTipsForSection(section); | |
| if (!tips.length) return null; | |
| return tips[Math.floor(Math.random() * tips.length)]; | |
| } | |
| /** | |
| * Returns all tips across all sections (used to seed the DB). | |
| */ | |
| function getAllTips() { | |
| return Object.entries(TIPS).flatMap(([section, tips]) => | |
| tips.map((t) => ({ ...t, section })) | |
| ); | |
| } | |
| module.exports = { getTipsForSection, getRandomTip, getAllTips }; | |