Resume formatting for cleaner matches
Sweepy scores the words inside your resume file. When it opens the file, it pulls out the text and compares it against job postings. Your formatting decides how much of that text the engine reads.
A second column, a text box, or a scanned page can hide your entire skills list from the engine. One formatting fix often lifts your match scores without changing a word of your experience.
This page covers how Sweepy reads your resume. For the scoring formula and the report layout, see Understanding your results.
What Sweepy can read
Sweepy reads PDF and Word files at resume.path. Point the path at a .docx, and Sweepy reads its paragraphs and tables directly. You don't convert a Word resume first. Keep the .docx when your editor offers both formats. A third-party converter can rebuild the page in a different order, and Sweepy then reads that changed order.
When you need a PDF copy, run Sweepy's own converter. It rebuilds a clean single-column PDF from those same paragraphs and tables. Extraction returns the same words from either file. See Convert any document with --convert.
These problems block extraction:
- Non-PDF, non-DOCX files. Only a PDF or a DOCX produces text Sweepy can score. A
.pages,.odt,.doc, or.txtfile gives the engine nothing. Sweepy's converter handles.txtand.mdfiles, and it handles.docfiles through Microsoft Word. Export a.pagesor.odtfile from its own app first. - Scanned pages with no text layer. A scan gives Sweepy a picture of words, not words. Sweepy doesn't find a text layer, so scoring falls back to
must_have_skillsalone. - Password-protected PDFs. Sweepy can't open encrypted files. Remove the password before you save the file.
- Missing or corrupt files. A wrong path logs a warning and skips extraction. Only
must_have_skillsdrives the score then.
When Sweepy can't read your resume and you leave must_have_skills empty, every role scores 75%. That number ranks nothing, because it applies to every posting in the report.
Run optical character recognition (OCR) on a scan before you point Sweepy at it. OCR adds a real text layer. The engine then reads your words. Most scanner apps and PDF editors include an OCR option.
Run the copy-paste test
Open your resume, select all the text, and paste it into a plain text editor. Plain text shows the extraction order, which a rich text pane can hide.
- On Windows, open the PDF in Edge, Chrome, or Acrobat. Press Ctrl+A and Ctrl+C, then paste into Notepad.
- On macOS, open the PDF in Preview and press ⌘+A, then ⌘+C. Switch TextEdit to plain text with ⇧+⌘+T before you paste.
- On Linux, open the PDF in Evince or Okular, then press Ctrl+A followed by Ctrl+C. Paste the text into an editor such as gedit or Kate.
On a macOS keyboard, ⌘ is the Command key and ⇧ is Shift.
If the paste looks scrambled, empty, or out of order, Sweepy reads the same thing. Fix the file before you run a sweep.
Formatting that breaks a sweep
Text extractors read straight across the page. Layout changes the order of the text they return. Applicant tracking systems run the same kind of extraction.
| Formatting | What Sweepy reads |
|---|---|
| Two or more columns | Columns interleave and scramble your text, because the extractor reads straight across the page. |
| Tables, text boxes, and sidebars | Content can land out of order or merge with a neighbor. |
| Images, icons, and charts | Extraction skips anything drawn as a picture, including skill bars and logos. |
| Headers and footers | Many parsers skip that region. Keep your name and contact details in the body. |
| Hyphenated line breaks | A term split across two lines (e- then discovery) breaks the whole-term match. |
| Ligatures and decorative fonts | fi and fl ligatures and unusual glyphs can extract as garbage. |
| Emoji and custom bullet glyphs | These drop or garble. Use a plain hyphen or a round bullet. |
What applicant tracking systems prefer
Applicant tracking systems (ATS) parse hundreds of resumes with the same kind of extraction that Sweepy uses. Give them one clean column of real text.
- One column, top to bottom. Skip the two-column design with a sidebar.
- Plain section headings. Use
Experience,Education, andSkills. Avoid tables and icons in headings. - Real text only. No image-based headings, logos, or skill bars.
- Standard fonts. Arial, Calibri, Helvetica, or Times New Roman at 10-12pt.
- Plain bullets and consistent dates. Use one date format throughout, such as
Jan 2024 – Present. - Reverse-chronological order. Most recruiters and parsers expect it.
- Contact info in the body. ATS parsers often strip headers and footers.
- Export from your word processor. Save a PDF from your editor, and keep the
.docxin case a portal requires it. - Mirror the job's wording. If a posting says
e-discoveryordocs-as-code, use that exact term so matching catches it.
Keep one clean resume for most applications. Sweepy can send a different file per track, because tracks[].route_keywords picks the resume to attach. That setting never changes the match score.
Keywords come from must_have_skills
Sweepy scores each posting against two overlap measures:
| Overlap | Weight | What it measures |
|---|---|---|
| Requirement overlap | 60% | How much of the posting's requirements your resume already shows |
| Keyword overlap | 40% | How much of your resume's vocabulary the posting repeats |
The posting defines what the match means, so requirement overlap carries 60% of the score. Required qualifications count twice the weight of unlabeled terms. Preferred qualifications count half.
Your term list combines must_have_skills with a short built-in list of common tech and legal terms. Alex's profile lists the same skills:
resume:
path: "Alex_Rivera_Resume.pdf"
must_have_skills:
- "Westlaw"
- "LexisNexis"
- "e-discovery"
- "Contract Review"
- "Legal Research"
The built-in list covers few terms, so Sweepy also reads your resume directly. It ranks terms in four tiers, strongest first:
- Your Skills section.
- The built-in list.
- Your most frequent non-stopword terms.
- Capitalized phrases that a stronger tier already contains.
The strongest 60 terms survive, in that order. Posting terms follow the same discipline, capped at 25, and come from the posting's requirements or qualifications block when it labels one.
Treat must_have_skills as your real term list. Add these:
- Every skill, tool, and platform you name in your resume, such as
Westlaw,Relativity, orcase management. - Terms your industry uses, even when your resume words them differently, such as
e-discoveryorlitigation support. - Exact phrases from postings you want. Sweepy matches whole words, so copy the posting's wording when it matters.
Each term counts in the keyword overlap denominator. A long list still lowers the score for roles that miss most of it, so keep the list to terms you actually have.
Adding industry-specific terms
Matching ignores case and handles plural forms. Sweepy adds a built-in alias list for common tech acronyms, including:
API/application programming interfaceUX/user experienceWCAG/web content accessibility guidelines
Add resume.synonyms to cover the rest of your field's vocabulary:
resume:
synonyms:
- ["e-discovery", "ediscovery", "electronic discovery"]
- ["legal research", "case law research"]
- ["docketing", "case calendaring"]
- ["legal assistant", "legal secretary"]
- ["contract review", "contract analysis", "agreement review"]
Sweepy treats every term in a group as interchangeable. A posting that writes electronic discovery matches a resume that writes e-discovery, and vice versa.
- A group needs at least two terms. Sweepy ignores a group with one term.
- Matching still requires the whole phrase. List
legal researchandlegal researcheras separate terms when you want both to count.
The configuration reference documents this setting field by field.
How rankings work
The match percentage measures shared vocabulary. A role that fits through context can still score low. High overlap flags a posting for a closer look. You decide whether to apply.
Sweepy compares terms, and it never guesses at intent. Connect a large language model (LLM) through the Model Context Protocol (MCP) when you want Sweepy to use context and advanced reasoning in its results.