# Where Is the Candidate Profile Stored in the AI Job Search Framework?

> Discover where the candidate profile is stored in the AI Job Search framework. Learn it's a single Markdown file at the repository root.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: architecture
- Published: 2026-08-30

---

**The candidate profile in the AI Job Search framework is stored in a single Markdown file named [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) rather than maintaining duplicate data stores.

## The CLAUDE.md File: Primary Storage Location

The [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) using standard filesystem operations. The profile path is typically resolved relative to the script location.

```python
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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md):

```bash

# 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) to populate personalized fields:

```jinja
% 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/verify_pdf.py)

## Summary

- **Primary location**: [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) at repository root
- **Design pattern**: Thin-pointer architecture separating data from skill logic
- **Population method**: `/setup` script with `sed`-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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/verify_pdf.py) indirectly validate profile integration by checking generated outputs, but explicit schema enforcement is not present in the base framework.