Where Is the Candidate Profile Stored in the AI Job Search Framework?
The candidate profile in the AI Job Search framework is stored in a single Markdown file named CLAUDE.md at the repository root, which serves as the canonical source for all AI-driven job application workflows.
All personal and professional data—identity, education, experience, skills, certifications, and target sectors—lives in this central file. Downstream components like CV generators, cover-letter tools, and job-fit evaluators read from CLAUDE.md rather than maintaining duplicate data stores.
The CLAUDE.md File: Primary Storage Location
The CLAUDE.md file sits at the repository root and follows a structured Markdown format with clearly delineated sections. According to the MadsLorentzen/ai-job-search source code, this file is auto-populated during initial setup via the /setup script, which replaces placeholder tokens with actual candidate values.
Profile Sections in CLAUDE.md
- Identity — name, location, contact details
- Education — degrees, institutions, dates
- Professional Experience — work history with achievements
- Technical Skills — programming languages, tools, frameworks
- Certifications — credentials and validity periods
- Behavioral Profile — personality traits, communication style
- Target Sectors — preferred industries and roles
Thin-Pointer Design: Separation of Data and Logic
The framework implements a thin-pointer design pattern: CLAUDE.md holds the actual candidate profile data, while the AI skill definitions and workflow logic reside in the hidden .claude/ directory.
Key Locations
| Path | Purpose |
|---|---|
CLAUDE.md |
Canonical profile storage |
.claude/skills/job-application-assistant/ |
Skill definitions that consume profile data |
This separation ensures that skills and tools reference a single source of truth without embedding data directly into prompt templates or scripts.
How Components Access the Candidate Profile
Python: Loading the Profile Programmatically
Agents and utility scripts load CLAUDE.md using standard filesystem operations. The profile path is typically resolved relative to the script location.
import pathlib
def load_candidate_profile() -> str:
"""Read the raw Markdown profile from CLAUDE.md."""
profile_path = pathlib.Path(__file__).resolve().parents[1] / "CLAUDE.md"
return profile_path.read_text(encoding="utf-8")
candidate_md = load_candidate_profile()
print(candidate_md.split("## Candidate Profile")[1][:300]) # preview first 300 chars
Shell: Setup Script Placeholder Substitution
The /setup script uses sed to inject candidate-specific values into CLAUDE.md:
# Replace [YOUR_NAME] and other placeholders with actual values
sed -i "s/\[YOUR_NAME\]/John Doe/g" CLAUDE.md
sed -i "s/\[YOUR_CITY\]/Copenhagen/g" CLAUDE.md
# ...additional placeholder substitutions...
Template Engines: Injecting Profile Data
LaTeX CV generators and other templating tools parse CLAUDE.md to populate personalized fields:
% In a LaTeX CV template
\name{{ name_from_profile }}
\address{{ location_from_profile }}
\email{{ email_from_profile }}
Why Centralized Storage Matters
Centralizing the candidate profile in CLAUDE.md eliminates synchronization issues across the AI Job Search workflow. When a candidate updates their experience or adds a certification, changing one file propagates to:
- CV generation pipelines
- Cover-letter drafting agents
- Job-fit evaluation skills in
.claude/skills/job-application-assistant/ - Verification tools like
tools/verify_pdf.py
Summary
- Primary location:
CLAUDE.mdat repository root - Design pattern: Thin-pointer architecture separating data from skill logic
- Population method:
/setupscript withsed-based placeholder replacement - Consumer pattern: File-based reads across Python, shell, and template engines
- Key benefit: Single source of truth for all AI-driven job application workflows
Frequently Asked Questions
What happens if I edit CLAUDE.md directly?
Direct edits to CLAUDE.md take immediate effect. All downstream components read the file at runtime, so no rebuild or recompilation is required. Maintain valid Markdown structure to ensure parsers correctly extract section data.
Can I store multiple candidate profiles in the same repository?
The framework assumes one profile per repository instance. To manage multiple candidates, maintain separate repository clones or branch-based profiles, though this is not explicitly supported by the /setup workflow.
Where are the AI prompts that use my profile data?
Prompt templates and skill definitions live in .claude/skills/job-application-assistant/ and related subdirectories. These files reference CLAUDE.md symbolically rather than embedding profile content directly, enabling dynamic personalization without prompt duplication.
Is there a schema validation for CLAUDE.md?
The current implementation relies on convention-based section headers (e.g., ## Education, ## Technical Skills). Tools like tools/verify_pdf.py indirectly validate profile integration by checking generated outputs, but explicit schema enforcement is not present in the base framework.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →