Draft
Make CV route ATS-parseable by preventing PDF rasterization#55
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Copilot
AI
changed the title
[WIP] Enhance CV route to be auto-parsed by ATS scanners
Make CV route ATS-parseable by preventing PDF rasterization
Dec 16, 2025
Co-authored-by: papotte <21336477+papotte@users.noreply.github.com>
Co-authored-by: papotte <21336477+papotte@users.noreply.github.com>
…ing structure Co-authored-by: papotte <21336477+papotte@users.noreply.github.com>
papotte
force-pushed
the
copilot/enhance-cv-route-for-ats
branch
from
December 17, 2025 19:59
bd3545d to
c09f7c9
Compare
Owner
|
@copilot I've updated the icons, can you update this PR? |
Contributor
Author
The PR is already compatible with the updated icons. I've verified that:
The changes properly hide all SVG icons in print view while maintaining screen display functionality with the updated icon library. Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ATS systems fail to parse CVs generated via
window.print()when browsers rasterize content into images. This occurs when CSS uses transforms, filters, or when SVG icons are embedded.Changes
Semantic HTML structure
<div class="header">→<header><div class="section">→<section>with ARIA labels<h3>→<h2>(proper hierarchy: H1 → H2)Icon handling
Print media queries (src/styles/cv.scss)
transform,filter,backdrop-filter,mix-blend-modesvg { display: none !important; }print-color-adjust: exactfor text selectabilityLayout for print
Result
PDFs generated via print dialog contain selectable text in logical reading order with no embedded SVGs or rasterized elements. Screen layout unchanged.
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
telemetry.astro.build/usr/local/bin/node node /home/REDACTED/work/papotte.github.io/papotte.github.io/node_modules/.bin/astro build(dns block)/usr/local/bin/node node /home/REDACTED/work/papotte.github.io/papotte.github.io/node_modules/.bin/astro dev --host 0.0.0.0 --port 4321 ub.io/node_modules/.bin/git ame(dns block)/usr/local/bin/node node /home/REDACTED/work/papotte.github.io/papotte.github.io/node_modules/.bin/astro build git conf��(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
This section details on the original issue you should resolve
<issue_title>Enhance CV route to be auto-parsed by ATS scanners</issue_title>
<issue_description>You’ve run into a very real ATS (Applicant Tracking System) problem, and you’re right about the core issue:
window.print() itself is not the enemy — how the page is rendered is.
The good news: you can keep your Astro + JS/TS CMS workflow and still generate an ATS-parsable CV, without falling back to Word or LaTeX.
Below is a practical, production-grade breakdown, ordered from most important to nice-to-have.
Most ATS systems don’t do OCR unless they have to. They expect:
✅ Real text, not images
✅ Logical reading order
✅ Simple layout (single column preferred)
✅ Standard fonts
✅ Semantic structure
When scanners fail with print() PDFs, it’s usually because:
Text is rendered as SVG / Canvas / background images
CSS positioning breaks reading order
Fonts are embedded in a way that flattens glyphs
The PDF lacks tags
Common culprits in modern web CVs:
❌ CSS that causes rasterization
Avoid:
transform: scale(); filter: blur(); backdrop-filter; mix-blend-mode;
Browsers will flatten the entire page into images if these appear in the print context.
❌ Icon fonts & SVG-only text
Font Awesome icons
SVG-based headings
Inline elements
ATS often ignores or misreads these.
In Astro, add a dedicated print stylesheet:
@media print { * { transform: none !important; filter: none !important; box-shadow: none !important; } body { font-family: "Times New Roman", Arial, sans-serif; font-size: 11pt; line-height: 1.4; } a::after { content: " (" attr(href) ")"; font-size: 9pt; } }
Key principles:
One column
No grids or absolute positioning
No icons
No decorative separators
This is where your CMS really shines.
✅ Do this
Firstname Lastname
Senior Frontend Engineer
Experience
Company – Role
2021–2024❌ Avoid
ATS systems do parse headings, lists, and articles.
Use:
Times New Roman
Arial
Helvetica
Georgia
Avoid:
Variable fonts
Custom web fonts in print
Icon fonts
In print CSS:
@media print { body { font-family: Arial, sans-serif; } }
Browsers are inconsistent. Instead, generate PDFs using a headless renderer that preserves text.
Best options
✅ Puppeteer (recommended for JS/TS stacks)
await page.pdf({ format: "A4", printBackground: false, preferCSSPageSize: true, tagged: true });
Why this works:
Preserves text layers
Generates selectable text
Can produce tagged PDFs
✅ Playwright (similar benefits)
❌ Avoid
html2canvas
jspdf with canvas
Screenshot-based exporters
This is a pro move.
Example:
/cv → styled portfolio version /cv-print → ATS-safe version
In Astro:
--- const isPrint = Astro.url.pathname.includes("cv-print"); ---
Then conditionally:
Disable icons
Switch layout
Simplify styles
Some ATS systems read PDF tags (structure tree).
If you use:
Puppeteer
PrinceXML (paid)
WeasyPrint (via CI)
You can generate fully tagged PDFs, similar to LaTeX output.
This is why Overleaf works so well.
Before sending:
Open PDF
Try:
Select text
Copy → paste into plain text editor
Upload to:
Indeed resume parser
LinkedIn resume upload
Jobscan.co
If it pastes cleanly → you’re good.
ATS-friendly ≠ visually impressive
That’s why even FAANG candidates often submit:
One boring PDF
One beautiful portfolio
Your CMS approach is actually better than Word/LaTeX — you just need two outputs.
TL;DR (what to do next)
Keep your stack. Change the export.
✅ Semantic HTML
✅ Print-only ATS stylesheet
✅ No transforms, SVG text, or icons
✅ Generate PDF with Puppeteer/Playwright
✅ Separate /cv-print route
If you want, I can:
Review your existing CV markup and point out ATS-breaking parts
Give you a Puppeteer PDF export script tailored to Astro
Help design a clean ATS-only layout that auto-syncs with your CMS
Just tell me which you want.
</issue_description>
Comments on the Issue (you are @copilot in this section)
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.