JobFairy — a job-search copilot that researches every role, tailors the resume, fills the application, and reaches the hiring team
JobFairy is for anyone running a serious job search. You set your filters once — title, seniority, remote or a place, salary — and the system does the grind: it pulls live openings, researches each role, rewrites your resume for it, fills the application with a browser agent, and drafts personalized outreach to the people who will actually read it, sent through Instantly so it lands in the inbox and through Waalaxy on LinkedIn. The sharpest filter is the H-1B one: JobFairy carries five years of US Department of Labor filing data, so H-1B candidates can restrict the whole search to companies with a verified record of sponsoring — a filter inside the system, not the product itself.
- Role
- Designed, built, and shipped solo.
- Timeline
- confirm
- Status
- In beta testing — the multi-user build in these screenshots is live and iterating week to week.
- Tech
- TypeScript + Next.js · Supabase · Trigger.dev · Railway · research agents with a verifier gate · Browserbase fill agent · python-docx resume tailoring · DOL LCA data pipeline · TheirStack job ingest · Apollo.io, Instantly & Waalaxy outreach.
The problem
This one started at home. My wife holds an H-1B, and I watched the job search eat her evenings for months. Anyone who has hunted for a job knows the loop; her visa just made every lap of it longer. The manual version goes like this:
- Open LinkedIn and the job boards. Again. →
- Stack the filters and scroll. →
- Research each interesting company — does it actually sponsor H-1B? The “visa sponsorship: yes” checkbox is self-reported, the lookup sites carry stale data, and half the time you end up with partial information and no answer. →
- Rewrite the resume for the role. There goes the evening. →
- Fill the application form by hand, field by field. →
- Hunt down the hiring manager and write something personal. →
- Send it from a personal Gmail — where cold mail gets flagged fast and sits in spam.
Every step is manual, every step repeats for every single role, and the chain breaks anywhere. JobFairy runs that whole chain as one system — for any job seeker. The H-1B check becomes one filter inside it, answered from government filing data instead of guesswork.
The product, in screenshots
Filters — set once
Preferences hold the whole search: the titles you actually apply to, seniority, years of experience, remote or on-site, employment type, country, how fresh a posting has to be, and target salary. On top of them sits the H-1B sponsor filter — every company downstream carries verified sponsorship filings, not a self-reported checkbox.

Jobs — everything live, in one place
The Jobs tab is every live opening that matches your preferences across the tracked companies, deduped and freshest first. The beta adds a reveal step — titles come free, and a daily allowance of reveals goes to the ones worth a closer look, which is what keeps per-user data costs sane.

Companies — each with its sponsorship record
The Companies tab carries the H-1B filing history for every company in your search, filterable by filing volume. A company page puts its live jobs on top — and the people who matter underneath.


Open a job — the homework is already done
Click into a job and the agent research is waiting: what the ideal candidate looks like, company intel, interview intel — every bullet verified and cited before it is allowed to persist. A keyword scan shows what the posting asks for that your resume doesn't say yet, and the resume pane on the right is where tailoring lands: rewords stay fact-anchored, and you accept or reject each change.


People — outreach that lands in the inbox
Even a strong application can sit unread, so JobFairy works the human side too. Pick a person and the agent researches them first, then drafts the outreach: a three-touch email sequence and a LinkedIn note, personalized from cited findings and capped at lengths a human would actually write. Nothing sends without your approval. Email goes out through Instantly — because a personal Gmail blasting cold mail gets flagged within days, and deliverability infrastructure is the difference between an inbox and a spam folder. LinkedIn outreach runs through Waalaxy.

The H-1B data underneath
The filter is built on the US Department of Labor's own LCA disclosure files: 2,630,454 filings distilled to 31,926 companies with at least five filings across the last three fiscal years in tech-adjacent roles. That's the difference between a checkbox that says “sponsors visas” and a public record that proves it.

How it's built
TypeScript end to end on Next.js, Supabase for data and auth, Trigger.dev for every long-running job, deployed on Railway. Jobs arrive through TheirStack, which watches the ATS platforms so I don't have to. The research agents run behind a verifier that gates every bullet before it persists. Resume tailoring is the one Python exception — python-docx doing run-level edits inside a Trigger.dev task, because nothing in TypeScript edits a .docx in place without reflowing it.
awaiting — a matched confirmation email promotes it to applied.The browser-agent bake-off
The fill step needed a browser agent, so I tested two providers head to head on the same live application — Browser Use and Browserbase + Stagehand — one real run each, through the real fill engine, with cost and step caps in force and every number persisted to the database. Browserbase won because it got the job done: the resume attached in one tool call, while Browser Use burned its entire step cap without ever attaching the file.
What I learned
Don't reinvent the wheel. I spent the early weeks building job ingestion the hard way — going ATS by ATS, writing connectors and scrapers against roughly twenty vendors, fighting markup drift and rate limits, because most of them never expose a clean public API. Then I found TheirStack, which already aggregates live postings across the ATS world, and replaced my entire ingestion path with one integration. If someone has already solved the problem, build on top of them — the moat was never going to be the scraping.
Don't let the agent grade its own homework. A fill agent reporting submitted: true is the model's opinion, not a fact — at the API boundary it is indistinguishable from a hallucination. So the system never takes the agent's word: a finished fill run only moves an application to awaiting, and only a matching confirmation email in Gmail promotes it to applied. Any claim an agent makes about the world needs a verification path that doesn't run through the agent.