TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/SudharakaA/ai-job-search/llms.txt
Use this file to discover all available pages before exploring further.
/apply command is the core of AI Job Search. It runs a structured two-agent pipeline that takes a job posting from URL or pasted text through fit evaluation, LaTeX drafting, independent review, revision, mandatory PDF compilation with layout inspection, and ATS text-layer verification before presenting a fully verified output. Every application is grounded in your actual profile: no skill is fabricated, no gap is hidden, and the final PDFs are visually inspected before they reach you.
What makes this pipeline different
Four design choices distinguish/apply from simpler “generate a CV” approaches:
PDF verification loop
LaTeX that looks correct in
.tex often breaks in the PDF. Job titles orphan to the next page, cover letters spill to a second page, bullet fonts silently fall back to body font. /apply compiles both documents and visually inspects the rendered pages, applying targeted fixes until the layout is clean. This runs automatically on every application.ATS text-layer verification
An ATS reads the PDF’s embedded text layer, not the rendered page. LaTeX can produce PDFs where the text extracts as garbage: icon glyphs where the email should be, interleaved lines from multi-column layouts.
/apply runs pdftotext on the compiled CV and verifies contact details, reading order, and keyword coverage against what a parser actually sees.Relevance-weighted CV cutting
When a CV overflows two pages, content is not cut mechanically from the oldest section. Each candidate line is scored by relevance to the target posting, uniqueness in the document, and whether the cover letter depends on it. The lowest-scoring line is cut first, regardless of which section it sits in.
Drafter-reviewer separation
The drafter writes the application. A second Claude agent, spawned with a fresh context, researches the company and critiques the drafts. The drafter then revises. This catches missed keywords, weak framing, and generic language that a single pass routinely leaves in.
The six-step pipeline
# URL mode — Claude fetches the posting with WebFetch
/apply https://jobindex.dk/job/1234567
# Pasted text — used when the portal blocks automated access
/apply <paste the full job description here>
From the posting, Claude extracts: company name, role title, department (if mentioned), location, and language (Danish or English). The language is used in Step 2 to determine whether the cover letter should be written in Danish or English. These values are stored in context and reused throughout the workflow without re-reading.
The drafter reads your evaluation framework (
04-job-evaluation.md) and your structured candidate profile (01-candidate-profile.md), then scores the role across five dimensions:Weights are applied to produce an overall score: Technical Skills 30%, Experience Match 25%, Behavioral Fit 15%, Career Alignment 30%. Location is a pass/fail gate, not factored into the weighted average.
Results are presented as a salary index relative to the baseline defined in your data file. If the tool is not configured or returns an error, the salary step is skipped gracefully.
After presenting the evaluation, Claude asks whether you want to proceed. If you say no, the workflow stops here. No files are written until you confirm.
The evaluation framework thresholds are: Strong Fit (75+), Good Fit (60-74), Moderate Fit (45-59), Weak Fit (30-44), Poor Fit (below 30). A score below 50 triggers an explicit warning before drafting, since extensive reframing would be required.
03-writing-style.md — tone, critical rules (no em-dashes, no clichés, active voice), cover letter structure05-cv-templates.md — LaTeX moderncv/banking format, section ordering, profile statement templates, tailoring rules06-cover-letter-templates.md — cover.cls template structure, compile instructions, known pitfallsIt also reads one existing CV and one existing cover letter from
cv/ and cover_letters/ as concrete structural references.lualatexcover.cls template, compiled with xelatex"Dear Hiring Manager" (or its equivalent in the posting’s language)Both completed drafts are kept in context for Step 3. The reviewer receives them inline rather than re-reading the files, which avoids redundant file reads.
A second Claude agent is spawned with a fresh context. The reviewer receives both draft files inline, the full job posting text, and instructions to read four specific content files:
01-candidate-profile.md — to check factual accuracy of every claim02-behavioral-profile.md — to check whether the cover letter’s voice matches the candidate’s natural register (a “Collaborator” PI profile should not be given a solo-hero tone)03-writing-style.md — to check against the critical style rules04-job-evaluation.md — to check keyword and requirement coverageThe reviewer does not read the LaTeX template files (
05, 06) — those govern structural and LaTeX concerns the drafter already applied and are not relevant to content critique.[
{
"file": "cv/main_acme.tex",
"old_string": "Developed machine learning models for customer analytics",
"new_string": "Built and deployed scikit-learn churn prediction models serving 2M customer records",
"reason": "keyword match — posting requires 'scikit-learn' and 'production deployment'"
}
]
Each edit includes an
old_string that is unique in the file (enough surrounding context to match exactly once), a new_string, and a one-line rationale.03-writing-style.md and 02-behavioral-profile.mdThe reviewer operates under a hard honesty rule: every suggestion must be grounded in actual profile data. If a requirement is a genuine gap, the reviewer says so and suggests how to frame adjacent experience instead. It never suggests fabricating skills or experience.
The drafter applies the reviewer’s feedback without re-reading the draft files (they are still in context from Step 2).
Part A (structured edits): Applied directly with the Edit tool, one edit per JSON object. Any edit whose rationale would require fabricating content is skipped.
cd cv && lualatex -interaction=nonstopmode main_<company>.tex
cd ../cover_letters && xelatex -interaction=nonstopmode cover_<company>_<role>.tex
The CV uses
lualatex because pdflatex fails on modern MiKTeX with fontawesome5 font-expansion errors. The cover letter uses xelatex because cover.cls requires fontspec. If either compile fails, the error is fixed and the document is recompiled until clean.CV layout checklist
CV layout checklist
- Exactly 2 pages (not 1, not 3)
- No orphaned
\cventrytitles — a job or education title must never sit alone at the bottom of page 1 with its bullets on page 2. This is the most common failure. - No section headings isolated at the top of page 2 with only 1-2 lines below them
- No awkward whitespace gaps
Cover letter layout checklist
Cover letter layout checklist
- Exactly 1 page
- Signature block visible and not cut off or pushed to a second page
- Bullet list font matches surrounding body text (both should be Raleway-Medium)
\usepackage{needspace} to preamble and \needspace{5\baselineskip} before the problematic \cventry\enlargethispage{2-3\baselineskip} before a late section\lettercontent{} before the list; wrap list in {\raggedright\fontspec[...]{Raleway-Medium}\fontsize{11pt}{13pt}\selectfont \begin{itemize}...\end{itemize}\par}If it is missing, the mechanical parse check is skipped with a one-line warning and keyword coverage is checked visually against the PDF read. The rest of the workflow continues normally.
(cid:NNN) markers or \uFFFD replacement characters (garbled font embedding)MOBILE-ALT are harmless noise; the actual address must be present as printed text)/add-template are where this breaks)missing (have it) items are added to experience bullets and the compile loop reruns. missing (gap) items are left out. Keywords are never stuffed.After the final clean compile,
.aux, .log, and .out files are deleted. The .tex and .pdf files are kept.The verification checklist from
CLAUDE.md runs exactly once here, at the end of the workflow. The reviewer does not run it; the drafter runs it once on the final state of both files.Factual accuracy checks
Factual accuracy checks
- All claims match the actual profile — no fabricated skills, experience, or achievements
- Job titles, dates, company names, and locations are correct
- Contact details are correct
- All company-specific claims in the cover letter have been independently verified via WebFetch or WebSearch; claims that cannot be verified are rephrased in general terms or omitted
Targeting checks
Targeting checks
- Profile statement and opening paragraph are tailored to the specific role, not generic
- Skills and experience bullets are reframed to match job requirements
- Key job requirements are addressed; genuine gaps are acknowledged where relevant
- Nice-to-have requirements are highlighted where the profile matches them
Consistency checks
Consistency checks
- CV follows the standard 2-page moderncv/banking format
- Cover letter uses the
cover.clstemplate and established structure - Tone is consistent across both documents
- No contradictions between CV and cover letter content
Quality checks
Quality checks
- No LaTeX syntax errors (balanced braces, correct commands)
- No spelling or grammar errors
- Agentic coding or AI tooling references name Claude Code explicitly
- Cover letter is addressed to the correct person or
"Dear Hiring Manager"where no name is available - Cover letter fits on exactly one page
After the checklist, Claude presents a summary of 3-5 key tailoring decisions made during the workflow: what was emphasized and why, which company-specific angles were incorporated based on the reviewer’s research, the most impactful reviewer suggestions, and any gaps that were acknowledged or reframed.