AI job search copilot · Own product · 2026

Reorder, rephrase, compress. Never fabricate.

A Chrome extension that turns a morning scroll through LinkedIn into two or three applications worth sending. I researched it through my own job search, designed it, built it, and shipped it to the Chrome Web Store. The rule in the title is quoted from its system prompt.

Founder, designer, developerSoloDiscovery to public listing: April to June 2026
6 wks
From the first discovery session to a public Chrome Web Store listing.
45
Recorded decisions behind the product, each with the options it rejected.
Zero
Facts the CV generator is allowed to invent. The master CV is the only source.
Overview

One user. Every role.

I was the product's first user before I was its author: a designer running a daily Staff+ job search, watching good applications disappear into automated screens. I held every role on this build. Product manager for the discovery and scope, designer for the flows, developer for the shipped code, marketer for the launch.

The product's promise follows from that: every feature exists to give the applicant a fair, honest shot at the jobs worth their time. Nothing more was allowed in.

Key contributions

  1. Turned my own job search into the research base: 25 interview transcripts and an ATS keyword study across 8 live job descriptions.
  2. Designed the seven-stage pipeline that carries a vacancy from noisy feed to submitted application.
  3. Wrote the honesty rules into the prompts themselves; the generator can rearrange the truth, never replace it.
  4. Kept every piece of career data inside the browser: no backend, no account, no telemetry.
  5. Shipped through a real Chrome Web Store rejection by root-causing it instead of appealing.
  6. Universalized the product after launch, when its only user stopped being me.
The problem

A machine reads your application first.

Hiring now filters applications automatically: ATS keyword screens and AI ranking cut a candidate before a human ever reads the file. The tools built in response optimize for volume, and recruiters read past volume in seconds. The applicant is squeezed from both sides.

01

The screen before the human

Without the vocabulary a specific job description uses, an application can be filtered out before anyone sees it. The candidate never learns why. Most never learn that it happened at all.

02

The volume trap

Auto-apply tools answer the screen with quantity: hundreds of identical applications. I watched them produce documents I wouldn't send to a friend's company. Recruiters recognize the pattern instantly, and it works against the candidate.

03

The noisy feed

The daily search hour leaks before any application starts: junior listings, staffing agencies, roles locked to another region. The feed spends your attention on jobs you could never take.

Where the insights came from

The research was my own job search.

No focus groups, no personas. The evidence base was lived and then systematized: every insight in the product traces to a transcript, a study, or a recorded decision.

Lived corpus

25 interviews, from the inside.

Over the search I kept transcripts of 25 of my own interviews across companies from Deel to McKinsey. They showed what actually gets asked, what survives scrutiny, and what a tailored application must be ready to defend.

That corpus set the product's hardest constraint. Anything a generated CV claims, the candidate has to stand behind in a live interview.

AI Job Copilot side panel on a LinkedIn job page: fit analysis with verdict and flags, and a tailored CV generated next to the job description.
The side panel where research became product: verdict, flags, and a tailored CV next to the job.
The study

Eight job descriptions, one mechanism.

Before any code, I ran a keyword-frequency study across 8 live product-design JDs, from GitLab to Anthropic, ranking terms into tiers by how many postings used them. The study's conclusion, translated from my notes: without these words, the ATS drops the application before any human review.

The study also catalogued what ATS parsers can read: single column, no tables, plain structure. Those findings became the CV template's layout rules.

AI Job Copilot drafts view: follow-up message and form answers generated in the candidate's voice for a specific application.
Outreach drafts written in the candidate's voice, shaped by what interviews actually ask.
The system

One morning hour, engineered end to end.

The discovery session fixed the shape: a daily block of 30 to 60 minutes should produce two or three applications worth sending. I designed the whole path as one pipeline, not a pile of features. Every vacancy moves through the same seven stages, and each stage has its own recorded decision.

The product works The user decides
Achievement · Filtering

The feed shows only jobs worth your time.

Junior listings, staffing agencies, roles locked to a region you can't work in: the filter collapses them before they cost attention. What remains is the short list the morning hour was meant for.

The decision that shaped it: nothing disappears silently. A hidden vacancy folds into a small tile that names its reason, and one click brings it back. The user stays the editor of their own feed.

That call came from being the user. A filter I couldn't inspect was a filter I wouldn't trust, so the product shows its work.

What the filtered feed reads like. Every hidden card keeps its reason and a way back.
Achievement · Tailoring

Every line survives an interview question.

For each job, the product derives the CV's structure from the JD itself: the requirement groups become the expertise themes, in the order the employer wrote them. The candidate passes the keyword screen by speaking the job's language, with their own real experience.

The boundary is hard-coded. The master CV is the canonical pool of facts, and the generator may reorder, rephrase, and compress it. It may not add to it. No invented metrics, no guessed contacts, no filled-in EEO fields.

The insight behind the rule came from the interview corpus: a fabricated line doesn't fail at the screen, it fails in the room. Honesty here is not ethics decoration; it is what makes the application usable.

AI Job Copilot filtering view on LinkedIn: the jobs feed with collapsed cards and filter controls in the side panel.
The shipped extension on a live LinkedIn feed.
"Master CV is canonical. Never invent roles, dates, metrics, employers, or achievements that are not in the master CV. Reorder, rephrase, compress. Never fabricate."
From the shipped system prompt
Achievement · One page, guaranteed

The CV fits the page because the page gets measured.

Recruiters read one page. Instead of hoping the model counts words correctly, the product renders the CV, measures the result against a real A4 page, and negotiates the difference. The word budgets themselves came from measuring four of my shipped single-page CVs: 267 to 322 words of experience, so the budget is 260 to 300.

Why an exact number: "trim it a bit" gives a model room to drift. "Remove two sentences, copy everything else verbatim" is checkable. The loop converges in at most three passes.
Through the gatekeepers

Rejected, root-caused, shipped.

Two failures shaped the engineering more than any success. Both got the same treatment: find the actual cause, fix the structure that allowed it, write the decision down.

Chrome Web Store rejection

The permission nobody used.

The store rejected the first submission for a permissions violation. Instead of appealing, I audited: the manifest declared a downloads permission, and a grep proved no code ever called it. A leftover from an abandoned flow.

Removed it, resubmitted, and added a full permission audit so the next review had nothing to find. The listing went public days later. Users get a product that asks only for what it uses.

Verified, then broken

The bug that redesigned the architecture.

OpenAI keys passed the connection test, then failed on first real use. The cause: five features each carried their own copy of an Anthropic-only call, so supporting a second provider meant editing five places, and nobody had.

The fix collapsed all five into one entry point. Since then, both providers work everywhere or nowhere: a promise the interface can no longer make falsely.

Takeaways

Built honestly for one user, the product survived meeting the rest. After launch I found my own biography hard-coded in the prompts as the example, and cut it so the tool serves any field. The discipline that keeps a CV truthful turned out to be the same one that keeps a product truthful.