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

> Discover where candidate profile information is stored in the AI-job-search framework. Learn how markdown files CLAUDE.md and 01-candidate-profile.md manage master and machine-readable data.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: internals
- Published: 2026-07-20

---

**The candidate profile information is stored in two synchronized markdown files: [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) at the repository root contains the human-readable master record, while [`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md) provides the structured, machine-readable source that all runtime commands consume.**

The `MadsLorentzen/ai-job-search` framework implements a **thin-pointer design** that maintains a single source of truth for candidate data. Rather than scattering profile details across multiple databases or configuration files, the framework centralizes all biographical, educational, and professional information in two specific markdown locations that runtime agents reference exclusively.

## The Dual-File Storage Architecture

The framework maintains candidate profile information stored across two distinct files that serve different consumption patterns. This design separates human editing workflows from programmatic access while ensuring consistency through automated synchronization.

### CLAUDE.md: The Human-Readable Master

The primary source for candidate profile information stored in the repository is **[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)**, located at the repository root. This file contains the complete, human-readable profile including the candidate's biography, contact details, education history, professional experience, and overarching career goals. It serves as the canonical reference that users edit directly when updating their background information.

### 01-candidate-profile.md: The Machine-Readable Structured Source

To enable programmatic access by the framework's command suite, the same candidate profile information stored in [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) is duplicated in **[`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md)**. This file organizes the data into explicit, parseable sections including Identity, Education, Professional Experience, Projects, Technical Skills, Publications, Awards, and References. Commands such as `/apply`, `/interview`, and `/setup` read directly from this structured location.

## How the Setup Command Synchronizes Profile Data

The **`/setup`** command, defined in [`.claude/commands/setup.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/setup.md), maintains synchronization between the two storage locations. When executed, this command parses raw documents from the `documents/` directory, merges new content with existing data, and writes the canonical structured version to [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md).

The framework never writes candidate facts to alternative locations. By design, the `/setup` command preserves existing data unless explicit confirmation is provided, ensuring that programmatic updates do not inadvertently overwrite carefully curated human edits.

## Accessing Candidate Profile Information Programmatically

You can interact with the stored profile using both the framework's CLI and custom scripts. The following examples demonstrate how to locate and read the candidate profile information stored in the framework.

To regenerate the structured profile from the human-readable master:

```bash

# Run the setup command to (re)populate the structured profile

$ ai-job-search /setup

# The command reads CLAUDE.md and writes/updates:

# .claude/skills/job-application-assistant/01-candidate-profile.md

```

To read the structured profile in Python:

```python

# Example: a custom script that reads the structured profile

from pathlib import Path

profile_path = Path('.claude/skills/job-application-assistant/01-candidate-profile.md')
with profile_path.open() as f:
    profile_md = f.read()

print("Candidate name:", profile_md.splitlines()[0])

```

To view the raw human-readable profile directly:

```bash

# Show the raw candidate profile (human-readable) directly from the repo

$ cat CLAUDE.md

```

The structured profile follows a machine-friendly markdown format:

```yaml

# Example snippet from 01-candidate-profile.md (machine-friendly)

---
Identity:
  Name: Jane Doe
  Email: jane@example.com
Education:
  - MSc Computer Science, University X (2020)
Professional Experience:
  - Software Engineer, Acme Corp (2020-2022)
Technical Skills:
  - Python, Rust, Docker, AWS
...

```

## Summary

- **Candidate profile information is stored** in two locations: [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) (human-readable) and [`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md) (machine-readable).
- **[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)** serves as the single source of truth for human editing, containing the complete biography, contact details, and career history.
- **[`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md)** provides the structured interface that all framework commands consume, organized into explicit sections like Identity, Education, and Technical Skills.
- The **`/setup`** command synchronizes these files by parsing `documents/` and [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md), then writing the merged output to the structured profile without overwriting existing data unless confirmed.
- Runtime agents never store candidate data elsewhere; all generated outputs (CVs, cover letters) must reference these two files.

## Frequently Asked Questions

### What is the primary file for candidate profile information?

The primary file is **[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)** at the repository root. This human-readable markdown file contains the complete candidate biography, contact information, education, experience, and career goals. It represents the canonical source that the framework's synchronization tools reference when updating the structured derivative.

### How do I update my candidate profile in the framework?

Update the **[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)** file directly with your new information, then run the **`/setup`** command. This command parses the updated master file along with any documents in the `documents/` directory, merges the changes, and writes the updated structured version to [`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md) without overwriting existing data unless you confirm the action.

### Why does the framework store the same profile in two different files?

The framework uses a **dual-file architecture** to separate concerns: [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) optimizes for human readability and editing, while [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) provides a machine-friendly structure with explicit sections that the `/apply`, `/interview`, and other commands can parse reliably. The `/setup` command ensures these remain synchronized, maintaining a thin-pointer design where runtime agents always reference the same source of truth.

### Which commands read from the structured candidate profile?

Commands including **`/setup`**, **`/apply`**, and **`/interview`** read directly from [`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md). According to the `MadsLorentzen/ai-job-search` source code, these commands consume the structured profile when evaluating job postings, generating application materials, or preparing interview responses, ensuring they reference the most current candidate data.