
Apply Mate
Apply Mate
Apply Mate
Renas Hassan
May 10th, 2025
Overview
Applying for jobs sucks. It's tedious. It takes forever.
When I was applying for jobs last year I found myself in that frustrating situation where you have to repeat the same process over and over.
Search for relevant jobs. Then tweak your resumé and cover letter to match each one.
And to make it worse, you often have to fill out the same info again on the company's own site.
Well, I got annoyed by this process and when I get annoyed I start exploring solutions.
It sparked an idea:
Can't we automate this process with AI?
That's when this project was born, an AI automation tool that applies for jobs on your behalf.
The problem & motivation
The main issue with applying for jobs is that you often have to customize your application to each job.
Reusing the same cover letter and resumé makes your application too generic. It is very easy for a recruiter to spot as well, and you're probably going to get disqualified because of that.
If companies can use ATS (Application Tracking Systems) to auto-scan resumés and reject people based on a few keywords, some applications probably never even reach a real person.
So if they get to save time with tools, why shouldn't we? It only feels fair to let job applicants fight bots with bots.
Key features & functionality
Landing page
The marketing page to show what Apply Mate solves as well as the features and benefits.
Find relevant jobs
Fill in your job preferences and the relevant matches will be pulled from Google Jobs.
Apply for jobs
When you have created a job listing, the jobs that match your preferences will be shown.
Scroll through the job ads. When one looks good, open it.
The AI writes a tailored cover letter using the job ad and your resumé. You can tweak it before sending.
Emails of people at the company are fetched so you can choose who to send the application to.
Tech stack
- Core: Next.js, TypeScript
- Frontend: React, Tailwind CSS, shadcn ui, React Query
- Backend: Next.js route handlers
- Database: Prisma with PostgreSQL
- Code Quality: ESLint, Prettier, Husky
- Libraries: Langchain, Open AI, AWS S3 SDK, Zod
Challenges & learnings
Working with AI you have to be careful with the type of output it generates.
One common issue is hallucinations, where the model generates information that is not in the context. Basically, straight up lying.
I learned the importance of prompt engineering and how much of an impact it actually makes to the quality of the output.
Just tweaking the prompt slightly could make the difference between a good and a bad cover letter.
I noticed it sometimes lied about the years of experience I had just to match the job description. Or, it would answer in a different language than the job ad.
In order to combat this, I used guardrails to tell the model what it is not allowed to do in the prompt.
Below are my main learnings for effective prompting:
- Use role-prompting — tell the model what role to play, for example: "You are an expert senior engineer."
- Give examples of how the result should look like
- Make sure to guide the model explicitly, telling it exactly what to do. Avoid ambiguity.
- Add guardrails, tell it what it is not allowed to do.
Here is the prompt I used to generate the cover letters:
Outcome
Last year, I decided to apply to some jobs as a test. Out of 16 applications, 6 responded. Either the position was already filled, or I was redirected to apply on their own platform
This was a very small sample size and I would need to do more testing to determine the effectiveness of this method. Still, a 37.5% response rate on mostly automated applications is solid.
The main drawbacks with this method is that when you apply via email most companies prefer you apply via their job platform. However, automating the process with AI to apply for jobs on a very diverse range of websites is extremely hard since they're all different, and we can't automate that process effectively yet.
Later, I built another AI job automation tool, this time it was a Chrome extension that could efficiently search jobs on LinkedIn with the Easy Apply method.
Since each form is a bit different, I used AI to detect the different types of fields and questions, and had it take different actions based on the type of field. It could be radio-buttons, dropdowns, text fields, upload fields etc. For text inputs it generated relevant answers based on the job ad and my resumé.
This method was very effective, and could search hundreds of jobs every hour completely automated.
Did it help me get a job? Not really.
Classic dev moment: spend weeks automating something that saves 20 minutes.
Task failed successfully.