Resume and CV builder that creates professional, deployable web resumes from any source (PDF, DOCX, TXT, MD, HTML, URL, LinkedIn, Notion). Acts as an expert recruiter: extracts information from multiple files, interviews the user to refine content, researches the target industry to give informed advice, suggests improvements and optimal organization, generates a professional AI headshot from a reference photo, and builds a polished single-page HTML resume with PDF download — deployed instantly via Cloudflare Workers. Use this skill whenever the user mentions resume, CV, curriculum vitae, professional profile page, career page, job application page, or wants to create a professional online presence for job seeking, even if they don't say 'resume' explicitly.
Build professional, deployable web resumes from any source material. The skill acts as an expert recruiter — not just a template filler — researching the target industry, advising on content strategy, and producing a polished result.
Accept one or more sources. The user might provide several files at once (e.g., an old resume PDF + a LinkedIn URL + a Notion page with projects). Collect everything before parsing.
Supported formats and how to read them:
| Format | Method |
|---|---|
Read tool (built-in PDF support) | |
| TXT, MD, HTML | Read tool |
| DOCX, DOC | Bash: textutil -convert txt <file> -stdout (macOS built-in) |
| URL (website/portfolio) | FirecrawlScrapeTool — scrape and extract relevant content |
| LinkedIn URL | FirecrawlScrapeTool — scrape public profile. May have limited access; if blocked, ask user to paste/export their LinkedIn data |
| Notion page | notion-search to find the page → notion-fetch to pull content. If user provides a Notion URL, extract the page ID and fetch directly |
If the user provides multiple sources, read them all in parallel using subagents or parallel tool calls.
If no sources are provided, go directly to Step 1 and gather information through the interview.
Parse all sources and merge into a unified profile. Extract:
Present the extracted information as a clean summary to the user. Highlight:
Ask the user to confirm, correct, or fill in the gaps before proceeding.
Ask the user:
What role are you targeting? (job title, seniority level)
What industry or sector? (tech, finance, healthcare, creative, etc.)
Target company (optional but valuable) — accept any combination of:
If the user only gives a name, search for the rest yourself using PerplexitySonarSearchTool ("[company name] website linkedin").
Then research in parallel:
Industry research — use PerplexitySonarSearchTool with 2-3 queries:
Company research (if provided) — gather as much context as possible:
Website: FirecrawlMapTool to discover pages → FirecrawlScrapeTool on careers, about, team, and culture pages. Extract:
LinkedIn: FirecrawlScrapeTool on the company LinkedIn URL. Extract:
Job posting (if provided): FirecrawlScrapeTool to extract the exact requirements, responsibilities, and keywords. This is the most valuable source — the resume should speak directly to what this posting asks for.
Other links (Glassdoor, Crunchbase, etc.): FirecrawlScrapeTool to pull reviews, funding info, or any relevant context.
Synthesis: PerplexitySonarSearchTool with "[company name] culture work environment what is it like to work at" for additional context.
The goal is to understand the target company well enough to tailor the resume's language, emphasis, and keywords to what this specific company values. A resume targeting a scrappy 20-person startup should read differently from one targeting a Fortune 500.
Save the research findings — they inform the recruiter advice in the next step.
This is where the skill earns its keep. Based on the extracted information AND the research, act as a senior recruiter specialized in the user's target industry. Walk through these areas:
Recommend the optimal order based on the user's strongest assets:
Draft a 2-3 sentence summary tailored to the target role. Present it for the user to approve or adjust.
Present all suggestions and wait for user confirmation before proceeding. The user might want to discuss or push back — that's expected and healthy.
Ask: "Do you have a photo you'd like to use for your resume? You can share the file path."
If the user provides a photo:
Read the photo with the Read tool to see what we're working with
Determine the appropriate style based on the target industry:
Generate a professional headshot using the reference photo:
Option 1 — infsh CLI (check with which infsh):
infsh app run falai/flux-dev-lora --input '{
"prompt": "professional headshot portrait, [industry-appropriate description], clean background, studio lighting, high quality, photorealistic",
"image_url": "[path-to-user-photo]"
}'
Option 2 — HiggsfieldImageTool (Social Toolkit MCP):
Use the soul model for portrait generation with an industry-appropriate prompt.
Option 3 — Use original photo as-is: If AI generation isn't available or the user prefers their actual photo, apply CSS treatment: circular crop, subtle shadow, slight desaturation for a polished look.
If no photo provided: skip the photo section in the resume, or offer a tasteful initials avatar via CSS.
Suggest the style to the user and let them choose: "Since you're targeting tech roles, I'd suggest a friendly, smart-casual headshot. Want to go with that, or prefer something more formal?"
Present the available styles with a recommendation based on the target industry:
Clean lines, generous whitespace, single accent color, modern sans-serif typography.
Traditional structure, authoritative palette, clear hierarchy, serif headings.
Modern, optional dark mode, monospace accents, subtle code-inspired elements.
Bold colors, distinctive layout, asymmetric elements, expressive typography.
Clean, scholarly, reading-focused, structured with subtle refinement.
Say something like: "For a Senior Frontend Engineer targeting tech companies, I'd recommend the Tech style — it signals you're in the right world. But if you prefer something cleaner, Minimalist also works well. Which one appeals to you?"
Let the user pick. If they want something custom, adapt.
Apply all the agreed-upon changes from Step 3:
Present the final content outline one more time for sign-off: section order, key bullet points, summary. This is the last checkpoint before building.
Generate a single self-contained index.html file with:
<project-dir>/
index.html ← complete resume (inline CSS + JS)
images/
headshot.jpg ← professional photo (if generated)
wrangler.jsonc ← Cloudflare deployment config
HTML/CSS:
<style> block — no external stylesheets except Google Fonts<link> tags<header>, <main>, <section>, <article>, <footer>@media print — hide the download button, clean margins, black textPDF Download Button:
Include a floating download button that generates a PDF of the resume. Use html2pdf.js via CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.2/html2pdf.bundle.min.js"></script>
The button should:
@media print styles for clean output[FirstName]-[LastName]-Resume.pdffunction downloadPDF() {
const button = document.getElementById('download-btn');
button.style.display = 'none';
const element = document.getElementById('resume');
const opt = {
margin: 0.5,
filename: '[Name]-Resume.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: true },
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
};
html2pdf().set(opt).from(element).save().then(() => {
button.style.display = '';
});
}
Photo display:
alt text: "[Name] — Professional headshot"Content sections to render (based on what was agreed in Step 6):
Design execution: Apply the chosen visual style from Step 5. Use the exact font pairings and color palettes defined there. The resume should look like it was designed by a professional — distinctive typography, intentional spacing, a clear visual hierarchy that guides the reader's eye from name → summary → experience → skills.
If the style benefits from subtle design elements (background texture, header pattern), generate them:
which infsh — use FLUX for abstract/textural imagesHiggsfieldImageToolKeep design elements subtle — the content is the star.
Create wrangler.jsonc in the project directory:
{
"name": "<firstname-lastname>-resume",
"compatibility_date": "2025-04-01",
"assets": {
"directory": "./"
}
}
Deploy:
cd <project-dir> && wrangler deploy
Share the live URL with the user. Also open the local file so they can preview:
open <project-dir>/index.html