| name | apply-job |
| description | Generate tailored CV and cover letter for job applications. Use when user says /apply, asks to write a cover letter, wants to apply to a job posting, needs help with job applications, or provides a job URL. Orchestrates job analysis, company research, and document generation following Swiss formal style rules. |
| degree-of-freedom | low |
| allowed-tools | Read, Write, Edit, mcp__mcp-server-firecrawl__* |
@.claude/skills/apply-job/references/job-types.md
Apply Job Skill
Generate tailored, human-like cover letters and CV recommendations for job applications.
How This Skill Works
This skill uses lazy loading to minimize context usage. Context files are loaded only when needed.
Workflow:
- Analyze job & classify → 2. Clarify with user → 3. Research company → 4. Generate content → 5. Validate quality → 6. Create output
Context Loading Points:
- Startup:
job-types.md only (~800 tokens)
- After classification:
profile-essential.md (~2,000 tokens)
- After clarification:
writing-rules.md (~1,500 tokens)
- If Swiss company:
swiss-market-rules.md (~600 tokens)
Skill Interface
Invocation: /apply [job-url-or-description]
Inputs:
- Job URL (scraped via Firecrawl MCP)
- OR pasted job description
- User responses to clarification questions
Outputs (Generated by Claude - ALL MANDATORY):
job-description.md - Scraped job posting
cover-letter.md - Tailored cover letter
cover-letter.html - HTML version
cover-letter.pdf - MANDATORY PDF (max 2 pages, print-ready)
cv-{variant}.html - MANDATORY Copy of CV variant
cv-{variant}.pdf - MANDATORY CV PDF (max 2 pages)
application-email.md - Application email draft
Step 1: Analyze Job & Classify
Get the job description:
- If URL provided: Scrape with Firecrawl MCP
- If pasted: Parse key requirements
Classify job type by scanning for keywords (see job-types.md for details):
| Type | Keywords | CV Variant |
|---|
| A: Digital Health | health, medical, wearable, clinical | cv-simon-yang-digital-health.html |
| B: AI/ML | AI, ML, data science, analytics | cv-simon-yang-ai-product.html |
| C: GenAI/DevTools | GenAI, LLM, developer, automation | cv-simon-yang-genai-tools.html |
| D: ESG/Climate | ESG, climate, risk, sustainability | cv-simon-yang-reprisk.html |
Gate 1 Check:
After Gate 1 passes, load: references/profile-essential.md
Step 2: Clarify with User
Ask these questions before generating:
- "I've classified this as [Type X]. Is that correct?"
- "What 2-3 aspects of this role interest you most?"
- "Any specific achievement you want to emphasize?"
- "Company tone: startup casual, corporate formal, or Swiss formal?"
- "Any gaps or concerns to address proactively?"
Wait for user responses before proceeding.
After clarification, load: references/writing-rules.md
Step 3: Research Company
Use Firecrawl MCP to scrape:
- Company website (About, Products, Team pages)
- Recent news (search: "{company} funding 2024 2025")
Extract:
- What they build (products, services)
- Who they serve (customers, users)
- Recent news (funding, launches)
- Cultural signals
Gate 2 Check:
If Swiss company detected, load: references/swiss-market-rules.md
Step 4: Generate Content
Cover Letter
Structure (3-4 paragraphs, no headers):
Opening (50-70 words):
- Company-specific hook (NOT "I am writing to apply")
- Why this company interests you
- Your positioning
Body (200-280 words):
- 2-3 evidence paragraphs
- Each: Claim → Evidence → Result
- Include 2+ quantified achievements
- Include 3+ company-specific details
Closing (50-70 words):
- Confident (no "grateful")
- "I look forward to discussing..."
Total: 350-450 words
Style Rules (Non-Negotiable)
- NO em-dashes (use periods, commas instead)
- NO subjunctive ("would", "could", "might")
- Active voice 90%+
- Sentences: 10-20 words average
- Tone: Swiss formal, professional, neutral
Vocabulary
Never use: "passionate about", "excited to apply", "unique opportunity", "I would be grateful", "thrilled", "humbled"
Prefer: "I built", "I led", "resulting in", "measured by", "I look forward to"
For full rules, see references/writing-rules.md.
Step 5: Validate (Gate 3)
Self-check before presenting:
Content Checks
Style Checks
Metrics Verification
For each numeric claim:
- Extract all metrics (patterns: X%, Xx, CHF X, X+)
- Cross-reference against Metrics Bank in
profile-essential.md
- Mark VERIFIED or UNVERIFIED
If validation fails: Self-correct (max 2 iterations), then present with warning.
Quality Report (Collapsed)
Present to user:
Quality: PASSED ✓ (12/12 checks)
Word count: 412 | Company-specific: Yes | Metrics verified
[Show details]
Step 6: Create Output (Gate 4)
Create application folder with ALL files:
docs/applications/{company}/
├── job-description.md
├── cover-letter.md
├── cover-letter.html
├── cover-letter.pdf ← MANDATORY
├── cv-{variant}.html ← MANDATORY (copy from variants/)
├── cv-{variant}.pdf ← MANDATORY
└── application-email.md
PDF Generation (MANDATORY - DO NOT SKIP)
Cover Letter PDF:
await page.pdf({
path: 'cover-letter.pdf',
format: 'A4',
printBackground: true,
margin: { top: 0, right: 0, bottom: 0, left: 0 }
});
CV Copy + PDF:
- Copy CV variant from
docs/profile/variants/cv-simon-yang-{variant}.html
- Generate PDF with same Puppeteer settings
- Both files go in application folder
Visual Verification (MANDATORY)
Take screenshot of cover-letter.html and verify:
Gate 4 Check:
Cover letter HTML: Use template from docs/applications/_templates/cover-letter-template.html
Application email: Brief, Swiss formal, reference role and materials.
Metrics Bank (Quick Reference)
Use 2-3 metrics per cover letter. Full details in profile-essential.md.
| Metric | Value | Use For |
|---|
| D30 Retention | 37% vs 8% | Product, analytics |
| Retention Lift | 125% | Data-driven decisions |
| Detection Rate | 3x | Medical, preventive |
| Series A | CHF 11.5M | Executive, fundraising |
| Team Growth | 1 to 8 | Leadership |
| Solo Apps | 5 production | Technical, GenAI |
Reference Files
| File | When Loaded | Tokens |
|---|
references/job-types.md | Startup (@ import) | ~800 |
references/profile-essential.md | After classification | ~2,000 |
references/writing-rules.md | After clarification | ~1,500 |
references/swiss-market-rules.md | If Swiss company | ~600 |
references/quality-rules.md | During validation | ~800 |
For full context loading order, see workflows/context-loading.md.
Example Invocation
User: /apply https://jobs.example.com/product-manager-ai
Claude: I'll analyze this job description.
[Scrapes JD]
I've classified this as **Type B: AI/ML Product Management**. Is that correct?
[Loads profile-essential.md]
What 2-3 aspects of this role interest you most?
Any specific achievement you want to emphasize?
Company tone: startup casual, corporate formal, or Swiss formal?
Any gaps to address?
[User responds]
[Loads writing-rules.md]
[Researches company, generates cover letter]
Here's your tailored cover letter:
[Cover letter text]
Quality: PASSED ✓ (12/12 checks)
Word count: 412 | Company-specific: Yes | Metrics verified
I recommend using **cv-simon-yang-ai-product.html** for this application.
Shall I create the application folder and save the files?
Success Criteria
- Efficient context - Startup load <1,000 tokens
- Correct classification - Job type matches JD keywords
- Company research - Extracts 3+ specific details
- Quality output - Passes all 12 validation checks
- Human-like writing - No AI tells, reads naturally
- Complete deliverables - ALL 7 files created:
- job-description.md
- cover-letter.md
- cover-letter.html
- cover-letter.pdf (MANDATORY)
- cv-{variant}.html (MANDATORY)
- cv-{variant}.pdf (MANDATORY)
- application-email.md
- Visual verification - Screenshot confirms print-ready quality