How Candidate Profile Enrichment Works in AI-Job-Search: GitHub, Portfolios & Course Syllabi
The /expand command enriches candidate profiles by harvesting hidden competencies from GitHub repositories, course syllabi, and external portfolios through a six-step pipeline that ensures additive-only updates with full traceability.
Candidate profile enrichment transforms implicit experience into explicit, searchable skills within the MadsLorentzen/ai-job-search repository. By analyzing public code repositories, official learning outcomes, and linked professional portfolios, the system captures technical competencies that traditional CVs often omit. This process operates through a strict, repeatable pipeline defined in .claude/commands/expand.md.
The /expand Command Architecture
The enrichment workflow follows a six-step pipeline that guarantees no duplicate entries and maintains complete source attribution. Each step is implemented as a discrete phase in the command specification.
Step 0 – Load Existing Profile
Before harvesting new data, the system reads 01-candidate-profile.md and 02-behavioral-profile.md to establish a baseline. This prevents duplicate entries and ensures all additions are strictly additive. The command references these files located in .claude/skills/job-application-assistant/ to understand the current competency landscape.
Step 1 – Discovery and Scanning
The discovery phase operates through multiple parallel streams to capture comprehensive candidate data.
Local Document Parsing (1a-d)
The command first scans local documents including CVs, LinkedIn exports, diplomas, and reference letters. It extracts courses, certifications, projects, responsibilities, and volunteer work to build an initial competency foundation.
GitHub Portfolio Analysis (1e)
When a GitHub URL or username is present in the profile, the system executes a deep repository scan. As specified in expand.md Step 1e, the command:
- Retrieves the public profile and pinned repositories
- Fetches the README of each repository to extract name, description, languages, topics, and frameworks
- Optionally lists all repositories to capture unpinned work
This process exposes concrete artifacts and tech stacks that candidates may not explicitly list in their CVs.
External URL Processing (1f)
For additional URLs such as personal portfolio sites, Kaggle profiles, or Google Scholar pages, the command fetches each page and extracts tools, datasets, awards, or skills. This captures professional activity outside of version control systems.
Step 2 – Web Enrichment Strategies
For each discovered item from Step 1, the system applies two parallel approaches defined in expand.md Step 2:
- Approach A (Direct lookup): Searches the web for official syllabi or certification guides using queries like
"[Course name] [Provider] syllabus learning outcomes" - Approach B (Inferred competencies): Applies reasoning to descriptions to capture domain knowledge, standard tool-chains, and methods
These approaches run simultaneously to maximize coverage while maintaining accuracy.
Step 3 – Competency Map Construction
The system deduplicates and categorizes findings into a structured competency map. Each entry is classified into one of five categories: Technical Primary, Technical Secondary, Domain Knowledge, Methods & Practices, or Soft/Behavioral.
Every competency stores three critical metadata fields:
- Competency name
- Source item (e.g., "Coursera – Deep Learning Specialisation")
- Origin flag (A, B, or both)
Steps 4-6 – Confirmation and Persistence
The pipeline concludes with human-in-the-loop verification:
- Step 4 (Present grouped summary): Displays a markdown report of new competencies grouped by source, requesting confirmation via
all,review,skip, or custom selections - Step 5 (Write confirmed additions): Appends selected competencies to
01-candidate-profile.mdor02-behavioral-profile.mdwith source annotations (e.g., (GitHub — my-repo)) - Step 6 (Summary report): Prints a completion report listing additions, skips, and manual review items
Technical Implementation Details
The enrichment logic relies on specific fetching and parsing mechanisms for external data sources.
Fetching GitHub Repository Data
The system interacts with the GitHub API to retrieve repository metadata and content. Below is a Python implementation matching the logic found in the /expand workflow:
import requests
from urllib.parse import urljoin
def fetch_readme(username: str, repo: str) -> str:
"""Return the raw README markdown for a public repo."""
api_url = f"https://api.github.com/repos/{username}/{repo}/readme"
headers = {"Accept": "application/vnd.github.v3.raw"}
resp = requests.get(api_url, headers=headers, timeout=10)
resp.raise_for_status()
return resp.text
This function uses the public GitHub API (no authentication required for public repositories) to fetch raw README content. The returned text is subsequently parsed for languages, topics, and framework mentions to identify technical competencies.
Syllabus Lookup and Parsing
For course syllabi, the system implements web search and HTML parsing to extract official learning outcomes:
import requests
from bs4 import BeautifulSoup
def lookup_syllabus(course_name: str, provider: str) -> list[str]:
"""Search Google for the official syllabus and extract bullet-point competencies."""
query = f"{course_name} {provider} syllabus learning outcomes"
search_url = f"https://www.google.com/search?q={requests.utils.quote(query)}"
html = requests.get(search_url, headers={"User-Agent": "Mozilla/5.0"}).text
soup = BeautifulSoup(html, "html.parser")
# Grab the first result that looks like a .pdf or .html syllabus page
for a in soup.select("a"):
href = a.get("href")
if "syllabus" in href.lower():
page = requests.get(href, timeout=10).text
page_soup = BeautifulSoup(page, "html.parser")
# Very naive extraction: list items under <ul>/<ol>
bullets = [li.get_text(strip=True) for li in page_soup.select("ul li, ol li")]
return bullets
return []
This approach mimics the "Approach A" direct lookup strategy, pulling authoritative competency lists directly from official syllabus pages rather than relying on candidate self-description.
Data Integrity and Traceability
The candidate profile enrichment system maintains strict data governance through additive-only updates and source attribution. Every competency added to 01-candidate-profile.md or 02-behavioral-profile.md includes a parenthetical source reference, creating an audit trail from the original GitHub repository or course syllabus to the final profile entry.
This traceability ensures that downstream job-fit scoring and tailored application generation rely on verified, attributable skills rather than inferred or unverified claims.
Summary
- The
/expandcommand orchestrates candidate profile enrichment through a six-step pipeline defined in.claude/commands/expand.md - GitHub portfolios provide concrete evidence of technical skills through repository READMEs, languages, and topics
- Course syllabi offer authoritative competency lists via direct web lookup of official learning outcomes
- Additive-only updates ensure no data is overwritten, with full source attribution maintained in
01-candidate-profile.mdand02-behavioral-profile.md - Human confirmation gates all write operations, presenting grouped summaries before modifying profile files
Frequently Asked Questions
How does the system handle private GitHub repositories?
The enrichment process only accesses public repositories through the GitHub API. Private repositories remain inaccessible unless explicitly authenticated, which the current implementation in expand.md does not require. Candidates must ensure relevant repositories are public to be included in the competency scan.
What happens if a course syllabus cannot be found online?
When Approach A (direct lookup) fails to locate an official syllabus, the system relies on Approach B (inferred competencies). This method analyzes the course description, title, and provider to deduce likely skills and knowledge areas. All inferred competencies are flagged with origin "B" to distinguish them from directly verified sources.
Can the enrichment process remove or modify existing competencies?
No. The /expand command operates on an additive-only basis. Step 0 explicitly loads existing profiles to prevent duplicates, and Step 5 only appends new entries. Existing competencies remain untouched to preserve manually curated information and maintain data integrity.
Which file stores the enriched technical competencies?
Technical competencies are appended to .claude/skills/job-application-assistant/01-candidate-profile.md, while behavioral and soft skills are stored in 02-behavioral-profile.md. Both files use markdown format with source annotations for traceability.
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 →