
Job Application Assistant
- 62 installs
- 29.7k repo stars
- Updated August 4, 2026
- madslorentzen/ai-job-search
Evaluates a job posting for fit, tailors a LaTeX CV, writes a cover letter, and prepares STAR-format interview answers.
About
Runs a four-step job-application workflow: score posting fit, tailor a CV, write a cover letter, and prepare for the interview using candidate profile references. A developer uses it to evaluate and apply to a specific job posting.
- Step workflow: evaluate fit, tailor CV, cover letter, interview prep
- Reference files for candidate profile, writing style, and scoring
Job Application Assistant by the numbers
- 62 all-time installs (skills.sh)
- +21 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #1,543 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/madslorentzen/ai-job-search --skill job-application-assistantAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 62 |
|---|---|
| repo stars | ★ 29.7k |
| Last updated | August 4, 2026 |
| Repository | madslorentzen/ai-job-search ↗ |
What it does
Evaluates a job posting for fit, tailors a LaTeX CV, writes a cover letter, and prepares STAR-format interview answers.
Files
Job Application Assistant
---
Workflow
When the user provides a job posting (URL or text), follow this workflow:
Step 1: Research & Evaluate Fit
- Fetch the job posting content (use WebFetch for URLs)
- Analyze the posting for required competencies, keywords, and priorities
- Research the company (website, LinkedIn, mission, recent news)
- Score the posting against the candidate's profile using the framework in
04-job-evaluation.md - Present the evaluation table and verdict
- Suggest whether the candidate should call the employer before applying (see
04-job-evaluation.mdfor guidance) - Ask the user if they want to proceed with an application
Step 2: Tailor CV
- Read the most relevant existing CV variant from
cv/as a starting point - Follow the guidelines in
05-cv-templates.md - Create
cv/main_<company>.texwith tailored content - Adjust: profile statement, skills section, experience bullet emphasis, section order
Step 3: Write Cover Letter
- Follow the writing style rules in
03-writing-style.md(critical: no em-dashes, no cliches) - Follow the template structure in
06-cover-letter-templates.md - Create
cover_letters/cover_<company>_<role>.tex - Ensure the letter connects specific experience to the role requirements
Step 4: Interview Preparation
- Follow the framework in
07-interview-prep.md - Prepare STAR-format answers for likely questions
- Identify role-specific talking points
- Draft questions the candidate should ask the interviewer
---
Reference Files
| File | Purpose |
|---|---|
01-candidate-profile.md | Education, experience, skills, publications, awards |
02-behavioral-profile.md | Behavioral assessment, strengths, ideal environments |
03-writing-style.md | Tone, structure, do's and don'ts |
04-job-evaluation.md | Scoring framework for job fit |
05-cv-templates.md | LaTeX CV structure and tailoring rules |
06-cover-letter-templates.md | LaTeX cover letter structure and tailoring rules |
07-interview-prep.md | STAR examples, tough questions, roleplay guidelines |
---
Quick Commands
The user may also ask for individual steps without the full workflow:
- "Evaluate this job posting" - Step 1 only
- "Write a CV for [company]" - Step 2 only
- "Write a cover letter for [role] at [company]" - Step 3 only
- "Help me prepare for an interview at [company]" - Step 4 only
- "What jobs should I look for?" - Career strategy discussion using profile + evaluation framework
Candidate Profile
<!-- SETUP: This file is populated by running /setup --> <!-- After running /setup, all sections will be filled with your actual information -->
Identity
- Name: [YOUR_NAME]
- Location: [YOUR_ADDRESS]
- Phone: [YOUR_PHONE]
- Email: [YOUR_EMAIL]
- LinkedIn: [YOUR_LINKEDIN_URL]
- GitHub: [YOUR_GITHUB_URL]
- Languages: [YOUR_LANGUAGES with proficiency levels]
- Status: [YOUR_EMPLOYMENT_STATUS]
- Constraints: [YOUR_COMMUTE_OR_LOCATION_CONSTRAINTS]
Education
| Degree | Period | Institution | Key Topics |
|---|---|---|---|
| [DEGREE] | [YEARS] | [INSTITUTION] | [TOPICS] |
Professional Experience
[JOB_TITLE] - [COMPANY] ([START] - [END])
[LOCATION]
- [RESPONSIBILITY_OR_ACHIEVEMENT_1]
- [RESPONSIBILITY_OR_ACHIEVEMENT_2]
- [RESPONSIBILITY_OR_ACHIEVEMENT_3]
<!-- Add more roles as needed -->
Independent Projects
<!-- Projects outside of employment: freelance, open source, personal -->
- [PROJECT_NAME]: [DESCRIPTION]
Technical Skills
Programming & ML
- [LANGUAGE] ([PROFICIENCY]): [FRAMEWORKS_AND_LIBRARIES]
- [OTHER_SKILLS]
Domain Expertise
- [DOMAIN_1]
- [DOMAIN_2]
Software & Tools
- [TOOL_LIST]
Publications
<!-- List peer-reviewed publications, if any --> 1. [AUTHOR_LIST] ([YEAR]). [TITLE]. [JOURNAL]. [DOI_LINK]
Awards
- [AWARD] - [EVENT] ([YEAR])
References
- [NAME], [TITLE], [COMPANY] ([EMAIL], [PHONE])
More references available upon request.
Behavioral Profile
<!-- SETUP: This file is populated by running /setup --> <!-- You can use results from PI, DISC, Myers-Briggs, StrengthsFinder, or a self-assessment -->
Overview
[YOUR_NAME]'s behavioral assessment identifies them as a [PROFILE_TYPE] pattern. [1-2 SENTENCE_SUMMARY].
Core Behavioral Drives
| Drive | Level | Meaning |
|---|---|---|
| [DRIVE_1] | [LEVEL] | [DESCRIPTION] |
| [DRIVE_2] | [LEVEL] | [DESCRIPTION] |
| [DRIVE_3] | [LEVEL] | [DESCRIPTION] |
| [DRIVE_4] | [LEVEL] | [DESCRIPTION] |
Strongest Behaviors
- [BEHAVIOR_1]: [DESCRIPTION]
- [BEHAVIOR_2]: [DESCRIPTION]
- [BEHAVIOR_3]: [DESCRIPTION]
How You Work Best
- [ENVIRONMENT_PREFERENCE_1]
- [ENVIRONMENT_PREFERENCE_2]
- [ENVIRONMENT_PREFERENCE_3]
Growth Areas (frame positively in applications)
- [AREA_1]: [HOW_TO_FRAME_IT_POSITIVELY]
- [AREA_2]: [HOW_TO_FRAME_IT_POSITIVELY]
Mapping to Job Posting Language
When a job posting mentions these keywords, it's a strong behavioral fit:
- [KEYWORD_OR_PHRASE_THAT_MATCHES_YOUR_STYLE]
- [ANOTHER_KEYWORD]
When a job posting mentions these, flag as potential friction (not deal-breaker):
- [KEYWORD_OR_PHRASE_THAT_MIGHT_CLASH]
- [ANOTHER_KEYWORD]
Management Style Preferences
- [WHAT_MANAGEMENT_STYLE_WORKS_FOR_YOU]
- [WHAT_DOESN'T_WORK]
Using This in Applications
- Cover letters: [HOW_TO_WEAVE_IN_BEHAVIORAL_STRENGTHS]
- CV: [WHAT_TO_EMPHASIZE]
- Interviews: [WHAT_STAR_EXAMPLES_TO_USE]
- Don't overstate: [WHAT_NOT_TO_CLAIM]
Writing Style Guide
Critical Rules
1. NO em-dashes (--). Use commas, periods, or restructure the sentence instead. 2. NO cliches or filler phrases. Cut: "I am passionate about", "I believe I would be a great fit", "leverage my skills", "hit the ground running", "drive results", "synergies". 3. NO generic buzzwords without concrete backing. Every claim must be supported by a specific example or fact. 4. NO apologetic or overly humble language. Not "I think I could contribute" but "I bring X, demonstrated by Y." 5. NO unverified company claims. Every company-specific statement in a cover letter (partnerships, product names, technology descriptions, expansions) must be independently verified via WebFetch or WebSearch before inclusion. Do not trust reviewer agent research at face value. If a claim cannot be verified, rephrase it in general terms or omit it. 6. Reframe emphasis, not substance. Some framing of experience toward the target role is expected. But apply the interview backtrack test: could the candidate comfortably explain this bullet in an interview without backtracking? If they'd have to say "well, what I actually meant was..." then it's too far. Specifically:
- OK: Reordering experience to lead with what's most relevant; using natural synonyms for the target domain; emphasizing one aspect of a broad role.
- Flag it: Combining academic + industry experience into a single claim that implies it was all industry; describing work using the posting's specific terminology when the actual work was adjacent but not the same.
- Never: Claiming experience the candidate doesn't have; implying they worked in a domain they haven't.
When a bullet falls in the "flag it" zone, present it to the user after drafting with: "This bullet is a stretch because X. Keep, soften, or drop?" If the evaluation experience match score is below 50, warn before proceeding to drafting that extensive reframing would be needed.
Tone
- Warm but direct. Friendly and approachable, but confident without arrogance.
- Conversational professional. Not stiff corporate-speak, not casual chat. Think: how a confident person talks in a good job interview.
- First person, active voice. "I built" not "a system was developed by the candidate."
- Demonstrate, don't state. Instead of "I am a team player", write a specific example of teamwork and its outcome.
Application Headline (Best Practice)
The subject line / headline of the application should be engaging and specific, not generic.
Bad: "Application for Sales Engineer Position" / "Ansogning til stilling som ingeniør" Good: "[Your specialty] specializing in [relevant keyword from posting]"
Formula: [Title/education] + [relevant keyword from the job posting]
Scannable Structure (Best Practice)
Employers scan applications quickly. Structure for easy reading:
- Use descriptive subheadings that reflect content (not just "Introduction" / "Body")
- Include industry-specific keywords in headings where natural
- Write concisely - eliminate filler language
- One page maximum (hard rule)
Forward-Looking Framing (Best Practice)
The cover letter is not a CV repetition. It should be forward-looking:
- Focus on tasks you can solve for the employer, not just what you've done before
- Describe your approach: methods, tools, knowledge you'll bring
- Explain what positive outcomes the employer can expect from hiring you
- Use 1-2 brief past examples only to back up forward-looking claims
Cover Letter Structure
Opening Paragraph
- State the role and why you're writing (1 sentence)
- Immediately connect your background to the role (1-2 sentences)
- Make it specific to this company/role, not a template opener
Body Paragraphs - Task-Solving Focus
- Lead with the most relevant experience for this specific role
- Frame content around which of their tasks you can solve and how
- Describe your approach: methods, tools, and knowledge you'll bring
- Use bullet lists for concrete skills/achievements when appropriate (3-5 bullets)
- Each bullet should be specific and outcome-oriented
- Include at least one example that shows initiative
- Include 1-2 brief examples of past success, but keep the focus forward-looking
Motivation / Why This Company (place early)
- The first section after the opening should explain why you're applying to this specific company
- Use language and themes from the job posting and company website
- Focus on how you'll contribute to their goals, not what you gain from employment
- If you spoke with someone at the company, reference the conversation naturally
Company-Specific Paragraph
- Show you've researched the company (mention specific projects, values, or market position)
- Explain why this company specifically, not just "a company like yours"
- Connect domain knowledge to their business context
Closing
- Brief, confident, forward-looking
- "I look forward to hearing from you" or "I would welcome the opportunity to discuss..."
- No begging or over-enthusiasm
Bullet Point Style
- Start with action verb or bold category label
- Be specific: numbers, tools, outcomes
- Vary the structure (not every bullet starts the same way)
Language for Different Role Types
Technical/ML roles
- Lead with programming languages, ML frameworks, specific model architectures
- Mention datasets, data volumes, pipeline complexity
- Include independent projects
Domain-specific roles
- Lead with domain expertise and specific methods
- Frame technical skills as tools that enhance domain analysis
Consulting/Advisory roles
- Lead with stakeholder communication, project coordination, client interaction
- Emphasize ability to bridge technical and business perspectives
Leadership/Senior roles
- Lead with project management, mentoring, course development
- Frame advanced degrees as evidence of independent project delivery
Multi-language Applications
- Default to the language of the job posting
- Cover letters in the posting's language should feel natural, not translated
- Slightly warmer, more personal tone may be acceptable in some languages
Job Evaluation Framework
<!-- SETUP: Skill match areas and career goals are personalized by running /setup -->
Scoring Dimensions
Evaluate each job posting against these five dimensions:
1. Technical Skills Match (0-100)
How well do the required/preferred skills align with the candidate's capabilities?
| Score | Meaning |
|---|---|
| 80-100 | Core requirements are primary skills |
| 60-79 | Most requirements match, 1-2 gaps that are learnable |
| 40-59 | Partial match, significant upskilling needed |
| 0-39 | Fundamental mismatch |
Strong match areas: [YOUR_PRIMARY_SKILLS] Moderate match areas: [YOUR_SECONDARY_SKILLS] Weak match areas: [SKILLS_YOU_LACK]
2. Experience Match (0-100)
Does work history align with what they're looking for?
| Score | Meaning |
|---|---|
| 80-100 | Direct experience in the same domain and role type |
| 60-79 | Related experience, transferable skills clear |
| 40-59 | Adjacent experience, would need to make the case |
| 0-39 | Unrelated experience |
Strong: [YOUR_DIRECT_EXPERIENCE_DOMAINS] Moderate: [YOUR_ADJACENT_EXPERIENCE] Entry-level: [ROLES_WITH_LIMITED_EXPERIENCE]
3. Behavioral/Culture Fit (0-100)
Does the role and company culture match the behavioral profile?
| Score | Meaning |
|---|---|
| 80-100 | Culture strongly matches behavioral preferences |
| 60-79 | Mixed signals but mostly compatible |
| 40-59 | Some friction areas |
| 0-39 | Significant culture mismatch |
Red flags to research: Department disorganization, work dominated by maintenance over development, poor chemistry with leadership, culture mismatches. Check reviews, media coverage, LinkedIn connections, and network contacts for insider perspective.
4. Location & Logistics (Pass/Fail + Notes)
- Within commute range: PASS
- Remote with occasional office: PASS
- Requires relocation: FAIL (deal-breaker)
- Frequent international travel: FLAG (discuss with user)
5. Career Alignment & Motivation (0-100)
Does this role advance career goals and contain tasks that energize?
| Score | Meaning |
|---|---|
| 80-100 | Strongly aligned with career direction, clear growth path |
| 60-79 | Good role but only partially aligned with long-term goals |
| 40-59 | Decent job but doesn't build toward career goals |
| 0-39 | Dead end or backwards step |
Career goals:
- [YOUR_CAREER_GOAL_1]
- [YOUR_CAREER_GOAL_2]
- [YOUR_CAREER_GOAL_3]
Motivation filter: Evaluate not just whether you can do the tasks, but whether the tasks will energize you. Consider:
- Tasks that energize: [YOUR_ENERGIZING_TASKS]
- Tasks that drain: [YOUR_DRAINING_TASKS]
- Non-task factors: leadership style, department culture, company values, degree of autonomy
Life situation alignment: Consider personal constraints:
- Security: [YOUR_FINANCIAL_SITUATION_CONTEXT]
- Flexibility: [YOUR_SCHEDULE_CONSTRAINTS]
- Professional development: [YOUR_GROWTH_PRIORITIES]
6. Salary Benchmark (Optional)
If the salary lookup tool is configured (salary_data.json exists), look up the company:
python salary_lookup.py "<Company Name>" --jsonIf a city is known from the posting, add --city "<City>" to narrow results.
Present findings as:
### Salary Benchmark
| Metric | Value |
|--------|-------|
| [Category] index | XX.X (+/-X.X% vs baseline) |
| Overall index | XX.X (+/-X.X% vs baseline) |Interpret results relative to the baseline defined in the data file's metadata. For index-based data, higher typically means above-market compensation.
If the salary tool is not configured, skip this section.
Output Format
Present the evaluation as:
## Job Fit Evaluation: [Role] at [Company]
| Dimension | Score | Notes |
|-----------|-------|-------|
| Technical Skills | XX/100 | [brief note] |
| Experience Match | XX/100 | [brief note] |
| Behavioral Fit | XX/100 | [brief note] |
| Location | PASS/FAIL | [brief note] |
| Career Alignment | XX/100 | [brief note] |
**Overall Score: XX/100** (weighted average of scored dimensions)
### Verdict: [Strong Fit / Good Fit / Moderate Fit / Weak Fit / Poor Fit]
### Key Strengths for This Role
- [bullet points]
### Gaps to Address
- [bullet points]
### Recommendation
[1-2 sentences: apply/skip/apply with caveats]
### Company Research Checklist
- [ ] Checked company website (mission, values, recent news)
- [ ] Checked review sites (Glassdoor, Jobindex, etc.)
- [ ] Checked LinkedIn for team size, recent hires, connections
- [ ] Checked media for restructuring, growth, or workplace issues
- [ ] Identified network contacts who may know the team/managerWeighting
- Technical Skills: 30%
- Experience Match: 25%
- Behavioral Fit: 15%
- Career Alignment: 30%
(Location is pass/fail, not weighted)
Thresholds
- Strong Fit (75+): Definitely apply, tailor everything
- Good Fit (60-74): Apply, address gaps in cover letter
- Moderate Fit (45-59): Consider carefully, discuss with user
- Weak Fit (30-44): Probably skip unless strategic reasons
- Poor Fit (<30): Skip
Pre-Application: Call the Employer (Best Practice)
Before writing the application, consider whether the candidate should call the contact person listed in the posting. Only call if there are substantive questions - never call just to "be remembered."
When to Suggest Calling
- The posting has unclear or ambiguous requirements
- It's unclear which competencies are essential vs. nice-to-have
- The role description is vague about day-to-day tasks
- There's a named contact person who invites questions
Good Questions to Ask
- "What are the primary challenges in this role?"
- "How is time typically divided across the listed responsibilities?"
- "Which competencies are most critical for success in this position?"
- "What does success look like in the first 6-12 months?"
Rules for the Call
- Prepare a 30-second "elevator pitch" about your background in case they ask
- The call's purpose is gathering information, not delivering a pitch
- Take notes - use what you learn to tailor the application
- Reference the conversation naturally in the cover letter ("After speaking with [name], I was especially drawn to...")
CV Templates and Tailoring Guide
<!-- SETUP: Profile statements and section ordering are personalized by running /setup -->
Template: LaTeX moderncv (Banking Style)
All CVs use the moderncv LaTeX package with the "banking" style and "blue" color scheme.
Output file: cv/main_<company>.tex Compile with: lualatex on MiKTeX/TeX Live. pdflatex often fails on modern MiKTeX installs with fontawesome5 font-expansion errors; lualatex handles the same sources cleanly. Master reference: cv/main_example.tex (comprehensive CV with all competencies, experience, and achievements - use as source when building targeted CVs)
Compile command
cd cv && lualatex -interaction=nonstopmode main_<company>.texExpected output: Output written on main_<company>.pdf (2 pages, ...). Any page count other than 2 is a failure that must be fixed before presenting to the user.
Document Structure
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{banking}
\moderncvcolor{blue}
% Force both first and last name AND section headings to render in moderncv
% blue (color1). Default banking on lualatex+MiKTeX leaves these black, which
% looks inconsistent with the rest of the blue accent scheme.
\renewcommand*{\firstnamestyle}[1]{{\fontsize{34}{36}\bfseries\upshape\color{color1}#1}}
\renewcommand*{\lastnamestyle}[1]{{\fontsize{34}{36}\bfseries\upshape\color{color1}#1}}
\renewcommand*{\sectionstyle}[1]{{\sectionfont\color{color1}#1}}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\hypersetup{
colorlinks=true,
linkcolor=blue,
filecolor=magenta,
urlcolor=blue,
pdftitle={[YOUR_NAME] - CV},
pdfpagemode=FullScreen,
}
\usepackage[scale=0.77]{geometry}
\usepackage{import}
% Personal data
\name{[FIRST_NAME]}{[LAST_NAME]}
\address{[YOUR_ADDRESS]}{}{}
\phone[mobile]{[YOUR_PHONE]}
\email{[YOUR_EMAIL]}
\extrainfo{\href{[YOUR_LINKEDIN_URL]}{LinkedIn}, \href{[YOUR_GITHUB_URL]}{GitHub}}
\begin{document}
\makecvtitle
% 1. Profile statement (1-3 sentences, tailored per role)
% 2. Skills section
% 3. Education section
% 4. Professional Experience section
% 5. Selected Publications (if applicable)
% 6. Honors and Awards (if applicable)
% 7. References
\end{document}Color overrides
The three \renewcommand* lines in the preamble are required on lualatex+MiKTeX. Without them the firstname, lastname, and section headings render in black even though \moderncvcolor{blue} is set, which looks inconsistent with the rest of the blue accent scheme (links, bullet markers, contact icons). The override forces all three to use color1 (moderncv's accent colour, which becomes blue under \moderncvcolor{blue}). Both names render bold; if you prefer the firstname in regular weight, change the firstnamestyle override from \bfseries to \mdseries. Don't drop the override - on most modern installs the defaults render visibly wrong.
Spacing inside itemize lists (important)
Do not place `\vspace{...}` between `\item` entries in an `itemize` list. Even though the source looks symmetric, this pattern occasionally produces a noticeably oversized gap before a single item: the inter-item \vspace creates a paragraph break that interacts unpredictably with the list's internal \itemsep, so LaTeX renders one of the gaps wider than the rest. Remove the inter-item \vspace and let itemize use its native uniform spacing.
% WRONG - intermittently produces an oversized gap before one bullet
\begin{itemize}
\item \textbf{Foo}: ...
\vspace{1pt}
\item \textbf{Bar}: ...
\vspace{1pt}
\item \textbf{Baz}: ...
\end{itemize}
% RIGHT - uniform spacing using the list's native itemsep
\begin{itemize}
\item \textbf{Foo}: ...
\item \textbf{Bar}: ...
\item \textbf{Baz}: ...
\end{itemize}Two related patterns are fine and should be kept:
\vspace{1pt}immediately after\section{...}(between section heading and first item) - this is between the heading and the list, not between list items.\vspace{3pt}between top-level\cventryblocks in Professional Experience or Education - this gives breathing room between roles and renders consistently.
Section-by-Section Tailoring
Profile Statement / Elevator Pitch (Best Practice)
This is the most important section to customize. It appears right after \makecvtitle.
Write 5-7 lines that function as an "elevator pitch": a concise, compelling introduction explaining why you're qualified for this specific role. Focus on what the employer gains from hiring you.
Create 2-3 profile statement templates for your main role types:
<!-- SETUP: These are populated based on your background --> For [YOUR_PRIMARY_ROLE_TYPE] roles:
[YOUR_PROFILE_STATEMENT_TEMPLATE_1]
For [YOUR_SECONDARY_ROLE_TYPE] roles:
[YOUR_PROFILE_STATEMENT_TEMPLATE_2]
Core Competencies / Skills Section (Best Practice)
Reorder and emphasize based on the role. Use bold category labels.
List 5-7 key competencies in bullet format, tailored to the specific job. For each competency, briefly explain how it adds value to the position.
Education
- Always include your highest degrees
- For senior roles, keep education brief (dates and titles only)
- Include thesis topics when relevant to the target role
Professional Experience
- Rewrite bullet points to emphasize aspects most relevant to the target role
- Use 4-6 bullets for most recent role, 3-4 for previous, 2-3 for older
- Emphasize measurable results where possible: "Reduced processing time by X%", "Model adopted by the team"
Handling Employment Gaps (Best Practice)
If there is a gap in your employment history:
- The gap should be explained matter-of-factly if needed
- Describe how professional development continued during the gap
- Frame as deliberate skill-building and career repositioning
Publications
- Include Google Scholar link if applicable
- Select 3-4 most relevant publications (not always all of them)
- For non-academic roles, keep brief
Honors and Awards
- Keep format brief, one line each
References
- List 2-4 references with name, title, company, and contact
- End with: "More references are available upon request."
- Do not attach reference letters - employers typically contact references directly
Compile-and-Inspect Loop (MANDATORY)
After writing the CV and before presenting to the user, always compile and visually inspect the PDF. Iterate until the layout is clean. Workflow:
1. Run lualatex -interaction=nonstopmode main_<company>.tex 2. Check the output page count: must be exactly 2 3. Read the PDF via the Read tool and visually inspect both pages 4. Check for orphaned entries: a \cventry title line must never sit alone at the bottom of page 1 with its bullets on page 2
Fixing common page-break problems
Problem: entry title on page 1, bullets orphaned to page 2 Add \needspace{5\baselineskip} immediately before the problematic \cventry:
\needspace{5\baselineskip}
\item{\cventry{YEAR--YEAR}{Role Title}{Organization}{Location}{}{...}}Include \usepackage{needspace} in the preamble.
Problem: one trailing section spills to page 3 (e.g., References alone on page 3) Add \enlargethispage{2-3\baselineskip} before a late section (e.g., before \section{Honors and Awards}) to stretch page 2 by a few lines. This is the standard LaTeX rescue for near-miss overflows.
Problem: 3 pages with significant content on page 3 Cut content — do not compress geometry or \vspace. See "Relevance-weighted cutting" below for the rule.
Problem: content finishes early on page 2 (feels thin) Restore the highest-relevance item that was previously cut — a CV that ends mid-page 2 looks incomplete.
Page Budget - Hard 2-Page Limit
The CV must fit on exactly 2 pages when compiled. Use these content limits as a guide:
| Section | Max budget |
|---|---|
| Profile statement | 3-4 lines |
| Skills | 5 items, each 1-2 lines |
| Most recent role | 4-5 bullets |
| Previous role | 2-3 bullets |
| Older roles | 2 bullets (1 line each) |
| Education | 2-3 entries |
| Publications | 2-3 entries |
| Awards | 3 entries, single line each |
| References | "Available upon request." (single line) |
If in doubt, cut rather than squeeze. Reducing \vspace or geometry scale to force-fit content makes the CV look cramped.
Relevance-weighted cutting (the right way to shrink a CV)
Cut by signal, not by section. Static priority lists ("remove oldest education first, then shorten the earliest role...") are wrong when a relevant "lower-priority" item is competing with an irrelevant "higher-priority" item. An older-role bullet that speaks directly to the posting is worth more than a recent-role bullet that does not.
For every candidate line, score three things:
1. Relevance to THIS posting — does the line hit a named tool, keyword, or stated responsibility in the job ad? 2. Uniqueness — is it the only place this claim appears, or is it duplicated elsewhere in the CV? 3. Narrative load — does the cover letter depend on it? If cutting the line would force you to rewrite a cover-letter paragraph, it is load-bearing.
Cut the lowest-total-score line first, regardless of which section it sits in.
Practical order of cuts (easiest → last resort)
1. Redundancy. If an achievement appears in both Core Competencies AND a role bullet, the Core Competencies version is usually the cleaner cut (the experience bullet is more concrete evidence). 2. Profile-statement fluff. A sentence that just restates what Publications or Skills will show. ("Peer-reviewed publications on X..." is already a Publications entry — profile can claim it once and stop.) 3. Low-relevance experience bullets. A bullet about work that does not touch posting keywords, wherever it sits. This cuts across sections before touching the structural list. 4. Low-relevance supporting content. An older-role bullet that does not speak to the target role. A certification that does not touch the posting's stack. A language entry that can be condensed to one line. 5. Low-relevance publications. Keep 1-2 publications that best match the posting. Cut the rest before touching experience bullets. 6. Last-resort structural cuts. Oldest education entry, tightening an older role to 2 bullets, collapsing Certifications into a single line. These only happen if the relevance-weighted cuts above have already been exhausted.
Pitfalls to avoid
- Do not mechanically cut from the bottom of a static section list without checking relevance. "Cut the oldest role first" is wrong if that role is literally about the skill the posting asks for.
- Do not cut the one concrete example the cover letter leans on. Relevance is measured against the cover letter you wrote, not just the job posting — interviewers will have read both.
- Do not cut to fit if the fit is borderline (2.02 pages). Prefer
\enlargethispage{2-3\baselineskip}on a late section for near-misses; reserve content cuts for genuine overflow (content on page 3 that is more than a single trailing section).
Recommended Section Order
The section order varies by role type:
For technical / data science / ML roles: 1. Profile statement / elevator pitch 2. Core competencies / Skills 3. Professional Experience (reverse chronological) 4. Education (reverse chronological) 5. Languages 6. Publications & Awards 7. References
For domain-specific / specialist roles: 1. Profile statement / elevator pitch 2. Core competencies / Skills 3. Education (reverse chronological) - credentials are a key qualifier 4. Professional Experience (reverse chronological) 5. Publications & Awards 6. References
Cover Letter Templates and Tailoring Guide
Template: Custom cover.cls (XeLaTeX)
Cover letters use a custom LaTeX document class (cover.cls) with Lato/Raleway fonts.
Output file: cover_letters/cover_<company>_<role>.tex Compile with: XeLaTeX (cover.cls requires fontspec) Font directory: cover_letters/OpenFonts/fonts/
Compile command
cd cover_letters && xelatex -interaction=nonstopmode cover_<company>_<role>.texExpected output: Output written on cover_<company>_<role>.pdf (1 page, ...). Any page count other than 1 is a failure that must be fixed before presenting to the user.
Compile-and-Inspect Loop (MANDATORY)
After writing the cover letter and before presenting to the user, always compile and visually inspect the PDF. Iterate until the layout is clean:
1. Run xelatex -interaction=nonstopmode cover_<company>_<role>.tex 2. Confirm page count is exactly 1 and compile succeeded 3. Read the PDF via the Read tool and visually check: signature fits at the bottom, no text cut off, bullet font matches body
Known template pitfall: itemize inside \lettercontent{}
The \lettercontent{} macro appends \\ to its argument. This breaks when the argument ends in \end{itemize} because \\ has no line to break after the environment closes, producing ! LaTeX Error: There's no line here to end. and no PDF output.
Wrong (breaks compile):
\lettercontent{Here is how my experience maps:
\begin{itemize}
\item ...
\end{itemize}}Correct — close `\lettercontent{}` before the list and wrap the list in the matching Raleway-Medium font so typography stays consistent:
\lettercontent{Here is how my experience maps:}
{\raggedright\fontspec[Path = OpenFonts/fonts/raleway/]{Raleway-Medium}\fontsize{11pt}{13pt}\selectfont
\begin{itemize}
\item ...
\end{itemize}\par}
\vspace{6pt}
\lettercontent{[next paragraph]}The font wrapper is mandatory — if you just move \begin{itemize} outside \lettercontent{} without the \fontspec block, bullets render in the default body font (Lato) and visually mismatch the rest of the letter.
Document Structure
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cover Letter - [Company], [Role]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[]{cover}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\rfoot{Page \thepage \hspace{0pt}}
\thispagestyle{empty}
\renewcommand{\headrulewidth}{0pt}
\begin{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TITLE NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\namesection{}{\Huge{[YOUR_NAME]}}{ \href{mailto:[YOUR_EMAIL]}{[YOUR_EMAIL]} | [YOUR_PHONE] | \urlstyle{same}\href{[YOUR_LINKEDIN_URL]}{LinkedIn}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MAIN COVER LETTER CONTENT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\currentdate{\today}
\lettercontent{Dear [Name/Team],}
\lettercontent{[Opening paragraph - role, connection to background, 2-3 sentences]}
\lettercontent{[Body paragraph - most relevant experience, then bullet list]
\begin{itemize}
\item [Concrete achievement/skill 1]
\item [Concrete achievement/skill 2]
\item [Concrete achievement/skill 3]
\end{itemize}
[Connection to company - why this role, why this company specifically]}
\lettercontent{[Personal fit paragraph - behavioral strengths, team contribution, 2-3 sentences]}
\lettercontent{I look forward to hearing from you.}
\begin{flushright}
\closing{Kind regards,\\}
\signature{[YOUR_NAME]}
\end{flushright}
\end{document}Key Commands Reference
| Command | Purpose |
|---|---|
\namesection{}{Name}{contact info} | Header with name and contact |
\currentdate{date} | Date field (use \today or explicit date) |
\lettercontent{text} | Body paragraph (adds spacing after) |
\closing{text} | Closing line |
\signature{name} | Printed name below signature |
Tailoring Guidelines
Salutation
- If you know the hiring manager's name: "Dear [First Last],"
- If you know the team: "Dear [Company] hiring team,"
- Generic: "Dear [Company]," (avoid "To whom it may concern")
Length - Hard 1-Page Limit
- Target: 1 page including signature block
- Maximum: never exceed 1 page
- Word budget: 250-300 words of body text (not counting LaTeX markup). This is the safe maximum. 350 words will overflow.
- Always count: opening paragraph + bullet list paragraph + closing paragraph = 3 blocks. Add a 4th only if the others are short.
- When adding company-specific content, trim other content to compensate rather than adding net length
Line Spacing
- Add
\usepackage{setspace}and\setstretch{1.0}if the letter is long and needs to fit on one page - Use
\vspace{.5cm}between major sections for readability (only if space permits)
Bullet Lists
- Place
\begin{itemize}...\end{itemize}outside a\lettercontent{}block (see "Known template pitfall" above), wrapped in the matching Raleway-Medium\fontspecso the bullet font matches the body - 3-5 bullets is ideal
- Start each bullet with bold label or action verb
- Use
\textbf{Label:}for category-style bullets
LaTeX Special Characters
- Underscore:
\_ - Ampersand:
\&
Non-English Cover Letters
- Same template structure, just write content in the posting's language
- Adjust date format to local convention
- Adjust closing to local convention (e.g. "Med venlig hilsen," for Danish)
Checklist Before Finalizing
- [ ] No em-dashes (use commas or periods instead)
- [ ] No cliches or empty filler
- [ ] Every claim backed by specific example
- [ ] Forward-looking framing: focuses on tasks you'll solve, not just past duties
- [ ] Motivation section references this specific company's mission/values
- [ ] Company name and role are correct throughout
- [ ] Date is current
- [ ] Fits on one page
- [ ] Language matches the job posting language
- [ ] Salutation is appropriate (named person if possible)
- [ ] Headline is engaging and specific, not generic
Submission Guidelines (Best Practice)
- Submit only the documents the employer requests
- Export as PDF to preserve formatting
- Name files clearly: "[Your Name] CV" and "[Your Name] Cover Letter"
- Follow all employer instructions regarding anonymity or specific materials
Interview Preparation Guide
<!-- SETUP: STAR examples are personalized by running /setup based on your actual experience -->
STAR Format
Structure answers as: Situation (context), Task (your responsibility), Action (what you did), Result (outcome).
Keep answers to 1-2 minutes. Be specific. End with what you learned or would do differently.
Ready-Made STAR Examples
<!-- These are populated by /setup from your actual experience. Below are templates showing the format. -->
1. [PROJECT_NAME] ([SKILL_DEMONSTRATED])
S: [CONTEXT - what was happening, what was the problem] T: [YOUR RESPONSIBILITY - what you specifically needed to do] A: [WHAT YOU DID - specific actions, tools, methods] R: [OUTCOME - measurable results, adoption, impact] Use for: "[QUESTION_TYPE_1]", "[QUESTION_TYPE_2]"
2. [PROJECT_NAME] ([SKILL_DEMONSTRATED])
S: [CONTEXT] T: [YOUR RESPONSIBILITY] A: [WHAT YOU DID] R: [OUTCOME] Use for: "[QUESTION_TYPE_1]", "[QUESTION_TYPE_2]"
3. [PROJECT_NAME] ([SKILL_DEMONSTRATED])
S: [CONTEXT] T: [YOUR RESPONSIBILITY] A: [WHAT YOU DID] R: [OUTCOME] Use for: "[QUESTION_TYPE_1]", "[QUESTION_TYPE_2]"
<!-- Add more STAR examples as needed. Aim for 4-6 covering different competencies. -->
Common Tough Questions
"Why did you leave [previous company]?"
[PREPARE YOUR ANSWER - be honest, forward-looking, no negativity about former employer]
"You don't have [specific skill/experience]."
[PREPARE YOUR ANSWER - acknowledge the gap, bridge to adjacent experience, show willingness to learn]
"Where do you see yourself in 5 years?"
[PREPARE YOUR ANSWER - show ambition aligned with the role's growth path]
"What's your biggest weakness?"
[PREPARE YOUR ANSWER - genuine weakness with concrete mitigation strategy]
"Why this company specifically?"
Customize per company. Must reference: specific projects, company values, market position, or team structure. Never give a generic answer.
Questions You Should Ask Interviewers
About the Role
- "What does a typical week look like in this role?"
- "What would success look like in the first 6 months?"
- "What's the biggest challenge the team is facing right now?"
About the Team
- "How big is the team, and how do you divide work?"
- "What does the development/project lifecycle look like, from idea to production?"
- "How do you onboard new team members?"
About Tech & Growth
- "What's your current tech stack for [relevant area]?"
- "Is there room to grow into more architectural or strategic decisions?"
- "How does the team stay current with new tools and methods?"
About Culture (use these to prevent disappointment)
- "How would you describe the team culture?"
- "What does professional development look like here?"
- "Is there flexibility for remote/hybrid work?"
- "What's the balance between development/new projects and maintenance work?"
- "How would you describe the leadership style in this team?"
- "What do people who thrive here have in common?"
Phone/Video Interview Tips
- Have STAR examples written out (use this file)
- Keep a glass of water nearby
- Smile when speaking (it changes your tone)
- Ask for clarification if a question is vague
- It's OK to take 5 seconds to think before answering
- End with: "Is there anything else you'd like to know about my background?"
After the Application (Best Practice)
Follow-Up Etiquette
- Don't call to "stand out" or to learn more about the role post-submission - this risks a negative impression
- If the employer specified a timeline, respect it and wait
- If no timeline was given and significant time has passed (2+ weeks), a brief call to ask about status is acceptable
- If you have genuinely new, relevant information to share, a short follow-up is fine
Thank-You Notes
- When you receive any update (interview invitation, rejection, or status update), send a brief thank-you message
- Express appreciation for their time and the process
- Keep it short (2-3 sentences)
Roleplay Guidelines
When the user asks for interview practice: 1. Ask which role/company to simulate 2. Start with easy warm-up questions ("Tell me about yourself") 3. Progress to role-specific technical questions 4. Include 1-2 behavioral questions using the competencies from the job posting 5. End with a tough question or curveball 6. After each answer, give brief feedback: what worked, what to sharpen 7. Suggest which STAR example would work best for each question