The wake-up call
I spent years building products, shipping features, leading migrations, setting up CI/CD pipelines from scratch. I thought my CV reflected that. Turns out, the machines reading it did not agree.
I had been job hunting in the European tech market and getting fewer callbacks than expected. Not zero, but fewer than what my experience should warrant. So I did something that felt a bit masochistic: I asked an AI to evaluate my resume the way an Applicant Tracking System would.
The verdict? "Solid pass, but mid-tier ranking." Not trash, but not top of the pile either.
Every recruiter uses a machine now
This is the part nobody talks about openly. In 2026, virtually every recruiting company, every HR platform, every job board runs your CV through some form of automated scoring before a human ever looks at it. The process goes like this:
1. You submit your application
2. A parser extracts your text and tries to understand structure (name, title, skills, dates)
3. A scoring engine ranks you against the job description keywords
4. Only candidates above a threshold get shown to an actual human
Step 4 is where most people get silently rejected. No email, no feedback. Your profile just never surfaces.
The systems are not sophisticated enough to understand context. They cannot infer that someone who built payment systems from scratch probably understands backend architecture deeply. They look for keyword matches, clear structure, and quantifiable signals.
What was wrong with my CV
When I ran my profile through the analysis, several things stood out.
Keyword match was fine. React, Angular, TypeScript, Node.js, AWS, CI/CD. All the right terms were present. That part passed.
Seniority signals were there but vague. I showed progression from fullstack to feature team lead to product engineer. But the bullets read like responsibility lists, not impact statements. "Set up CI/CD" is not the same as "reduced release cycles from weeks to days by implementing automated CI/CD pipelines."
No measurable outcomes. This was the biggest gap. Most of my bullets described what I did, not what happened because of it. ATS systems that rank by impact had nothing to score on.
My headline was too broad. "Product Engineer, Fullstack Solutions & Scalable Architectures" sounds nice to a human but scores poorly against specific searches like "Senior React Engineer" or "TypeScript Fullstack Developer." The system could not anchor me to any single strong match.
The fix: structured depth, not just breadth
The insight from the analysis was simple. You do not need to narrow your actual skill set. You need to give the machine clear signals while keeping the human narrative broad.
So I rewrote my headline to: Product-oriented fullstack (Angular/React/TypeScript). That is not limiting. It is anchoring. A recruiter searching for React or Angular or TypeScript engineers will now find me in their shortlist. The rest of my profile still shows the breadth.
For each role, I rewrote the bullets to lead with outcomes where possible. Not "handled payments migration" but specifics about the scope and systems involved. Not "worked on frontend" but the actual frameworks, patterns, and constraints.
I also made sure the summary reads like a pitch, not an inventory. Two sentences about what I do, one about how I work, one about what I am good at. Direct and scannable.
Why I built this into a JSON Resume theme
I maintain an open-source theme for JSON Resume called Tone. When I went through this ATS optimization exercise, I realized the theme itself should enforce good practices. So the latest release (v0.0.25) includes changes that directly support ATS readability:
- Clean semantic HTML. ATS parsers rely on document structure. The template uses proper heading hierarchy and section landmarks.
- No external dependencies. The rendered output makes zero network requests. No scripts, no external fonts, no tracking. This means parsers get clean text.
- Single-page PDF export. A new PDF generation script produces a properly formatted single-page document. Many ATS systems process the PDF directly.
- Dark mode and light mode previews. You can see exactly what the output looks like before submitting.
- Open Graph tags. When shared on LinkedIn or messaging apps, the embed is clean and professional.
The theme follows the JSON Resume 1.0.0 spec, so any resume.json file works. You write your content once, and the theme handles output quality.
What I learned about the market
After optimizing my CV and running it through several analyses, here is what became clear.
For senior fullstack and product engineer roles across Europe, a well-structured resume with the right keyword density and clear impact statements places you in the top 20 to 30 percent of the candidate pool. That is the difference between being shown to a hiring manager and being silently filtered out.
The technology you know matters less than how clearly you present it. A recruiter searching "React TypeScript AWS" needs to find those exact strings in your profile, in the right context, with evidence of seniority.
Your belief that technologies are interchangeable and learnable is correct. But the machines doing the initial screening do not care about your learning potential. They care about demonstrated evidence.
The uncomfortable truth
We are all being ranked by algorithms before we get a chance to speak. The romanticized version of hiring where someone reads your cover letter and gets excited about your passion project is mostly gone. What remains is a two-stage system: pass the machine, then impress the human.
The good news is that optimizing for machines does not require lying or keyword stuffing. It requires clarity, structure, and measurable language. Things that also make your CV better for humans.
If your callback rate is lower than it should be, the problem might not be your experience. It might be your formatting.
Resources
- Theme repository: https://github.com/hgosansn/jsonresume-theme-tone
- JSON Resume spec: https://jsonresume.org
- My own resume.json file: https://registry.jsonresume.org/hgosansn