<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ava Bagherzadeh</title>
    <description>The latest articles on DEV Community by Ava Bagherzadeh (@whateverneveranywhere).</description>
    <link>https://dev.to/whateverneveranywhere</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F177635%2F29150a38-9808-4fad-aa34-102ca30ccbf3.jpeg</url>
      <title>DEV Community: Ava Bagherzadeh</title>
      <link>https://dev.to/whateverneveranywhere</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whateverneveranywhere"/>
    <language>en</language>
    <item>
      <title>How I Built an AI That Applies to Jobs with Browserbase, Stagehand, and Cloudflare Workers</title>
      <dc:creator>Ava Bagherzadeh</dc:creator>
      <pubDate>Mon, 20 Apr 2026 10:57:51 +0000</pubDate>
      <link>https://dev.to/whateverneveranywhere/how-i-built-an-ai-that-applies-to-jobs-with-browserbase-stagehand-and-cloudflare-workers-1h0f</link>
      <guid>https://dev.to/whateverneveranywhere/how-i-built-an-ai-that-applies-to-jobs-with-browserbase-stagehand-and-cloudflare-workers-1h0f</guid>
      <description>&lt;p&gt;Last year I sent 127 job applications and got 3 callbacks. My ATS score on my own resume came back at 34 percent on roles I was qualified for. At that point I stopped sending applications and started writing code. Eight months later, AI Applyd is live.&lt;/p&gt;

&lt;p&gt;This post is the technical writeup. How the auto-apply engine works, why I chose the stack I chose, and what broke along the way.&lt;/p&gt;

&lt;p&gt;If you want to skip the writeup and try it, the free tier is 20K starter tokens, 10 ATS scores per month, 5 resume tailors, 5 cover letters, 1 AI apply per month, 15 documents, 25 job listings. No credit card. We are also live on Peerlist Launchpad right now (Week 17 runs through Apr 26) so if it works for you, an upvote helps: &lt;a href="https://peerlist.io/firstexhotic/project/ai-that-applies-for-you--ai-applyd" rel="noopener noreferrer"&gt;https://peerlist.io/firstexhotic/project/ai-that-applies-for-you--ai-applyd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watch the 90-second demo: &lt;a href="https://www.youtube.com/watch?v=rbet3wFpGak" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=rbet3wFpGak&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;ATS filters are statistical text matchers. They parse your resume, extract keywords and skills, score against the job description, and drop anything below a threshold. Threshold is usually hidden but sits around 60 to 70 percent match at most big companies.&lt;/p&gt;

&lt;p&gt;This means two things. One, the exact same resume that passes at Company A fails at Company B because the JD wording is different. Two, a human recruiter never sees 70 percent of your applications. You are rejected by regex before anyone reads a line.&lt;/p&gt;

&lt;p&gt;The fix everyone proposes: tailor every resume per job. Nobody does it because it takes 30 minutes per application and you need to send 100+ applications. That is 50 hours of tailoring per job search. So you spray the same resume instead.&lt;/p&gt;

&lt;p&gt;I wanted to remove the tailoring cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI Applyd Does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Scan the job description. Extract required skills, preferred skills, tech keywords, soft skills. Build a target profile.&lt;/li&gt;
&lt;li&gt;Score your resume against it. Cosine similarity on the embedded skill graph plus exact-match scoring on must-have keywords. You get a number and the specific missing keywords.&lt;/li&gt;
&lt;li&gt;Tailor and apply. Rewrite bullets to incorporate missing keywords (only truthful ones from your profile). Then submit via a real browser session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third step is where it gets interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto-apply: Not a Form Filler
&lt;/h2&gt;

&lt;p&gt;Every existing auto-apply tool I tried was a browser extension scanning the visible DOM and filling fields. That breaks instantly on conditional logic, file uploads, or multi-step screening questions.&lt;/p&gt;

&lt;p&gt;I went the other direction. Full headless browser sessions in the cloud, driven by an LLM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browserbase + Stagehand
&lt;/h3&gt;

&lt;p&gt;Browserbase gives me a real Chromium session with stealth, residential proxies, and captcha solving baked in. No Chrome farm to maintain. No fingerprints to rotate.&lt;/p&gt;

&lt;p&gt;Stagehand sits on top. Browserbase's LLM-driven automation framework. I can say &lt;code&gt;stagehand.page.act("click the submit button")&lt;/code&gt; and it figures out the DOM.&lt;/p&gt;

&lt;p&gt;Two gotchas I hit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Stagehand v3 uses &lt;code&gt;AsyncLocalStorage.enterWith()&lt;/code&gt; for its logger. That API does not work in Cloudflare Workers. I patched Stagehand with &lt;code&gt;bun patch&lt;/code&gt; to swap the logger to a passthrough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wiring Stagehand to OpenRouter with &lt;code&gt;{ modelName, apiKey, baseURL }&lt;/code&gt; breaks on the second request because &lt;code&gt;@ai-sdk/openai@2.x&lt;/code&gt; has a broken &lt;code&gt;isReasoningModel&lt;/code&gt; path for non-OpenAI endpoints. Use &lt;code&gt;CustomOpenAIClient + llmClient&lt;/code&gt; instead. For the browser agent, bypass OpenRouter and call Anthropic directly for Claude Haiku 4.5.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runtime: Cloudflare Workers&lt;/li&gt;
&lt;li&gt;Database: Cloudflare D1 with Drizzle ORM&lt;/li&gt;
&lt;li&gt;Blob storage: Cloudflare R2&lt;/li&gt;
&lt;li&gt;API: Hono with OpenAPI integration&lt;/li&gt;
&lt;li&gt;Auth: Better Auth with D1 adapter, Google OAuth, magic links&lt;/li&gt;
&lt;li&gt;Web: TanStack Start&lt;/li&gt;
&lt;li&gt;UI: Tailwind plus shadcn/ui, Zustand, TanStack Query&lt;/li&gt;
&lt;li&gt;AI: OpenRouter as the gateway, Gemini 2.5 Flash Lite for most flows, Anthropic direct for the browser agent&lt;/li&gt;
&lt;li&gt;Browser automation: Browserbase + Stagehand&lt;/li&gt;
&lt;li&gt;Video: Remotion for the landing page demos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is one TurboRepo monorepo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Architecture Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Login-required platforms are gated. LinkedIn, Indeed, Greenhouse work only after the user explicitly connects them. Then the session uses their stored cookies.&lt;/li&gt;
&lt;li&gt;Token reservations before Browserbase session creation. D1 has no transactions across statements so I use db.batch() for atomicity and hard-cap reservations at zero.&lt;/li&gt;
&lt;li&gt;Refunds only on Browserbase-failed submissions. Three retries on non-terminal errors.&lt;/li&gt;
&lt;li&gt;Scrape queue + cron. SCRAPE_QUEUE on Cloudflare Queues, 12h cron refresh, concurrency 5, 5 min hard timeout per scrape.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;At current volume AI Applyd costs about $25 per 1000 applications end to end. Biggest line items are Browserbase session minutes and the tailoring LLM call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Free tier is real. 20K starter tokens, 10 ATS scores per month, 5 resume tailors, 5 cover letters, 1 AI apply per month. No credit card.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product: &lt;a href="https://aiapplyd.com" rel="noopener noreferrer"&gt;https://aiapplyd.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://www.youtube.com/watch?v=rbet3wFpGak" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=rbet3wFpGak&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Peerlist Launchpad Week 17 (runs through Apr 26): &lt;a href="https://peerlist.io/firstexhotic/project/ai-that-applies-for-you--ai-applyd" rel="noopener noreferrer"&gt;https://peerlist.io/firstexhotic/project/ai-that-applies-for-you--ai-applyd&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask me anything in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>career</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
