tailor-resume
Skill1 starsChanged 8 months agoMITView on GitHub
Build an ATS-optimized, impact-focused tailored HTML resume for a specific job. Reads RESUME.md (base resume) + profile.yaml (job search context), fetches the job description, reframes experience for strategic impact, and outputs a print-ready HTML file (Cmd+P → PDF) that passes ATS parsers AND impresses humans.
- Installs packages
19 other projects use a version of this.
Adopted by
Most recently taken up by
- ahmadelswify/agentic-ostheir own version, first seen Nov 1, 2026
- seonwooj0810/careerlooptheir own version, first seen Oct 20, 2026
- soilSpoon/skillstheir own version, first seen Oct 20, 2026
- bbborisss/resume-banktheir own version, first seen Oct 16, 2026
- ClarvAI/job-search-hqtheir own version, first seen Oct 15, 2026
- KiranKalluri268/Job-hunting-agent-skillstheir own version, first seen Oct 15, 2026
Used with
Projects with it also use find-jobs.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
QaliAISkillfind-jobs
Discover fresh job postings straight from public employer ATS feeds (Greenhouse, Lever, Ashby, SmartRecruiters, etc.) and deduplicate against the history ledger.
Also in 4 projects that use this
Other versions19 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 19
- andrew-shwetzer/career-ops-plugin★ 501same name
- andrew-shwetzer/career-ops-plugin-do-not-fork-currently-updating-v2-★ 500same name
- proficientlyjobs/proficiently-claude-skills★ 389same name
- didixuxu/didi-skills★ 83same name
- ahmadelswify/agentic-os★ 33same name
- gopinav/resume-agent-skills★ 9same name
- KiranKalluri268/Job-hunting-agent-skills★ 2same name
- AndreaCadonna/skills★ 1same name
- soilSpoon/skills★ 1same name
- bbborisss/resume-bank★ 0same name
9 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository3 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- classify-jobsSkill
- jobhunterSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
29 rules. 0 are common, 25 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 17 edited versions we read keep these.
25
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 43
Write RESUME.md without first showing the user a formatted preview and getting explicit confirmation
- Very specific: line 45
Write the resume before reading RESUME.md, profile.yaml, AND the full job description
- Distinctive: line 48
Add skills to the skills section that aren't in RESUME.md
- Distinctive: line 50
Stop and tell the user to "follow setup steps" or "run X first" — fix it for them
- Distinctive: line 52
Use AI-detectable filler phrases (see Writing Quality section below)
- Distinctive: line 71
The test: Read each sentence aloud. If it could appear on any resume for any job at any company, it's too generic.
- Distinctive: line 83
Run this check first, every time.
- Distinctive: line 118
If RESUME.md is missing: Ask the user to provide their resume.
- Very specific: line 125
After the user provides their resume (by any method), convert it to clean markdown and save as RESUME.md:
- Distinctive: line 132
If scored data is missing and user provides a job ID: Run the pipeline automatically:
- Very specific: line 168
If profile.yaml is MISSING: Create it interactively. Use AskUserQuestion for each:
- Very specific: line 178
After gathering answers, generate config/profile.yaml using the profile.yaml.example as a template.
- Distinctive: line 182
If user is relocating → mention willingness to relocate in summary if job is in target city
- Distinctive: line 183
If target_level differs from JD level → adjust framing (stretch up or demonstrate leadership)
- Distinctive: line 184
If remote_ok → don't over-emphasize location in summary
- Distinctive: line 247
If the page returned an error or login wall, tell the user and ask them to paste the JD instead.
- Distinctive: line 266
If gstack is NOT available: Use AskUserQuestion:
- Distinctive: line 269
After installing, retry the browse.
- Distinctive: line 286
Read the ENTIRE description: Do not skim. Every bullet point and requirement section matters — the keywords in "Nice to Have" are real …
- Distinctive: line 297
Read every line. Note:
- Distinctive: line 298
All companies, roles, and dates (in reverse-chronological order)
- Distinctive: line 299
Every skill and tool named
- Distinctive: line 300
Every metric or impact bullet
- Distinctive: line 332
Must contain at least one specific metric from RESUME.md.
- Distinctive: line 333
Must reference something specific about THIS company (a product, a mission, a technical challenge).
- Distinctive: line 334
Do NOT use filler phrases (see Writing Quality section above).
- Distinctive: line 339
Maximum 3-5 bullets per role: If the source resume has more, select the most relevant.
- Distinctive: line 355
Only list skills from RESUME.md.
- Distinctive: line 549
If the user says yes to the cover letter offer:
“Common” is measured: kept by at least 6 in 10 of the 17 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
JobHunter AI — Tailor Resume
Philosophy
Tailoring a resume is not decoration — it is strategic reframing of real accomplishments to serve a specific reader (a hiring manager with 7 seconds). Every word on the tailored resume must come from RESUME.md or the job description — never fabricated.
Mission: A person's ability to get a job should be based on their experiences and capabilities, not on their resume writing skills.
Two-pass approach (borrowed from gstack/review): read everything first, analyze second, write last. Never write a line of the resume before you've read RESUME.md, the full job description, AND profile.yaml. Skimming leads to generic resumes that look like every other application.
Evidence before output: show your analysis (what matched, what gaps exist, what you emphasized) before presenting the HTML. The user should understand why each decision was made, not just receive a document.
Frame skill gaps as investment advice, not failure (borrowed from gstack/retro): "You don't have dbt — worth noting in a cover letter that you've worked with similar orchestration tools" is better than "missing: dbt".
Impact over inventory. A resume is not a list of tools used or tasks performed. It is evidence of strategic thinking, business impact, and the ability to deliver outcomes. Every bullet should answer: "So what? Why did this matter?"
NEVER:
- Write RESUME.md without first showing the user a formatted preview and getting explicit confirmation
- Fabricate experience, skills, or companies — RESUME.md is the only source of truth
- Write the resume before reading RESUME.md, profile.yaml, AND the full job description
- Save a resume file without telling the user exactly where it was saved
- Present the HTML without first showing your analysis (what you changed and why)
- Add skills to the skills section that aren't in RESUME.md
- Invent a summary — base it on actual experience from RESUME.md, angled toward this role
- Stop and tell the user to "follow setup steps" or "run X first" — fix it for them
- Reorder roles out of reverse-chronological order — tailor via bullet selection, not role reordering
- Use AI-detectable filler phrases (see Writing Quality section below)
Writing Quality — Anti-Slop Principles
The resume must read like it was written by a thoughtful human, not generated by AI.
Avoid these patterns:
- Generic enthusiasm: "eager to", "passionate about", "excited to join"
- Empty authority claims: "proven track record", "results-driven", "seasoned professional"
- Buzzword chains: "leveraging cutting-edge solutions to drive innovation"
- Filler qualifiers: "various", "numerous", "multiple stakeholders"
Instead, be specific and concrete:
- Replace "passionate data professional" → "Built 3 data pipelines processing 200K records/day"
- Replace "proven track record of leadership" → "Managed a 5-person team through a zero-downtime migration"
- Replace "eager to bring expertise to [Company]" → "Built [specific system] similar to [Company]'s [specific product]"
The test: Read each sentence aloud. If it could appear on any resume for any job at any company, it's too generic. Rewrite it with specifics from RESUME.md.
Trigger
"tailor my resume", "build resume for", "I want to apply to", "build resume for job #", "make a resume for", "resume for [company]", "/tailor-resume"
Step 0 — Prerequisite Check & Auto-Fix
Run this check first, every time. Fix everything automatically.
# 1. Ensure .venv exists
if [ ! -d ".venv" ]; then
echo "⚙️ Creating .venv..."
python3 -m venv .venv && source .venv/bin/activate && pip install -q -r requirements.txt
echo "✅ Environment ready"
else
source .venv/bin/activate
fi
# 2. Check for RESUME.md
[ -f "RESUME.md" ] && echo "✅ RESUME.md found" || echo "⚙️ No RESUME.md yet — will ask user for their resume"
# 3. Check for profile.yaml
[ -f "config/profile.yaml" ] && echo "✅ profile.yaml found" || echo "⚙️ No profile.yaml — will set up interactively"
# 4. Check scored data (needed for job ID lookup)
python3 -c "
import pathlib
today = __import__('datetime').date.today().isoformat()
path = pathlib.Path(f'data/scored/{today}.json')
print('✅ Scored data found' if path.exists() else '⚙️ No scored data — will run pipeline if job ID lookup is needed')
" 2>/dev/null
# 5. gstack/browse check — ADVISORY (not blocking).
if [ -d "$HOME/.claude/skills/gstack" ] && [ -f "$HOME/.claude/skills/gstack/browse/bin/find-browse" ]; then
echo "✅ gstack/browse available (can fetch job descriptions from any URL)"
else
echo "⚠️ gstack not installed — browse unavailable (will need to paste job descriptions manually)"
echo " To install: git clone https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup"
fiIf RESUME.md is missing: Ask the user to provide their resume. Use AskUserQuestion with these options:
- "Point me to your resume file" — User gives a path (e.g.
~/Documents/resume.pdf,~/Desktop/Resume.docx). Read the file, extract the content, and write it toRESUME.mdin markdown format. - "I'll paste it here" — User pastes their resume text. Parse it and write to
RESUME.md. - "Just let me dump my work history" — User dumps unstructured "word vomit" about their experience. Follow the Word Vomit → Resume flow defined in
jobhunter/SKILL.mdStep 0 to format it into a proper RESUME.md. Show the formatted preview and get confirmation before saving. - "I have it on LinkedIn" — Browse their LinkedIn profile to extract experience, then write
RESUME.md.
After the user provides their resume (by any method), convert it to clean markdown and save as RESUME.md:
# Confirm with user before writing
echo "Writing your resume to RESUME.md..."Then tell them: "✅ Created RESUME.md from your resume. This stays local and is never uploaded anywhere." Then continue.
If scored data is missing and user provides a job ID: Run the pipeline automatically:
python -m src.scraper --skip-live && python -m src.matcherThen look up the job ID and continue.
If scored data is missing and user provides a job URL or description: No pipeline needed — proceed directly with the provided information.
Step 0.5 — Profile Verification (ALWAYS run after RESUME.md is confirmed)
This step is mandatory. The profile contains location, target level, relocation preferences, and other context that directly affects how the resume should be tailored.
If profile.yaml exists:
cat config/profile.yamlShow the user key fields and ask with AskUserQuestion:
"Here's your current job search profile:
- Location: [location]
- Target level: [target_level]
- Remote OK: [remote_ok]
- Relocation cities: [relocation_cities]
- Target roles: [target_roles]
Is this still accurate for this application?"
Options:
- "Looks good, continue" — Proceed with current profile.
- "I need to update some fields" — Ask which fields to change, then update profile.yaml.
- "Start fresh" — Walk through full profile setup interactively.
If profile.yaml is MISSING: Create it interactively. Use AskUserQuestion for each:
- Location — "Where are you currently located? (e.g. 'Toronto, ON' or 'San Francisco, CA')"
- Remote preference — "Are you open to remote work?"
- Options: "Remote only", "Remote preferred, open to hybrid", "Open to anything", "On-site is fine"
- Relocation — "Are you willing to relocate? If so, which cities?"
- Target level — "What seniority level are you targeting?"
- Options: "Entry", "Mid", "Senior", "Lead", "Manager"
- Target roles — "What roles are you looking for? (e.g. 'Backend Engineer', 'Data Engineer')"
After gathering answers, generate config/profile.yaml using the profile.yaml.example as a template.
Show the generated profile and confirm before saving.
Use profile context in tailoring:
- If user is relocating → mention willingness to relocate in summary if job is in target city
- If target_level differs from JD level → adjust framing (stretch up or demonstrate leadership)
- If remote_ok → don't over-emphasize location in summary
Step 1 — Identify the Job
By job ID (from dashboard or /classify-jobs):
python3 -c "
import json, hashlib, pathlib
today = __import__('datetime').date.today().isoformat()
jobs = json.loads(pathlib.Path(f'data/scored/{today}.json').read_text())
jid = 'REPLACE_WITH_ID' # e.g. a3f9c1d2
match = next((j for j in jobs if hashlib.sha256(j.get('url','').encode()).hexdigest()[:8] == jid), None)
if match:
print(f\"Title: {match['title']}\")
print(f\"Company: {match['company']}\")
print(f\"URL: {match.get('url','')}\")
print(f\"Score: {match.get('_score', 0):.1f}\")
else:
print('Job not found — check the ID or try a different date')
print('Available: ls data/scored/')
"By company/title search:
python3 -c "
import json, hashlib, pathlib
today = __import__('datetime').date.today().isoformat()
jobs = json.loads(pathlib.Path(f'data/scored/{today}.json').read_text())
query = 'netflix' # adjust
hits = [j for j in jobs if query in j.get('company','').lower() or query in j.get('title','').lower()]
for j in hits[:5]:
jid = hashlib.sha256(j.get('url','').encode()).hexdigest()[:8]
print(f'#{jid} — {j[\"title\"]} @ {j[\"company\"]} ({j.get(\"_score\",0):.1f})')
"Step 2 — Get the Full Job Description
Using gstack /browse (preferred):
First, check if gstack is available:
BROWSE_OUTPUT=$(~/.claude/skills/gstack/browse/bin/find-browse 2>/dev/null)
B=$(echo "$BROWSE_OUTPUT" | head -1)
if [ -z "$B" ]; then echo "BROWSE_NOT_AVAILABLE"; fiIf gstack is available — fetch the job description:
$B goto <job_url>
$B textThis works for ANY job URL — including companies not in JBA (Scotiabank, government sites, LinkedIn listings, etc.). The job does not need to be in the scored dataset. Validate the output contains job description content (title, requirements, responsibilities). If the page returned an error or login wall, tell the user and ask them to paste the JD instead.
After fetching, score and save the browsed job so it enters the pipeline:
python3 -c "
from src.matcher import score_and_save_browsed
result = score_and_save_browsed({
'title': 'REPLACE_TITLE',
'company': 'REPLACE_COMPANY',
'url': 'REPLACE_URL',
'location': 'REPLACE_LOCATION',
'skill_level': 'REPLACE_LEVEL',
})
print(f\"✅ Scored: {result['_score']:.1f} ({result['_priority']})\")
"This ensures the job appears in the dashboard and /classify-jobs even if the user
only came through /tailor-resume.
If gstack is NOT available: Use AskUserQuestion:
- "Install gstack now" — Show:
git clone https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setupAfter installing, retry the browse. - "I'll paste the job description" — Accept pasted text and continue.
For Greenhouse API jobs (Stripe, Anthropic, etc.), you can also fetch structured data:
python3 -c "
import urllib.request, json, re, html
url = 'https://boards-api.greenhouse.io/v1/boards/<company>/jobs/<job_id>'
data = json.loads(urllib.request.urlopen(url, timeout=15).read())
text = html.unescape(data.get('content',''))
text = re.sub(r'<[^>]+>', '\n', text)
print(re.sub(r'\n{3,}', '\n\n', text).strip())
"If gstack is unavailable and the user didn't install it above: Ask the user to paste the job description directly.
Read the ENTIRE description. Do not skim. Every bullet point and requirement section matters — the keywords in "Nice to Have" are real signals even if not required.
Step 3 — Read Your Resume
cat RESUME.mdRead every line. Note:
- All companies, roles, and dates (in reverse-chronological order)
- Every skill and tool named
- Every metric or impact bullet
- What's strongest vs what's thinner
- Any nested "Key Projects" sections — flatten these into role bullets for the tailored resume
Do not start the analysis until you've read RESUME.md, profile.yaml, and the full job description.
Step 4 — Two-Pass Analysis
Pass 1: Match Assessment (what to emphasize)
Answer these before writing anything:
Job requires: [list required skills from JD]
You have: [exact matches from RESUME.md]
You're missing: [gaps — be honest]
Profile context: [location fit, level fit, relocation relevant?]
Best bullets: [3-5 bullets from RESUME.md that are most relevant to THIS role]
Reframe needed: [bullets that are task-oriented and need impact reframing]
Summary angle: [one sentence connecting your background to this company's specific mission/product]
Page budget: [1 page if <10yr experience, 2 pages max if 10+yr]Show this analysis to the user before generating HTML. They should see your reasoning.
Pass 2: Resume Generation (what to write)
With the match assessment complete, build the HTML:
- Summary — 2-3 sentences: who you are + what you bring + why this company/role specifically. Must contain at least one specific metric from RESUME.md. Must reference something specific about THIS company (a product, a mission, a technical challenge). Do NOT use filler phrases (see Writing Quality section above).
- Experience — ALWAYS reverse-chronological order (most recent role first). Within each role, pull forward and emphasize the bullets that answer this job's requirements. Bullets that don't resonate for this role can move down or be trimmed. Maximum 3-5 bullets per role. If the source resume has more, select the most relevant. For roles >5 years ago, 2-3 bullets max.
- Bullet Reframing — Transform task-oriented bullets into impact-oriented bullets:
Formula: [Business impact / outcome] + [Scale / metric] + [Technologies in parentheses] The reader should understand WHY the work mattered, not just WHAT was done.BEFORE (task-focused): "Led design and development of backend services and REST APIs using Java and Spring Boot" AFTER (impact-focused): "Powered 50,000+ merchants' order processing with 99.99% availability through a financial infrastructure handling 100K+ daily requests (Java, Spring Boot, DynamoDB)" - Skills — job-required skills first, grouped by category. Only list skills from RESUME.md. If the job requires something you don't have, note it in gaps. Simple comma-separated format — no complex layouts.
- Education — degrees with institution and year. Keep brief unless education is highly relevant to this role (e.g., PhD for a research position).
- Gaps — list honestly. Will go into the cover letter offer at the end.
Step 5 — Generate HTML Resume
Output a complete, single-page, print-ready HTML file. This template is ATS-optimized: uses standard fonts, simple block layout (no flexbox/grid), standard section headers, and clean semantic HTML that ATS parsers can extract cleanly.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>[Your Name] — [Role] at [Company]</title>
<style>
/* ATS-SAFE RESUME TEMPLATE — no flexbox, no grid, standard fonts */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: Calibri, Arial, Helvetica, sans-serif;
font-size: 11pt;
color: #1a1a1a;
max-width: 780px;
margin: 0 auto;
padding: 0.5in 0.6in;
line-height: 1.15;
}
/* Name — 18pt, prominent but not oversized */
h1 {
font-size: 18pt;
font-weight: 700;
text-align: center;
margin-bottom: 2px;
}
/* Contact info — centered, simple, in body (NOT in header/footer) */
.contact {
text-align: center;
color: #333;
font-size: 10pt;
margin-bottom: 14px;
}
.contact a { color: #1a1a1a; text-decoration: none; }
/* Section headers — standard names, 12pt, clear separator */
h2 {
font-size: 12pt;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid #1a1a1a;
padding-bottom: 2px;
margin: 14px 0 6px;
}
/* Job entries — simple block layout, no flexbox */
.job-header {
margin-bottom: 2px;
}
.job-title { font-weight: 700; }
.job-company { font-style: italic; }
.job-date { float: right; font-size: 10pt; color: #333; }
/* Bullet points — standard list */
ul {
margin: 3px 0 8px 18px;
padding: 0;
}
li {
margin-bottom: 2px;
font-size: 10.5pt;
}
/* Skills — simple inline, no grid/flexbox */
.skills-section p {
margin-bottom: 2px;
font-size: 10.5pt;
}
.skills-label { font-weight: 700; }
/* Education */
.edu-entry { margin-bottom: 4px; }
/* Print optimization */
@media print {
body { padding: 0.4in 0.5in; font-size: 10pt; }
li { font-size: 10pt; }
.hint { display: none; }
a { color: #1a1a1a; }
}
</style>
</head>
<body>
<!-- HEADER — name + contact in body, NOT in page header/footer -->
<h1>[Full Name]</h1>
<p class="contact">
[City, State/Province] · <a href="mailto:[email]">[email]</a> · [phone] · <a href="[linkedin_url]">linkedin.com/in/[handle]</a>
</p>
<!-- PROFESSIONAL SUMMARY — tailored to THIS role, anchored in RESUME.md facts -->
<h2>Professional Summary</h2>
<p>[2-3 sentences. Must include at least one specific metric from RESUME.md. Must reference
something specific about THIS company/role. No generic filler.]</p>
<!-- PROFESSIONAL EXPERIENCE — always reverse-chronological -->
<h2>Professional Experience</h2>
<div class="job-header">
<span class="job-date">[MM/YYYY] – Present</span>
<span class="job-title">[Job Title]</span> — <span class="job-company">[Company], [Location]</span>
</div>
<ul>
<!-- 3-5 bullets max. Impact-first format: [Outcome + metric] + [how] + (technologies) -->
<li>[Impact bullet — what business outcome did this achieve? Include metric.]</li>
<li>[Impact bullet — scale, users affected, revenue/cost impact]</li>
<li>[Impact bullet — most relevant to THIS job's requirements]</li>
</ul>
<!-- Repeat for each role, reverse-chronological. 2-3 bullets for roles >5 years ago. -->
<!-- SKILLS — job-required skills listed first, simple comma format -->
<h2>Skills</h2>
<div class="skills-section">
<p><span class="skills-label">Languages:</span> [Python, Java, SQL, ...]</p>
<p><span class="skills-label">Frameworks & Tools:</span> [Spring Boot, React, Docker, ...]</p>
<p><span class="skills-label">Cloud & Infrastructure:</span> [AWS, GCP, Kubernetes, ...]</p>
</div>
<!-- EDUCATION -->
<h2>Education</h2>
<div class="edu-entry">
<span class="job-date">[YYYY]</span>
<span class="job-title">[Degree]</span> — <span class="job-company">[University]</span>
</div>
<p class="hint" style="margin-top:24px;padding:8px;background:#f0f7ff;border-radius:4px;font-size:9pt;color:#555;">
💡 Press <strong>Cmd+P</strong> (Mac) or <strong>Ctrl+P</strong> (Windows) → <em>Save as PDF</em>
</p>
</body>
</html>ATS Compatibility Notes (built into the template above)
- ✅ Fonts: Calibri, Arial, Helvetica (ATS standard-safe)
- ✅ Layout: Simple block layout, no flexbox, no grid, no tables, no columns
- ✅ Section headers: Standard names ("Professional Summary", "Professional Experience", "Skills", "Education")
- ✅ Contact info: In body text, not in page header/footer
- ✅ Date format: MM/YYYY consistently
- ✅ Bullet points: Standard
<ul><li>elements - ✅ No images, graphics, charts, or text boxes
- ✅ Font sizes: 18pt name, 12pt headers, 10.5-11pt body
- ✅ Margins: 0.5-0.6in (within 0.5-1in range)
- ✅ Line spacing: 1.15 (within 1.0-1.15 range)
Step 6 — Save and Present
mkdir -p resumes
# filename: YYYY-MM-DD-company-role.html
# e.g.: resumes/2026-03-16-netflix-analytics-engineer.htmlFile naming for PDF export: Tell the user to save the PDF as FirstName_LastName_Resume.pdf
(ATS-friendly filename convention).
Present in this order:
- Where it's saved:
resumes/2026-03-16-netflix-analytics-engineer.html - How to export: "Open in browser → Cmd+P → Save as PDF → Save as
FirstName_LastName_Resume.pdf" - What changed (specific, anchored):
- "Reframed [Company X] bullet to lead with business impact (50K merchants) instead of technology stack"
- "Pulled forward the DynamoDB event-driven bullet — they mention exactly-once delivery in their requirements"
- "Summary references [Company]'s [specific product/mission] based on the JD"
- Skill gaps (as investment advice, not failure):
- "dbt isn't in your resume — worth a sentence in your cover letter: 'I've built similar pipelines with [X], picking up dbt is on my roadmap'"
- One offer: "Want a cover letter for this role?" (one offer, not a menu)
Step 7 — Cover Letter (if asked)
If the user says yes to the cover letter offer:
- Opening paragraph: why this company specifically (research the mission, product, or a recent launch)
- Middle: your most relevant experience bridging directly to their needs
- Closing: address the skill gap proactively, show interest in learning curve
- Length: 3 paragraphs max. Hiring managers read fast.
- Same writing quality rules: no AI slop, be specific, reference real experience.
Save to resumes/2026-03-16-netflix-analytics-engineer-cover.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

