Avi KukshalApplyer

Applyer

A job application dashboard that tracks everything in one place

Type
Local web app for one user
Year
2026
Stack
Next.js, TypeScript, SQLite, Playwright, Claude
Status
Working
A feed of job postings, each with a match score out of 100 and a one-line reason
The feed. Every new role gets a score out of 100 and one line on why.

Overview#

Applyer watches company career pages and scores every new role against a profile. For the roles you pick, it prepares a tailored CV, a cover letter and a short email to the right person. After that it reads the replies and keeps a tracker up to date.

It runs on one Mac. It can also fill in application forms, but I keep that turned off. I built it with Claude and Codex. I made the product and design decisions.

12hiring systems it can read, plus LinkedIn
26database tables
13functions an AI assistant can call

The problem#

Applying for a job is mostly admin. You find the posting, rewrite the same CV again, write a letter, and later try to remember who replied.

Tools that automate this have two problems. They send many generic applications. And when you ask a language model to improve a CV for a job posting, it can add a tool the person never used or a number they never reached, because that makes the text match the posting.

I wanted to see if an assistant could do the admin and still only write true things.

Three rules I set#

How it works, step by step#

  1. A role appears. A background worker checks a list of company career pages and saved LinkedIn searches. You can also paste any job link.
  2. Filters run first. This is normal code, no AI. It removes roles with the wrong title, wrong seniority, wrong country, on-site when you want remote, salary below your minimum, no visa sponsorship, or a language you do not speak.
  3. The rest is scored from 0 to 100, with reasons, concerns and the requirements you do not clearly meet.
  4. You press Apply. The worker builds an application kit in four steps: company research, tailored CV, cover letter, intro email.
  5. The CV is fact-checked and you see a word-by-word comparison with the original.
  6. You apply on the company's site and press “Mark as applied”. The role moves to the tracker with its documents.
  7. Replies are read and sorted. An interview invite moves the card to Interviewing. A rejection moves it to Rejected. No reply for 21 days moves it to Ghosted.

Finding roles#

Each card shows the score, where the role came from, the salary if the posting gives one, and the main reason it fits. The scoring prompt asks the model to be strict. Most roles should score between 40 and 75. A score of 85 or more is only for roles where almost every hard requirement is met. If every role scores 90, the score is useless.

A job detail page with the posting on the left and the fit analysis on the right
One role in detail. It shows why it fits, what is a concern, and which requirement is not met. Here the posting asks for Salesforce and the profile does not have it.
Roles that were filtered out, each with the rule that excluded it
Filtered roles are not deleted. Each one shows the rule that removed it and an “Include anyway” button.

The application kit#

One page has everything for one application. Each part has Copy, Download, Edit, Regenerate and Discuss buttons.

An application kit showing a tailored CV preview next to a cover letter
A finished kit. The CV shows the tailoring mode, how many of the posting’s keywords it covers, and a red “Check facts” warning.

Keeping it honest#

I added one false line to the demo data by hand to show how this works. The posting asks for Salesforce, so the tailored CV has a new line: “Administered Salesforce for the customer team.” The person never did that.

A word-level comparison of the original and tailored CV with a fact-check warning
The review screen. Green is added, red is removed. On the right, the fact-check has caught the Salesforce line and explains why.

The fact-check

After tailoring, a second model pass compares every changed line with the original CV and the knowledge base. The knowledge base is a list of confirmed facts collected during onboarding. Rewording, reordering and shortening are allowed. New numbers, new tools, bigger scope, new outcomes and new employers or titles are flagged. The kit gets a red chip and the explanation sits above the Approve button.

The coach

Every document has a Discuss button. You can ask for a change, give a preference or correct a fact. The coach checks each request against the knowledge base and says no when there is no support for it. It replies with a proposal card. Nothing changes until you press Apply.

A chat where the coach refuses to keep an unsupported line and proposes a replacement and a standing rule
I asked it to keep the Salesforce line. The coach said no, suggested a true replacement, and offered to save this as a rule.

Rules that stay

If you correct something once, you should not have to correct it again. Accepted rules go into a rulebook. Every later CV, letter and email is generated with these rules. The same rules are also saved to a plain text file, so you can read and edit them outside the app.

A rulebook with standing rules for CVs, cover letters and emails
The rulebook. Each rule shows where it came from and when it was last used.

Voice Studio#

It is hard to describe your own writing style, but it is easy to say when something does not sound like you. Voice Studio writes a sample letter, you say what is wrong, and it tries again. When it sounds right you lock it. The locked sample and the style rules from your feedback are used for every document after that. Each new document gets a voice-match score.

Voice Studio with a locked sample letter, style rules and banned phrases
A locked voice with the sample, five style rules and the banned phrases.

Tracking replies#

A kanban board with columns Applied, Interviewing, Offer, Rejected and Ghosted
The tracker. You can drag cards, but most of the time they move on their own.

When a mailbox is connected, Applyer reads only the mail about applications. It sorts each mail into one of eight types: acknowledgement, interview, assessment, offer, rejection, reminder, verification code and recruiter outreach. When it is confident, it links the mail to the right application and changes the stage. When it is not, it does nothing.

An inbox with a recruiter email classified as an interview invitation and linked to an application
An interview invite. It is classified at 96% confidence, linked to the application, and the card has moved to Interviewing.
The timeline of one application with events, documents and emails
The history of one application with emails, stage changes and documents in one place.

Auto-apply rules#

For roles that clearly fit, the kit can be prepared without asking. A rule sets a minimum score, how new the posting must be, words the title must or must not have, locations, and a daily limit. The worker checks open roles against the rules every ten minutes.

The name is “auto-apply” but it still only prepares the kit. The rule editor has a preview that uses the same code as the worker, so you see exactly which roles it would pick.

Two auto-apply rules with score, freshness, daily cap and title conditions
Two rules, one paused.

Which model does which job#

I did not use the biggest model for everything. The model is chosen by task.

Model sizeUsed forWhy
Haiku (small and fast)Sorting email, grouping skills, reading unusual career pagesMany small jobs
Sonnet (medium)Scoring roles, the fact-check, the first read of an uploaded CVNeeds care, but the output is structured data
Opus (largest)Tailoring, cover letters, emails, the coach, interview prep, company researchAnything a person will read

Only one file in the code is allowed to call a model. It forces every answer into a fixed structure, so a strange answer cannot break a screen. It also logs every call with its time and cost. The analytics page reads that log.

Analytics with a funnel, reply rate and applications per week
Analytics. The funnel, and reply rate by CV version, tailoring mode and source.

Why it uses my Claude subscription and not the API#

Applyer is a local app. It runs on my Mac and the data stays there. Normally an app like this calls the AI through an API, and you pay for API credits for every call.

I already pay for a Claude subscription. I noticed that a big part of it was going unused. I use up all my Fable usage every week, but my Sonnet and Opus usage was mostly untouched. Applyer mainly needs Sonnet and Opus. So I connected the app to my subscription.

The app does not have any API keys. It uses the Claude login that is already on my Mac, through the Claude Agent SDK. Every call is still logged with its time and cost, so I can see what the app is using.

Now I don't spend money on extra API credits. I would much rather put that money into the subscription, because for the same money the subscription gives a lot more usage than API credits do. For an app that only I use, this is the more efficient setup.

Every person, company and application in these screenshots is made up. “Alex Demo”, Northwind Robotics, Example Corp and the others were added to an empty test database. The app was never connected to real data for this page.