Install
openclaw skills install jobautopilot-tailorTailors your resume and cover letter to a specific job description. Fetches the JD, rewrites bullet points to match keywords, and exports polished .docx files — 100% based on your real experience, nothing invented. Picks up shortlisted jobs from jobautopilot-search and hands resume_ready entries to jobautopilot-submitter.
openclaw skills install jobautopilot-tailorProduces a tailored resume and cover letter for each shortlist job in the tracker. Delivers .docx files ready to attach and send.
$RESUME_DIR before writing anything.error with a clear reason and move on.Add to ~/.openclaw/workspace/job_search/config.sh:
export RESUME_DIR="$HOME/Documents/jobs/" # your original resume files live here
export RESUME_OUTPUT_DIR="$HOME/Documents/jobs/tailored/" # where tailored files are saved
export RESUME_TEMPLATE="$HOME/.openclaw/workspace/job_sub_agent/scripts/sample_placeholders.docx"
# Download template: https://github.com/jerronl/jobautopilot/raw/main/jobautopilot-tailor/scripts/sample_placeholders.docx
export MD_TO_DOCX_SCRIPT="$HOME/.openclaw/workspace/job_sub_agent/scripts/md_to_docx.py"
export JOB_SEARCH_TRACKER="$HOME/.openclaw/workspace/job_search/job_application_tracker.md"
export USER_FIRST_NAME="Your"
export USER_LAST_NAME="Name"
export USER_EMAIL="your@email.com"
export USER_PHONE="+1-555-000-0000"
export USER_LINKEDIN="https://linkedin.com/in/yourprofile"
mkdir -p "$RESUME_OUTPUT_DIR"
Read in order:
$RESUME_DIR — understand the user's full experience and skills$JOB_SEARCH_TRACKER — find all shortlist entries to processFor each shortlist job:
web_search first to extract job responsibilities, skills, keywords, asset classesweb_search returns no useful JD, use browser to open the URL directlyerror and explain whyFor each job, strictly in this sequence:
Read all files in $RESUME_DIR. The pool may contain:
| File type | What to extract |
|---|---|
Master resume (.docx / .pdf) | Full work history, bullet points, metrics, dates. PDF text is extracted by the agent's built-in tools; the conversion script handles .docx and .md only. |
| Older tailored versions | Phrasing that worked well for similar roles |
| Cover letter drafts | Preferred voice, opening formulas, recurring themes |
Skills list / bio (.md / .txt) | Certifications, tools, side projects, publications |
Extract everything factual — every bullet, every metric, every tool name. This is your raw material. Do not invent anything not present in these files.
The markdown file must follow this exact format. md_to_docx.py parses it structurally — any deviation will produce wrong or missing output.
Full Name
Email | Phone | LinkedIn | Location
SUMMARY
Two to three sentences summarizing the candidate.
CORE SKILLS
List of skills, tools, and technologies relevant to this role.
EXPERIENCE
Job Title — Company Name | City, ST | Jan 2022 – Present
• Accomplished X by doing Y, resulting in Z
• Another bullet point with a metric
Job Title — Company Name | City, ST | Jun 2019 – Dec 2021
• Bullet point
• Bullet point
EARLIER EXPERIENCE
Earlier Role — Company, Year–Year
Another Earlier Role — Company, Year–Year
EDUCATION
University Name — Degree, Major (Year)
Parsing rules the script enforces — follow these exactly:
| Element | Rule |
|---|---|
| Line 1 | Full name, plain text, no # heading marker |
| Line 2 | Contact info, pipe-separated |
| Section headers | ALL CAPS, no ## — exactly SUMMARY, CORE SKILLS, EXPERIENCE, EARLIER EXPERIENCE, EDUCATION |
| Job header | Title — Company | Location | Date range — separator is — (em dash with spaces), fields separated by | |
| Bullets | Start with • or -, one per line |
| Earlier experience | One line per entry: Role — Company, Years |
| Education | One line per entry: University — Degree |
What the script handles automatically:
Tailor bullet points to match the JD keywords. Prioritize:
Save to: $RESUME_OUTPUT_DIR/${USER_FIRST_NAME}_<Company>_<Title>_Resume_2026.md
Before running md_to_docx.py, verify the markdown against these rules:
# Line 1 must be plain name (no # prefix)
head -1 resume.md
# Line 2 must contain pipes (contact info)
sed -n '2p' resume.md | grep '|'
# Section headers must be ALL CAPS with no ## prefix
grep -E '^[A-Z ]+$' resume.md
# Job headers must match: Title — Company | Location | Date
grep -E '^.+ — .+ \| .+ \| .+$' resume.md
# Bullets must start with • or -
grep -E '^[•\-]' resume.md
If any check fails, fix the markdown before proceeding — a malformed file will silently produce an incomplete docx.
Three paragraphs max:
Save to: $RESUME_OUTPUT_DIR/${USER_FIRST_NAME}_<Company>_<Title>_Cover_Letter_2026.md
Change status to md_ready. Record md file paths.
Resume — use md_to_docx.py with the template:
python3 "$MD_TO_DOCX_SCRIPT" \
--input "$RESUME_OUTPUT_DIR/${USER_FIRST_NAME}_<Company>_<Title>_Resume_2026.md" \
--template "$RESUME_TEMPLATE" \
--output "$RESUME_OUTPUT_DIR/${USER_FIRST_NAME}_<Company>_<Title>_Resume_2026.docx"
Cover letter — use python-docx directly (plain text, no template):
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
# Add paragraphs from cover letter md content
for para in cover_letter_paragraphs:
p = doc.add_paragraph(para)
doc.save(f"{output_dir}/{os.environ['USER_FIRST_NAME']}_<Company>_<Title>_Cover_Letter_2026.docx")
"Text looks right" is not the same as "file is deliverable." Both conditions must pass:
{{PLACEHOLDER}} strings anywhere in the document$RESUME_OUTPUT_DIRDo not call partial verification "good enough." If any check fails, fix and re-verify before updating the tracker.
resume_ready, record docx pathserror, write reasonAfter each job, report: company, title, files produced, any issues.
${USER_FIRST_NAME}_<CompanyName>_<JobTitle>_Resume_2026.docx
${USER_FIRST_NAME}_<CompanyName>_<JobTitle>_Cover_Letter_2026.docx
Spaces → underscores. Keep company and title short (≤ 20 chars each if possible).
shortlist → md_ready → resume_ready
↘ error
Resume tailoring only. Do not submit applications. Hand off resume_ready entries to the jobautopilot-submitter skill.
If Job Autopilot saved you time: paypal.me/ZLiu308