# How the `/expand` Command Enriches a Candidate Profile from Public Sources

> Discover how the /expand command enriches candidate profiles by automatically scanning internal documents and public online sources like GitHub and LinkedIn for skills and signals.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: how-to-guide
- Published: 2026-08-05

---

**The `/expand` command automatically augments a candidate's profile by scanning internal documents and public online sources—GitHub, LinkedIn, portfolio sites, and more—to extract technical skills, domain knowledge, and behavioral signals using both direct web lookups and AI-driven inference.**

The `/expand` command in the MadsLorentzen/ai-job-search repository is a specialized competency-enrichment tool designed to surface hidden capabilities from scattered sources. As implemented in this open-source job-search automation framework, it transforms raw experience data into structured, searchable skill entries that power downstream job matching and application generation.

## How `/expand` Discovers and Processes Experience Items

The enrichment process follows a fixed discovery order defined in [`.claude/commands/expand.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/expand.md). The command scans multiple source directories and public URLs, applying two complementary analysis approaches to each item it finds.

### Internal Document Sources

- `documents/cv/` — Courses, certifications, job-responsibility bullets, projects, volunteer work
- `documents/linkedin/` — Licenses, skills, projects, endorsements
- `documents/diplomas/` — Transcript courses, thesis titles, specializations
- `documents/references/` — Competency language used by referees

### Public Online Sources

- **GitHub profile** — Discovered from the username or URL in the CV; reads pinned and unpinned repository READMEs to capture repository name, description, primary languages, topics, and mentioned frameworks
- **Other URLs** — Portfolio sites, Kaggle profiles, Google Scholar pages, and similar public pages are fetched and parsed for tools, datasets, awards, or skill mentions

## The Two-Step Web Enrichment Methodology

For every discovered experience item, `/expand` applies both direct and inferred analysis to maximize competency coverage.

### Approach A: Direct Lookup

The command searches explicit documentation using targeted queries like `"[Course name] syllabus"` or `"[Certification] exam topics"`. The most relevant page is fetched and its competency list is extracted directly.

### Approach B: Inferred Competencies

Independently, the system reasons about the problem domain, required methods, and standard toolchains based on the item's description—regardless of whether official documentation was found.

Results from both approaches are merged, with source attribution preserved.

## Building and Reviewing the Competency Map

Extracted competencies are organized into five **deduplicated categories**:

1. **Technical Skills** (Primary & Secondary)
2. **Domain Knowledge**
3. **Methods & Practices**
4. **Soft / Behavioral signals**

Each entry records the competence name, its source (e.g., "GitHub — ai-search-tool"), and whether it came from direct lookup, inference, or both. Duplicates already present 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) or [`.claude/skills/job-application-assistant/02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/02-behavioral-profile.md) are automatically removed.

### Example Console Output

```bash

# Run the expand command after completing /setup

$ ai-job-search /expand

```

```

## /expand found 12 new competency signals across 4 sources

**COURSES & CERTIFICATIONS**
Source: Coursera — Deep Learning Specialisation
  + Neural network fundamentals
  + Convolutional neural networks
  + Sequence models

**GITHUB — ai-search-tool**
Source: README + inferred from tech stack
  + Python 3.10
  + FastAPI
  + Elasticsearch
  + Unit testing with pytest

**JOB RESPONSIBILITIES — Acme Corp, Data Engineer**
Source: CV bullets + direct tool lookup
  + ETL pipeline design (Airflow)
  + Data modelling (Snowflake)

**BEHAVIORAL SIGNALS**
Source: Reference letter — Dr. Jane Smith
  + Strong collaboration
  + Proactive problem-solving

> How would you like to proceed?
> - `all` — Add everything above to your profile
> - `review` — Walk through each source group
> - `skip` — Cancel without writing anything

```

## Writing Confirmed Additions Back to Profile Files

Confirmed items are appended only to the appropriate profile file:

- Technical entries → [`.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)
- Behavioral entries → [`.claude/skills/job-application-assistant/02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/02-behavioral-profile.md)

Each addition includes source annotations (e.g., `*(GitHub — my-project)*`), making subsequent `/expand` runs **idempotent**—already-recorded competencies are skipped on future executions.

After writing, a final report lists:
- All added competencies
- Sources processed
- Any skipped sources

## Key Files Supporting Profile Enrichment from Public Sources

| File | Purpose |
|------|---------|
| [`.claude/commands/expand.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/expand.md) | Full command specification and workflow documentation |
| [`.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) | Stores technical skills, domain knowledge, methods |
| [`.claude/skills/job-application-assistant/02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/02-behavioral-profile.md) | Stores soft-skill and behavioral signals |
| `documents/` | Source materials (CV, LinkedIn exports, diplomas, references) |

## Summary

- **`/expand`** enriches candidate profiles by systematically scanning internal documents and public web sources in a fixed discovery order
- **GitHub profiles** are automatically parsed from CV references, extracting languages, topics, and frameworks from repository READMEs
- **Dual enrichment approach** combines direct documentation lookup with AI inference for maximum competency coverage
- **Five-category structure** organizes technical skills, domain knowledge, methods, and behavioral signals with full source attribution
- **Idempotent writes** with user-controlled review (`all` | `review` | `skip`) ensure profile quality and prevent duplication

## Frequently Asked Questions

### What public sources does `/expand` actually fetch from?

According to the ai-job-search source code in [`.claude/commands/expand.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/expand.md), `/expand` fetches from any URL found in the candidate's CV or profile files. This explicitly includes GitHub profiles (parsed for repository data), portfolio sites, Kaggle, Google Scholar, and other professional URLs. The GitHub integration is automatic when a username or URL is detected—it reads both pinned and unpinned repository READMEs.

### How does `/expand` avoid adding duplicate competencies?

The command maintains idempotency by checking existing entries in [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) and [`02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/02-behavioral-profile.md) before writing. Each competency is stored with its source annotation, and duplicates are filtered during the deduplication step. This design allows candidates to run `/expand` repeatedly as their experience grows without manual cleanup.

### Can I review what `/expand` finds before it writes to my profile?

Yes—the command presents a formatted summary of all discovered competencies grouped by source type (courses, GitHub, job responsibilities, behavioral signals). You can choose `all` to accept everything, `review` to walk through each source group individually, or `skip` to cancel without any changes. This three-option prompt ensures full human oversight of profile modifications.

### What happens if a course or certification has no public syllabus?

`/expand` uses **Approach B—inferred competencies** as a fallback. Even without direct documentation, it reasons about the problem domain, required methods, and standard toolchains based on the item's description. This ensures competencies are captured from internal documents and niche experiences even when public sources are sparse.