How vijaydr29/ai-job-search-to works
1. This repository is an AI-assisted job application workflow, not a conventional app. The orchestration layer lives in Claude Code: user-facing slash commands under .claude/commands/ drive the main flows, and reusable skill content under .claude/skills/ stores the rules, prompts, and structured profile data Claude uses.
2. The core domain model is the candidate profile. It is persisted primarily in CLAUDE.md plus the structured skill files in .claude/skills/job-application-assistant/:
- candidate profile and experience
- behavioral/writing style preferences
- job evaluation rubric
- CV and cover-letter templates
- interview preparation content
These files are the authoritative source for tailoring all outputs.
3. The main workflow boundary is split into four user actions: /setup, /scrape, /apply, and /expand, with /upskill as a planning/reporting extension and /reset as cleanup. /setup establishes the profile; /scrape searches jobs; /apply generates a tailored application; /expand enriches the profile from public sources; /upskill computes skill gaps and learning plans.
4. Job discovery is implemented as separate portal-specific CLI tools in .agents/skills/. There are four independent Danish-market integrations: Jobbank, Jobdanmark, Jobindex, and Jobnet. Each has its own cli/ package with TypeScript source, helpers, tests, and a Bun-based runtime. This makes portal scraping an isolated subsystem rather than embedded in the Claude prompts.
5. The job search flow is: Claude’s /scrape command delegates to those portal CLIs, collects postings, deduplicates them, and ranks them by fit using the profile and evaluation criteria. The output is a shortlist of matches for the user to pick from, and those job records can feed directly into /apply or be tracked for /upskill.
6. The application generation flow is a drafter-reviewer pipeline. /apply takes either a job URL or pasted description, parses it, scores fit, drafts tailored materials, then spawns a second reviewer agent that critiques the application from a fresh context. The drafter revises based on that feedback, so the architecture intentionally separates creation from review.
7. A major technical boundary is document production. The CV and cover letter are generated as LaTeX, not plain text:
- cv/ contains the CV template, based on moderncv
- cover_letters/ contains a custom cover.cls and bundled fonts
The workflow compiles PDFs and inspects the rendered output, so layout correctness is part of the system design, not an afterthought.
8. The PDF verification loop is central to the repo’s architecture. The system recompiles until the CV is exactly two pages and the cover letter exactly one page, checking for layout issues like orphaned headings, font mismatches, and overflow. This means the output layer is a real feedback loop between generated LaTeX and rendered PDFs.
9. Several filesystem areas act as stateful inputs/outputs for the workflows:
- documents/ holds source material for onboarding and enrichment
- job_scraper/ stores scraper state such as seen jobs
- job_search_tracker.csv tracks applications
- upskill/ stores learning-plan reports
- salary_lookup.py and tools/ support optional compensation benchmarking
These are not runtime services; they are persistent working directories and artifacts.
10. The repository has a clear separation between framework rules and user-specific content. Framework behavior lives in command files, skill definitions, and setup instructions. User-specific career data is meant to be filled into CLAUDE.md, the skill markdown files, and the documents/ folder, which keeps the system portable across candidates.
11. External dependencies materially shape the architecture: Claude Code provides the agent runtime and command surface, Bun runs the Danish job-search CLIs, Python supports salary conversion/lookup tooling, and LaTeX with lualatex/xelatex is required for final document generation. The job portal integrations and salary data are intentionally pluggable rather than hard-coded to one provider.
12. Overall, the system is best diagrammed as an agent-driven pipeline with three layers: profile knowledge, job discovery, and application production. Profile data feeds both search ranking and application tailoring; job postings flow from portal CLIs into evaluation and drafting; final artifacts flow out as PDFs, tracked applications, and optional salary or upskilling reports.
Main entry points: apply.md apply pipeline · SKILL.md job shortlist · expand.md scrape · CLAUDE.md candidate profile
Components 27
Claude Code Orchestration
User-facing commands and reusable skill prompts that drive the workflow.
- setup · Initializes the candidate profile and workspace.
.claude/commands/setup.md - scrape · Searches jobs through portal integrations and ranks matches.
.claude/commands/expand.md - apply · Generates tailored application materials for a selected job.
.claude/commands/apply.md - expand · Enriches the profile from public sources and documents.
.claude/commands/expand.md - upskill · Computes skill gaps and learning-plan reports.
.claude/skills/upskill/SKILL.md - reset · Clears workflow state and tracked artifacts.
.claude/commands/reset.md
Candidate Knowledge
Authoritative profile data and tailoring rules used across search and application steps.
- candidate profile · Primary candidate facts, experience, and positioning data.
CLAUDE.md - behavioral profile · Writing and behavioral preferences used to shape output.
.claude/skills/job-application-assistant/02-behavioral-profile.md - writing style · Style constraints for generated application text.
.claude/skills/job-application-assistant/03-writing-style.md - job rubric · Fit criteria used to rank jobs and score applications.
.claude/skills/job-application-assistant/04-job-evaluation.md - CV templates · ModernCV-based resume templates and layout rules.
.claude/skills/job-application-assistant/05-cv-templates.md - cover templates · Cover-letter templates and class conventions.
.claude/skills/job-application-assistant/06-cover-letter-templates.md - interview prep · Interview preparation content derived from the profile.
.claude/skills/job-application-assistant/07-interview-prep.md
Job Discovery
Portal-specific scrapers and the shortlist/ranking flow for job matching.
- job shortlist · Deduplicates and ranks discovered jobs by profile fit.
.claude/skills/job-scraper/SKILL.md - Jobbank CLI · Bun-based integration for Jobbank postings.
.agents/skills/jobbank-search/cli/src/cli.ts - Jobdanmark CLI · Bun-based integration for Jobdanmark postings.
.agents/skills/jobdanmark-search/cli/src/cli.ts - Jobindex CLI · Bun-based integration for Jobindex postings.
.agents/skills/jobindex-search/cli/src/cli.ts - Jobnet CLI · Bun-based integration for Jobnet postings.
.agents/skills/jobnet-search/cli/src/cli.ts
Application Production
Draft-review-generation pipeline and PDF verification for CVs and cover letters.
- apply pipeline · Parses jobs, scores fit, drafts, reviews, and revises applications.
.claude/commands/apply.md - PDF loop · Rebuilds documents until page counts and layout constraints are correct.
cv/main_example.tex - CV build · Generates the final CV PDF from LaTeX.
cv/main_example.tex - cover build · Generates the final cover letter PDF from LaTeX.
cover_letters/cover.cls
Working State
Persistent inputs, outputs, and operational artifacts used by the workflows.
- documents · Source material for onboarding, enrichment, and generated artifacts.
documents/README.md - scraper state · Seen-job and scraper working state.
job_scraper/.gitkeep - application tracker · Tracks submitted and planned applications.
job_search_tracker.csv - upskill reports · Stores skill-gap and learning-plan outputs.
upskill/.gitkeep - salary tools · Optional compensation lookup and conversion support.
salary_lookup.py
Connections 31
- setup → candidate profile: establishes · Creates the authoritative candidate profile.
- setup → documents: fills · Seeds onboarding and source documents.
- scrape → Jobbank CLI: delegates · Queries one portal integration.
- scrape → Jobdanmark CLI: delegates · Queries one portal integration.
- scrape → Jobindex CLI: delegates · Queries one portal integration.
- scrape → Jobnet CLI: delegates · Queries one portal integration.
- Jobbank CLI → job shortlist: emits · Contributes job records for deduping and ranking.
- Jobdanmark CLI → job shortlist: emits · Contributes job records for deduping and ranking.
- Jobindex CLI → job shortlist: emits · Contributes job records for deduping and ranking.
- Jobnet CLI → job shortlist: emits · Contributes job records for deduping and ranking.
- candidate profile → job shortlist: scores · Provides fit context for ranking.
- job rubric → job shortlist: ranks · Supplies the rubric for shortlist ordering.
- apply → apply pipeline: invokes · Starts application generation.
- apply pipeline → candidate profile: tailors from · Uses candidate facts and experience.
- apply pipeline → writing style: constrains · Applies voice and style preferences.
- apply pipeline → behavioral profile: constrains · Applies behavioral preferences.
- apply pipeline → job rubric: scores · Evaluates job fit before drafting.
- apply pipeline → CV templates: renders · Builds CV content in template form.
- apply pipeline → cover templates: renders · Builds cover-letter content in template form.
- apply pipeline → PDF loop: verifies · Checks layout and page-count constraints.
- PDF loop → CV build: produces · Iterates until CV is exactly two pages.
- PDF loop → cover build: produces · Iterates until cover letter is exactly one page.
- apply pipeline → application tracker: records · Adds application tracking metadata.
- expand → documents: enriches · Pulls in public-source material.
- upskill → upskill reports: writes · Outputs learning-plan reports.
- reset → scraper state: clears · Resets scraper working state.
- reset → application tracker: clears · Clears tracked application records.
- salary tools → job rubric: supports · Optional compensation context can inform decisions.
- salary tools → apply pipeline: supports · Optional salary benchmarking can inform targeting.
- interview prep → apply pipeline: prepares · Feeds interview-focused follow-up content.
- candidate profile → interview prep: feeds · Supplies interview prep material.