In 2022, I spent about a year applying for more than 2,200 jobs.
I got two interviews.
Two.
After a while, I started doubting everything. Was I aiming too high? Was my CV rubbish? Was it me?
I didnāt know then that most of my CVs were probably screened by software before a person ever saw them. Applicant tracking systems (ATS) pull information from your CV: things like your name, contact details, job titles, dates and skills.
Iād designed my CV to look good. Everything was laid out to look polished, and it never occurred to me that software might struggle to read it. I didnāt even know applicant tracking systems existed.
I only learned about ATS when I started studying multimedia design. The more I learned, the more I wanted to build something that might help other people avoid going through what I did.
Thatās how I ended up building ATS.rip.
What it does
Upload your CV as a PDF, DOCX or TXT file, and optionally paste in a job ad text. About a minute later, you can compare the optimised CV with your original CV, page by page.
If you like the result, pay once and download it as a Word file. If you donāt like it, just close the tab. No account, no subscription, and your CV isnāt kept afterwards.
The boring stack, on purpose
No framework, no bundler. Just plain HTML pages, a little vanilla JavaScript, Tailwind for the CSS, and PHP on regular shared hosting. Stripe handles the payment.
I chose a simple setup because I wanted to understand every part of it and be able to deploy it by uploading files. For a one-person project, thatās been more valuable than having a clever architecture.
The hard part wasnāt the AI
The tool uses a language model to optimise the CV, but the real work was figuring out the rules around it.
Ask a general chatbot to tailor your CV to a job ad, and it might add skills or keywords you donāt actually have. Thatās a serious problem when the result is something youāll send under your own name.
So most of the prompt is about what the model must not do. It canāt invent, infer or exaggerate anything that isnāt already in the CV. It can use wording from the job ad only when the CV supports the same fact. And it should focus on selecting, ordering and structuring the information - not rewriting it for the sake of rewriting.
The CV also stays in its original language. Paste an English job ad alongside a German CV, and the result is still in German.
Showing the ābeforeā without a server
I wanted people to compare the result with their own CV, so the original file is displayed right in the browser: pdf.js handles PDFs, docx-preview handles Word files, and other formats appear as plain text on an A4 sheet.
The file doesnāt need to be sent anywhere just to show it. Its fonts and colours stay intact, too.
Building the Word file by hand
The PHP backend creates the downloadable .docx itself. It writes the XML parts and zip container without relying on a library.
A .docx is essentially a zip file full of XML files. Once Iād read the spec for the parts I needed, it turned out to be surprisingly manageable. Doing it myself also means I can control exactly what goes into the document: one column, real text and standard headings: the sort of layout parsers can handle well.
Seven languages, one of them right to left
The site is available in English, German, Spanish, French, Chinese, Hindi and Arabic.
Arabic taught me a lot. I had to use logical CSS properties throughout (padding-inline-start instead of padding-left), for example, and handle Latin terms like file extensions so they wouldnāt appear in the wrong order.
No tracking
There are no analytics scripts or tracking pixels. I count funnel steps on the server without cookies, which gives me a rough idea of where people drop off without telling me who they are.
For a tool that handles CVs, that felt like the only honest choice.
What I would have told myself back in 2022
Before sending another 100 applications, check whether software can actually read your CV. Copy the text from your PDF and paste it into a plain text editor. If your name, email or job titles come out jumbled or missing, thatās roughly what a parser is dealing with too.
If you want to see what the tool makes of your CV, itās at ats.rip.
Iāve also written a few articles about how these systems actually work, based on the vendorsā own documentation rather than the usual myths: ats.rip/explained/articles.
I will be happy to answer questions about the build, the prompt rules or the job hunt itself. šš
Top comments (2)
The no-invented-skills rule is the most interesting engineering constraint here.
Do you validate the generated document against the input after the model responds, or rely on the prompt? I'd test a job ad asking for Kubernetes against a CV that only lists Docker, plus a case where an improved bullet quietly adds a number. A visible diff for those changes would help the candidate catch more than layout problems.
Hi Emily,
Thanks for asking. š It's exactly the part I spent the most time on.
In the product itself it relies on the prompt: the model is told it canāt invent, infer or upgrade anything, and it may only use wording from a job ad when the CV already supports the same fact. So a job ad asking for Kubernetes should never turn a CV that only lists Docker into a Kubernetes CV.
To see whether that actually holds, I run an automated test set with exactly the same prompt and model as the live tool: 32 fictional CVs in eight languages, each run 50 times, including ātrapā job ads that ask for things the CV doesnāt have. A script then flags new numbers, names and tools, phrases lifted from the job ad, and verbs that have been upgraded (ātook part inā becoming āledā). Your added-number case is one of those checks.
A check after the model responds, inside the product, is a good idea, and so is a visible diff. Today the candidate can flip between their original and the optimised CV page by page before paying, but a highlighted diff would make a quietly added number much easier to spot. Iām adding both to my list.
Thanks for taking the time, I really appreciate it. šš¼
Some comments may only be visible to logged-in visitors. Sign in to view all comments. Some comments have been hidden by the post's author - find out more