<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muneeb Nawaz</title>
    <description>The latest articles on DEV Community by Muneeb Nawaz (@muneeb_nawaz).</description>
    <link>https://dev.to/muneeb_nawaz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1889143%2F1dcf6ed8-faa5-4ce7-8dac-c05ccdaf3767.jpg</url>
      <title>DEV Community: Muneeb Nawaz</title>
      <link>https://dev.to/muneeb_nawaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muneeb_nawaz"/>
    <language>en</language>
    <item>
      <title>My resume checker said the r/resumes template had no work history. The bug was mine.</title>
      <dc:creator>Muneeb Nawaz</dc:creator>
      <pubDate>Thu, 01 Oct 2026 09:20:30 +0000</pubDate>
      <link>https://dev.to/muneeb_nawaz/my-resume-checker-said-the-rresumes-template-had-no-work-history-the-bug-was-mine-1dm9</link>
      <guid>https://dev.to/muneeb_nawaz/my-resume-checker-said-the-rresumes-template-had-no-work-history-the-bug-was-mine-1dm9</guid>
      <description>&lt;p&gt;Someone in r/resumes asked whether the Google Docs template pinned in that sub is ATS friendly. Three people said yes. I maintain a resume parser, so I went to check instead of guessing.&lt;/p&gt;

&lt;p&gt;I filled the template in with a made-up person (John Smith, Operations Manager at Northwind Traders, Business Analyst at Globex), downloaded it three ways, and ran each file through my own checker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plain text   95   Parses clean
Word         60   At risk
PDF          60   At risk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same words, same order, same person. Thirty-five points apart.&lt;/p&gt;

&lt;p&gt;The Word and PDF reports said the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No work history section   -26
Missing sections          -15
Missing links              -3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No work history section. On a resume whose first section, right under the contact line, is called WORK EXPERIENCE.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the file actually says
&lt;/h2&gt;

&lt;p&gt;A .docx file is a zip of XML, so you can look. Here is how the template sets its section names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'WORK EXPERIENCE'  style: none   bold   underlined   12pt
'EDUCATION'        style: none   bold   underlined   12pt
'SKILLS'           style: none   bold   underlined   12pt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No heading style. They are ordinary paragraphs that happen to be bold and underlined. To a person they look like headings. To a parser that asks Word "which paragraphs are headings?", the honest answer is none of them.&lt;/p&gt;

&lt;p&gt;My Word and PDF readers asked exactly that question. If the file did not mark a line as a heading, the scorer did not treat it as one, so it never saw a section start, so it found no work history.&lt;/p&gt;

&lt;p&gt;The plain text reader never had that option. A .txt file has no styles at all, so it has always decided what a heading is from the words on the line. That is why the same resume got 95 there.&lt;/p&gt;

&lt;p&gt;The report for the live Word file still shows the gap, because the format itself has not changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Word file    0 headings   14 paragraphs   18 bullets
Plain text   3 headings   11 paragraphs   18 bullets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The worse part
&lt;/h2&gt;

&lt;p&gt;My own guide on &lt;a href="https://atsresumereader.com/guides/pdf-or-word/" rel="noopener noreferrer"&gt;whether to send a PDF or a Word file&lt;/a&gt; used this exact behaviour as advice. A rich text test file of mine marks its headings in bold, it scored 60, and the page explained that bold is not a heading.&lt;/p&gt;

&lt;p&gt;That was a bug written up as a lesson. My own editor's importer and my plain text reader both read a bold WORK EXPERIENCE line as a heading. Only the scorer disagreed, and I had defended the scorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;The scorer now reads the words too. A line counts as a section heading, bold or not, when all of these hold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the whole line is a section name it knows, like "Work Experience", "Education" or "Skills"&lt;/li&gt;
&lt;li&gt;it does not end like a sentence and does not start in lower case&lt;/li&gt;
&lt;li&gt;it does not start with a bullet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first rule matters most. "Experience with Kubernetes" contains a section name but is a sentence, and treating it as a heading would cut a job in half.&lt;/p&gt;

&lt;p&gt;There is one condition, and it is the part my first correction left out: &lt;strong&gt;this only applies when none of the file's real headings names a section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reason is the opposite failure. In a file that does use heading styles, a bold "Skills:" line inside a job is a label, not a new section. When I let it switch the section anyway, every job after it was filed under skills, where nothing checks for dates, and a real problem in that resume disappeared from the report.&lt;/p&gt;

&lt;p&gt;So if your file sets some section names as headings and only makes the others bold, the bold ones are still read as plain text. Set them all the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second bug, found while checking the first
&lt;/h2&gt;

&lt;p&gt;Once the sections were found, I tried the template with short employer names, which is what most people have. "Shopify" instead of "Northwind Traders".&lt;/p&gt;

&lt;p&gt;The template puts the employer and the dates on one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shopify                    Jan 2015 – Sep 2017
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a long name, that line was read as the start of a new job. With a short one, the line was mostly dates, so the parser took it for another date line of the job above. The next line, &lt;code&gt;Business Analyst    Fort Collins, CO&lt;/code&gt;, then became a job of its own with no dates at all. The plain text file scored 82 for it, and Word and PDF did too once the first fix was in.&lt;/p&gt;

&lt;p&gt;Now a dated line that opens with a capitalised name, right after the previous job's bullets, starts a new job. Short names score 95 like long ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers now
&lt;/h2&gt;

&lt;p&gt;The "after" column is the code running on the live site now, and I re-ran the template files there before writing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                              before   after
Template, filled in, Word        60      95
Template, filled in, PDF         60      95
Template, filled in, text        95      95
Same, short employer names       82      95
Rich text test file              60      95
Two column PDF test file         43      68
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two column PDF still loses points, for the columns, which is the only thing that file was ever meant to show.&lt;/p&gt;

&lt;p&gt;The empty template, as downloaded, scores 82. That is not the format. It is the "Month Year – Month Year" placeholders: with no real dates in them, the jobs cannot be dated.&lt;/p&gt;

&lt;h2&gt;
  
  
  So is the template ATS friendly?
&lt;/h2&gt;

&lt;p&gt;Its structure is about as plain as it gets: one column, no tables, no text boxes, nothing in the page header, name on the first line. Every word came out, in order, in all three formats.&lt;/p&gt;

&lt;p&gt;What I cannot tell you is what Workday, Taleo or Greenhouse do with it. Those parsers are closed, and nobody outside those companies can test them properly. What I can tell you is that "bold means heading" is a guess a parser has to make, and mine guessed wrong until 30 September.&lt;/p&gt;

&lt;p&gt;If you want to make that guess unnecessary, it costs nothing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a real heading style for your section names. In Google Docs it is the dropdown that says "Normal text"; pick Heading 2. In Word, it is the Styles gallery.&lt;/li&gt;
&lt;li&gt;Keep each section name on its own line, and use the plain words: Experience, Education, Skills.&lt;/li&gt;
&lt;li&gt;If you use the template, replace every "Month Year", delete the "PLEASE DO NOT REQUEST EDIT ACCESS" line under the name, and delete the line about more templates at the bottom. My parser read the first as your headline and filed the second under skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://atsresumereader.com/guides/pdf-or-word/" rel="noopener noreferrer"&gt;PDF or Word guide&lt;/a&gt; now says the opposite of what it said until 30 September, and says so on the page rather than quietly. If you want to see what a parser pulls out of your own file, the &lt;a href="https://atsresumereader.com/resume-checker/" rel="noopener noreferrer"&gt;checker&lt;/a&gt; runs in your browser and the file never leaves it.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Your resume scored 70 out of 100. Nobody can tell you if that is good.</title>
      <dc:creator>Muneeb Nawaz</dc:creator>
      <pubDate>Mon, 28 Sep 2026 18:39:27 +0000</pubDate>
      <link>https://dev.to/muneeb_nawaz/your-resume-scored-70-out-of-100-nobody-can-tell-you-if-that-is-good-2nhi</link>
      <guid>https://dev.to/muneeb_nawaz/your-resume-scored-70-out-of-100-nobody-can-tell-you-if-that-is-good-2nhi</guid>
      <description>&lt;p&gt;Run your resume through any of the free ATS checkers, and you get a number. 72. 84. 61 out of 100. Then some advice, then usually a paywall.&lt;/p&gt;

&lt;p&gt;Here is the thing nobody says out loud: that number is meaningless, and not because the tools are dishonest. It is meaningless because none of them publish the scale. You cannot tell whether 70 is a pass, a warning, or a disaster, because nothing anywhere states what 70 was supposed to mean.&lt;/p&gt;

&lt;p&gt;A number without a scale is a vibe with a decimal point.&lt;/p&gt;

&lt;p&gt;I built one of these tools, so this is a confession as much as a writeup. Here is the entire scale, the ceiling, and the arithmetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;88 to 98   Parses clean     Should come through intact.
70 to 87   Minor issues     Will parse, with some detail lost.
40 to 69   At risk          Expect fields to go missing.
 0 to 39   Breaks           Most of this will not survive.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So 70 is the very bottom of "minor issues". One point lower and the same document is "at risk". If a checker hands you 70 and a green tick, that is a decision somebody made about presentation, not a fact about your file.&lt;/p&gt;

&lt;p&gt;Notice the bands are uneven. "At risk" is thirty points wide and "parses clean" is ten. That is deliberate. Once a document is broken, how broken stops mattering much, and the interesting resolution is all at the top where small things separate a clean parse from a nearly clean one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ceiling is 98, not 100
&lt;/h2&gt;

&lt;p&gt;This is the part I expect people to argue with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * The ceiling is 98, not 100.
 *
 * No parser is guaranteed, none of them publish their rules, and a perfect
 * score would be a claim about software we cannot see. Two points is the
 * honest cost of that.
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CEILING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Workday, Taleo, Greenhouse, Lever, and iCIMS do not document how they parse. I can test against real extractors and I do, but I cannot test against systems I have no access to. A 100 would be a promise about closed software I have never run. Two points is what that uncertainty costs, and it is the same two points for everybody.&lt;/p&gt;

&lt;p&gt;Nobody's resume gets a perfect score from this thing. That is not a bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arithmetic used to be broken
&lt;/h2&gt;

&lt;p&gt;The first version subtracted. Find a problem, subtract its cost, show what is left. Obvious, and wrong.&lt;/p&gt;

&lt;p&gt;The costs added up to 197 against a ceiling of 98. So any document with a few real problems hit zero and stayed there. Fix a column layout on a resume that also had a table and a missing work history, and the number did not move, because it had already bottomed out. The top half of the range was doing nothing at all.&lt;/p&gt;

&lt;p&gt;It multiplies now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;deductions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;CEILING&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each finding takes a percentage of what is left rather than a flat slice of the total. Multiplying cannot reach below zero, so nothing ever clips, and every fix moves the number no matter how many problems the file has. A fatal finding costs 100, which makes its factor zero, so a scanned image reaches zero through the same arithmetic as everything else with no special case.&lt;/p&gt;

&lt;p&gt;The side effect is that marginal gain scales with what is left to gain. Fixing a table on a nearly clean resume is worth more than fixing the same table on a wrecked one, which is also true in reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the costs actually are
&lt;/h2&gt;

&lt;p&gt;Not secret either:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;noWorkHistory      26
undatedEntries     14
orphanEntries      10
unmappedHeadings    8
mixedDateFormats    6
ongoingWording      5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;noWorkHistory&lt;/code&gt; sits at 26 because a resume whose career section a parser cannot locate was landing in "minor issues" at a lower weight, and "will parse, with some detail lost" is an absurd thing to say about a document whose entire work history is unmapped.&lt;/p&gt;

&lt;p&gt;That is the kind of judgement call every one of these tools makes constantly, and none of them show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with any ATS score
&lt;/h2&gt;

&lt;p&gt;Ignore the number. Read the findings.&lt;/p&gt;

&lt;p&gt;The number is a summary of a list, and the list is the useful part. "The first text in your file is not your name" is actionable. "You scored 74" is not, especially when you have no idea what 74 was measured against.&lt;/p&gt;

&lt;p&gt;If a checker will not tell you its scale, its ceiling, or what each finding costs, you are looking at a lead magnet, not a measurement.&lt;/p&gt;

&lt;p&gt;Mine is at &lt;a href="https://atsresumereader.com/how-the-score-works/" rel="noopener noreferrer"&gt;atsresumereader.com&lt;/a&gt; with the full band table and the weights. It runs in the browser, so nothing gets uploaded, and there is no paid tier holding the rest of the report.&lt;/p&gt;

&lt;p&gt;Argue with the weights. They are judgement calls, and I would rather defend them in public than hide them.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I parsed the same resume six ways to settle "PDF or Word"</title>
      <dc:creator>Muneeb Nawaz</dc:creator>
      <pubDate>Wed, 16 Sep 2026 06:18:34 +0000</pubDate>
      <link>https://dev.to/muneeb_nawaz/i-parsed-the-same-resume-six-ways-to-settle-pdf-or-word-mnk</link>
      <guid>https://dev.to/muneeb_nawaz/i-parsed-the-same-resume-six-ways-to-settle-pdf-or-word-mnk</guid>
      <description>&lt;p&gt;Search "should I send my resume as PDF or Word" and you get a few hundred articles that all say some version of the same thing. PDF is safer. Word is safer. It depends on the company. Every one of them is somebody's view, because answering the question properly means running both files through a parser and reporting what came back, and almost nobody writing those articles has a parser.&lt;/p&gt;

&lt;p&gt;I had built one for something else. So I ran the file through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;One resume. Same person, same words, same sections. Saved six ways, then put through the same extraction and scored out of 98, where the score is how much of the document survived into the structured record a recruiter actually searches.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Saved as&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;What it lost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;Missing links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenDocument&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;Missing links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;Missing links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rich text&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;Missing links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;Page header, Missing links&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The question assumes the answer is in the left column. It is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Word gap is not Word
&lt;/h2&gt;

&lt;p&gt;Word scores 80 and PDF scores 95, and the entire 15 point difference is one finding: &lt;strong&gt;page header&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.docx&lt;/code&gt; in that table puts the name, email and phone number in the header region, which is exactly where a Word template puts them. Plenty of parsers discard the header before they start reading the body, on the reasonable theory that headers contain page numbers and document titles rather than content. So the contact details never arrive, and the record lands in the system with nobody attached to it.&lt;/p&gt;

&lt;p&gt;Move that one line into the body and the file is still a &lt;code&gt;.docx&lt;/code&gt;. Nothing about the container was ever the problem.&lt;/p&gt;

&lt;p&gt;It runs the other way too, which is the part that settles it. A PDF laid out in two columns scores 68. Being a PDF saved it from nothing, because the extractor reads a two column layout in the order the text was drawn, not the order a human reads it, and the job titles end up interleaved with the skills list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rich text, corrected
&lt;/h2&gt;

&lt;p&gt;When I first published this, rich text scored 60, and this section explained why: the file marks its section headings by making the text bold rather than applying a heading style, and my scorer only recognised a heading by its style. It ended with "Bold is not a heading. In any format."&lt;/p&gt;

&lt;p&gt;That was my scorer being stricter than the rest of my own code. The importer that turns an uploaded resume into an editable one, and the reader for plain text files, had always treated a line that just says WORK EXPERIENCE as a heading. Only the scorer did not, so a clean rich text file was scored as a resume with no work history. On 30 September I changed the scorer: when none of a file's headings names a section, a line holding nothing but a section name now counts as a heading. In a file that styles some section names as headings and only bolds the others, the bold ones are still read as plain text, so set them all the same way. Rich text now scores 95 and ties with the other clean formats, and the two column PDF, which had been losing points for the same reason on top of its layout, went from 43 to 68. Whether a closed ATS reads a bold heading the same way, I have no way to test, and nobody outside those companies does either.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown wins for a boring reason
&lt;/h2&gt;

&lt;p&gt;Markdown is the only file that scored 98, and it is not because Markdown is magic. It is the only one of the six carrying a portfolio URL written out in full. The other four clean formats tie at 95 losing the same three points for the link none of them has.&lt;/p&gt;

&lt;p&gt;The format did not earn that. The content did. Which is the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the numbers honest
&lt;/h2&gt;

&lt;p&gt;Every number on the site is recomputed from the actual fixture files on each test run. This copy is not, which is why, when that test caught the change described above on 30 September, I corrected it here by hand. The published evidence lives in a typed array, a test reads the six real documents off disk, runs them through the same extraction the product uses, and compares. Change a weight in the scorer and the test fails with the new number in the assertion message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; still scores &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;scoreExtraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extraction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;recoverFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extraction&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; score moved`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a second test that matters more than it looks. It asserts the six files are the same resume, by comparing the name and email the parser recovered from each. The first version compared word overlap and read 0.84 across the six, because Markdown carries a URL and its own syntax while plain text carries neither. A threshold loose enough to pass that is loose enough to pass a different resume by the same author, so it compares recovered fields instead. If someone swaps a fixture, the scores stay plausible and the sentence next to them quietly becomes a lie. Those tests are what stand between the page on my site and being wrong six months from now. Neither can reach a copy like this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually send
&lt;/h2&gt;

&lt;p&gt;Send what the posting asks for. Somebody there knows what their system accepts, and ignoring an explicit instruction is a worse risk than either format.&lt;/p&gt;

&lt;p&gt;Where nothing is specified, send a PDF exported from a word processor. Never one scanned or exported as an image: that file has no text layer at all and scores zero. Not a low score, nothing.&lt;/p&gt;

&lt;p&gt;Then stop thinking about the format. Moving contact details out of a page header was worth 15 points on this document. Choosing between PDF and Word, with the layout already clean, was worth nothing at all. They tie.&lt;/p&gt;

&lt;p&gt;The full write up, with the failure cases and the deduction table, is here: &lt;a href="https://atsresumereader.com/guides/pdf-or-word/" rel="noopener noreferrer"&gt;PDF or Word? The same resume, parsed both ways&lt;/a&gt;. The parser runs in the browser, so if you want to try it on your own file, nothing gets uploaded.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
