Messy CV benchmark: Formzed vs OpenCATS
Real CVs are messy. Skills hide under other names, get misspelt, sit in a row of logo badges or on a scanned page, and the word a filter looks for sometimes means something else. We wrote 400 such CVs, froze an answer key, and searched them for four jobs. Formzed's AI CV matching found 127 of the 141 qualified people with 2 wrong picks. Keyword search in OpenCATS, a long-running open-source applicant tracking system, found 67, and picked 28 people who weren't qualified.
Every CV, person, employer and contact detail is made up. Both tools ran once on the same 400 PDFs and the same four job descriptions, in November 2026. Formzed's AI cost is shown in US dollars at the model's list price.
Qualified people found
Formzed. OpenCATS: 48% with recruiter terms, 43% with the job ad's own words
Wrong picks
Formzed. OpenCATS picked 28 wrong people with recruiter terms
Qualified in each top 10
Four jobs, ten places each. OpenCATS: 28 of 40
AI cost of the whole test
Reading all 400 CVs ($0.27) and matching them to four jobs ($1.03)
The CVs, the jobs and the answer key
We generated 400 full-length CVs in one ordinary layout: a summary, education, three or four jobs with dates and bullet points, projects, a technical skills block, certificates, hobbies and a referee. 300 run to two pages. 68 were written near each of four jobs, and 128 belong to people in other work (nurses, teachers, accountants, sales), so the pile looks like a real inbox.
The 400 CVs, by the job each was written near
The 68 CVs written near each job
Near misses are deliberate: someone one must-have short, with a word on the CV that looks like the missing skill, with too few years, or (backend and warehouse) unable to start in time.
Each skill a person really has is written one way, chosen at random: in the job ad's own words, under another name, misspelt, only inside a sentence, as a picture of skill badges (64 CVs) or on a scanned page with no text in the PDF at all (36 CVs). 62 CVs carry a trap: a word that looks like a skill the person doesn't have.
How a skill can be written
| Written as | Examples from the CVs |
|---|---|
| Written plainly | PostgreSQL · Forklift licence · BambooHR |
| Other name | PlanetScale for MySQL · BY WMS for Blue Yonder · PIT licence for forklift · Welcome days for new staff for onboarding |
| Misspelt | Golnag · Snoflake · Workdy · SAP EWW · Forkliftt licence |
| Inside a sentence | “Scheduled and monitored pipelines with Airflow.” |
| Skill badge (picture) | The skills block drawn as a row of badges, with no text behind it |
| Scanned page | The whole CV is a photo of a printed page |
| Trap (must not count) | “Took the team go-karting after peak season.” · “Grew up near Manhattan, Kansas.” · “Learning dbt next quarter is on my development plan.” |
The four jobs have full job descriptions, word for word below, and each has three must-haves: a minimum number of years, worked out from the CV's own dates, and two skills or kinds of experience. Two of them also need the person to start within two months, which the application form asks. Who is qualified came from the generator's own record of each person, not from reading the CVs, and the key was frozen and hashed (bc13a99f…) before either tool saw a CV.
| Job | Must have | Qualified |
|---|---|---|
| Backend Engineer | 3+ years · PostgreSQL or MySQL · One of Go, Java, Python, Node.js, C# | 40 |
| Data Engineer | 2+ years · Python or Scala · One of Spark, Airflow, dbt, Kafka, Snowflake | 43 |
| HR Generalist | 2+ years · Recruitment or onboarding · An HRIS: BambooHR, Workday, SAP SuccessFactors or HiBob | 39 |
| Warehouse Supervisor | 2+ years · Forklift / MHE licence · A WMS: SAP EWM, Manhattan, Oracle WMS or Blue Yonder | 19 |
The four job descriptions, as both tools got them
Backend Engineer at Lumora (fictional company) About the role Lumora runs a booking platform used by 2,000 clinics. You'll join a team of six engineers who build and run the APIs and services behind it. The role is fully remote. What you'll do - Design, build and run the services behind our public and internal APIs. - Own your services in production: monitoring, on-call (one week in six) and fixing what breaks. - Review code and design docs with the rest of the team. - Work with product managers to break large features into small releases. Must have - 3+ years of professional software engineering experience - PostgreSQL or MySQL - Experience with one of: Go, Java, Python, Node.js or C# Nice to have - Docker - Cloud experience (AWS or GCP) Start date: you can start within 2 months. Location: remote.
Data Engineer at Fieldline (fictional company) About the role Fieldline sells farm equipment across Europe. Our data team of four builds the pipelines that feed finance, sales and service reporting. The role is remote, with any start date. What you'll do - Build and maintain batch and streaming pipelines from our ERP, CRM and telematics systems. - Model data in the warehouse so analysts can trust the numbers. - Add tests and alerts so broken data is caught before it reaches a dashboard. - Work with analysts on what each new source should look like. Must have - 2+ years of professional data engineering experience - Python or Scala - One of: Spark, Airflow, dbt, Kafka or Snowflake Nice to have - SQL - Data quality checks Start date: any. Location: remote.
HR Generalist at Brightwater Housing (fictional organisation) About the role Brightwater is a housing association with 450 staff across 12 sites. You'll join a people team of five and look after the day-to-day people processes for two regions. Any start date. What you'll do - Advise line managers on policy, absence and employee relations. - Run hiring and new-starter processes for your regions. - Keep employee records and our HR system accurate. - Support projects such as policy reviews and engagement surveys. Must have - 2+ years of experience working in HR - Recruitment or onboarding experience - Experience with an HRIS: BambooHR, Workday, SAP SuccessFactors or HiBob Nice to have - CIPD qualification - Employee relations casework Start date: any.
Warehouse Operations Supervisor at Kestrel Logistics (fictional company) About the role Kestrel runs a 220,000 sq ft distribution centre for grocery and household brands. You'll supervise one of three shifts, with around 40 operatives. What you'll do - Plan and run your shift: labour, picking, loading and dispatch to cut-off times. - Keep the site safe: briefings, checks, near-miss reporting. - Coach team leaders and operatives and handle day-to-day people issues. - Report shift performance and fix stock and system errors with the WMS team. Must have - 2+ years supervising warehouse or logistics staff - A forklift / MHE licence - Experience with a WMS: SAP EWM, Manhattan, Oracle WMS or Blue Yonder Nice to have - IOSH or similar health and safety training - Peak planning Start date: you can start within 2 months.
What OpenCATS is
OpenCATS is a free, open-source, web-based applicant tracking system written in PHP on a MySQL database. It began as CATS, built by Cognizo Technologies around 2005 to 2007; that project later split into the open-source OpenCATS and a separate commercial product. Its public code repository dates from 2009, which makes it one of the longest-running open-source applicant tracking systems. It is still maintained: version 0.12.0 came out on 22 October 2026, and it's the version we ran.
It does what recruiters expect of an applicant tracking system: job orders with a pipeline of candidates for each, candidate records with their resumes and contact history, companies and their contacts, career portal pages, lists, a calendar, email and reports. To find people by their resumes it pulls the text out of each uploaded file, stores it, and returns every resume that contains the words searched for. Results come back in a fixed order (by last name), not ranked by how well someone fits. Its documentation says resume search has been unreliable in some versions and is being restored, so we didn't rely on the search page: we called the search code in the current release directly.
That makes it a fair stand-in for the keyword filter inside many applicant tracking systems: exact words in, a list out. We installed it locally and used its own code to pull the text out of each PDF and to build each resume-search query, run on its own database. Its combined AND/OR queries didn't work, so we ran one search per keyword and combined the lists in code, exactly as the query meant.
Sources: the OpenCATS repository and its releases, the OpenCATS documentation, and the CATS 0.8.0 quick guide (© 2005–2007 Cognizo Technologies). OpenCATS code is under the Mozilla Public License 2.0.
How each tool searched
OpenCATS
Each job's must-haves became keyword groups: at least one word from every group had to be on the CV. We searched twice. Once with the job ad's own words ("strict terms"), and once with the other names a recruiter would add, such as Postgres, Golang, PySpark, talent acquisition, FLT and JDA ("recruiter terms"). OpenCATS can't read years from dates, so the start-date answer was the only filter applied afterwards, by hand. Its top 10 is the first ten names in its list.
Formzed
The same 400 PDFs were sent to a Formzed job application form as uploads. Formzed read every CV, including the pictures and the scanned pages, and we pasted each full job description into its AI CV matching with "Find the 10 best candidates for this job". It worked out the must-haves itself and judged every candidate against them. A pick is anyone it judged to meet every must-have, and its top 10 is its own ranking.
What each found
Across the four jobs Formzed found 127 of 141 qualified people (90%). OpenCATS found 67 with recruiter terms and 60 with strict terms. The gap is widest where keywords can't see: on the warehouse job, where most qualified people had a licence or system in badges, under another name or misspelt, OpenCATS found 5 of 19.
Qualified people found, by job
Everyone each tool picked
Found against right, per job
Top right is best: most qualified people found, and few wrong ones among the picks. The shaded corner is 80% or more of both.
The top 10
A recruiter mostly reads the top of the list. Formzed put a qualified person in 39 of the 40 top-10 places. OpenCATS doesn't rank, so its first ten are simply the first ten names alphabetically among its matches: 28 of 40 were qualified with recruiter terms and 26 with strict terms.
Qualified people in each top 10
Filled dots count the qualified people among the first ten listed; they don't show the order.
Where keywords go blind
Split by how the skill was written, the two tools are level when it's spelt out plainly or sits inside a sentence. Keyword search can't see skills in pictures or on scanned pages, and it misses misspellings. For the 72 qualified people whose skills were on a scanned page, in badges or misspelt, Formzed found 64 and OpenCATS 7.
Qualified people found, by how their skills were written
A person counts under the hardest way any of their must-haves was written, from scanned page down to written plainly. For OpenCATS this counts the people its keyword search returned, before the start-date filter.
Wrong picks
A keyword can't tell a skill from a word that only looks like one. OpenCATS with recruiter terms picked 16 people for a trap word on their CV and 12 with too few years, which it has no way to read from dates. Formzed picked 2 wrong people, both for a trap word.
Why the wrong picks were wrong
Formzed's two wrong picks
| Job | The line on the CV | Counted as |
|---|---|---|
| Data Engineer | Organised the Snowflake winter fun run. | Snowflake |
| Warehouse Supervisor | Heard Blue Yonder mentioned on a podcast. | Blue Yonder |
The AI judging the requirement said no both times. The step that reads each CV first had listed the word among the person's skills, and that list was trusted over the judgement. That step has been fixed since this test (a reading's list now counts only skills the CV itself lists), but the fix hasn't been measured on a new set of CVs yet.
What Formzed missed
Formzed missed 14 qualified people. Most were judgement calls on wording a recruiter would accept: duties described in other words, earlier jobs whose duties counted toward the years, and a hosted edition of a database. Formzed's matching has been changed since to catch each of these, but the changes haven't been measured on a new set of CVs yet, so the numbers here are the test as it ran.
The 14 misses, by cause
“Welcome days for new staff” not read as onboarding, “Interview scheduling and offers” not read as recruitment (HR Generalist)
A Data Analyst job spent building pipelines, or a current supervisor job, left out of the years
PlanetScale (a MySQL service), “Blue Yonnder”, “SAP EWW”
MySQL and recruitment on two scanned CVs
What it cost
Formzed's AI cost for the whole test was $1.30: $0.27 to read all 400 CVs once, scans and badges included, and $1.03 to match them to the four jobs. That's under a cent per CV for all four jobs together. A CV is read once, so matching the same pile to another job costs only the matching.
Where the $1.30 went
Per-job matching costs are rounded to the cent, so they add up to a cent more than the total.
Each job
| Job | Matching cost | Per CV |
|---|---|---|
| Backend Engineer | $0.13 | $0.0003 |
| Data Engineer | $0.30 | $0.0008 |
| HR Generalist | $0.32 | $0.0008 |
| Warehouse Supervisor | $0.29 | $0.0007 |
OpenCATS is free to run on your own server, and its search uses no AI.
Every number
| Job | Tool | Found | Picked | Wrong | Top 10 |
|---|---|---|---|---|---|
| Backend Engineer | Formzed | 38 of 40 | 38 | 0 | 10 of 10 |
| Backend Engineer | OpenCATS, recruiter terms | 22 of 40 | 26 | 4 | 9 of 10 |
| Backend Engineer | OpenCATS, strict terms | 19 of 40 | 23 | 4 | 8 of 10 |
| Data Engineer | Formzed | 41 of 43 | 42 | 1 | 10 of 10 |
| Data Engineer | OpenCATS, recruiter terms | 23 of 43 | 33 | 10 | 7 of 10 |
| Data Engineer | OpenCATS, strict terms | 23 of 43 | 33 | 10 | 7 of 10 |
| HR Generalist | Formzed | 32 of 39 | 32 | 0 | 10 of 10 |
| HR Generalist | OpenCATS, recruiter terms | 17 of 39 | 27 | 10 | 7 of 10 |
| HR Generalist | OpenCATS, strict terms | 13 of 39 | 22 | 9 | 6 of 10 |
| Warehouse Supervisor | Formzed | 16 of 19 | 17 | 1 | 9 of 10 |
| Warehouse Supervisor | OpenCATS, recruiter terms | 5 of 19 | 9 | 4 | 5 of 10 |
| Warehouse Supervisor | OpenCATS, strict terms | 5 of 19 | 9 | 4 | 5 of 10 |
The dataset
Everything is free to download and re-run against any CV screening tool: the 400 CVs as PDFs, the four job descriptions, the frozen answer key with how each skill was written and every trap, the OpenCATS search terms and both tools' scored results. It's under CC BY 4.0.