<?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: member_5d0fa3ad</title>
    <description>The latest articles on DEV Community by member_5d0fa3ad (@member_5d0fa3ad).</description>
    <link>https://dev.to/member_5d0fa3ad</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4024601%2Fff0171e0-b35c-4bad-a3ce-6cd2751365f9.png</url>
      <title>DEV Community: member_5d0fa3ad</title>
      <link>https://dev.to/member_5d0fa3ad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/member_5d0fa3ad"/>
    <language>en</language>
    <item>
      <title>How I built a Chrome extension that auto-applies to 100 LinkedIn Easy Apply jobs per day</title>
      <dc:creator>member_5d0fa3ad</dc:creator>
      <pubDate>Fri, 10 Jul 2026 23:44:01 +0000</pubDate>
      <link>https://dev.to/member_5d0fa3ad/how-i-built-a-chrome-extension-that-auto-applies-to-100-linkedin-easy-apply-jobs-per-day-2bm7</link>
      <guid>https://dev.to/member_5d0fa3ad/how-i-built-a-chrome-extension-that-auto-applies-to-100-linkedin-easy-apply-jobs-per-day-2bm7</guid>
      <description>&lt;p&gt;Job hunting on LinkedIn is a numbers game. Median reply rate is 4-8%, so if you want to land 5 offers you probably need to apply to 300+ roles. Filling the same Easy Apply form 300 times is soul-destroying, so 18 months ago I started building a Chrome extension that does it for you.&lt;/p&gt;

&lt;p&gt;Today it's called &lt;strong&gt;&lt;a href="https://www.autoapplymax.com" rel="noopener noreferrer"&gt;AutoApplyMax&lt;/a&gt;&lt;/strong&gt; — 25K+ users, ~78K API tokens/day of AI form-fill traffic, zero permanent LinkedIn bans on record when users respect the recommended 100-150/day cap.&lt;/p&gt;

&lt;p&gt;This post is the postmortem-style writeup of what worked, what broke, and the specific safety rules that keep LinkedIn from banning the bot's users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome extension (Manifest V3)&lt;/strong&gt; — content script that lives inside &lt;code&gt;linkedin.com/jobs/*&lt;/code&gt;, background service worker for cross-tab coordination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; — Postgres + Auth + Edge Functions for the dashboard, profile storage, AI form-fill routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq (Llama 3.3 70B)&lt;/strong&gt; — LLM answering screening questions in &amp;lt;400ms per question, 4 API keys round-robined for rate-limit isolation across free-tier orgs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — hosting the marketing site + dashboard + 100+ blog articles&lt;/li&gt;
&lt;li&gt;Zero server-side scraping of LinkedIn. Everything runs client-side in the user's own Chrome, using their own logged-in session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is the load-bearing one for legal + safety reasons. We're not a headless scraper hitting LinkedIn's servers — we're a UI automation running in the user's own browser, driving their own account, at human speed. Same threat model as &lt;a href="https://www.bumble.com" rel="noopener noreferrer"&gt;Bumble's built-in swipe-all bot&lt;/a&gt; or any autofill password manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Easy Apply flow, step by step
&lt;/h2&gt;

&lt;p&gt;When the user clicks "Auto-apply" in the extension popup, the content script:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reads the visible job cards&lt;/strong&gt; from the &lt;code&gt;.jobs-search-results-list&lt;/code&gt; sidebar&lt;/li&gt;
&lt;li&gt;For each card, &lt;strong&gt;clicks it&lt;/strong&gt; to open the detail pane (this is a soft nav — no full page load)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifies it's Easy Apply&lt;/strong&gt; by looking for the &lt;code&gt;.jobs-apply-button&lt;/code&gt; with &lt;code&gt;data-live-test-easy-apply&lt;/code&gt; attribute. If not, skips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clicks Easy Apply&lt;/strong&gt;. LinkedIn opens a modal with the multi-step form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walks the form pages&lt;/strong&gt;. Each page has different fields — name, email, phone, resume upload, custom screening questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fills known fields&lt;/strong&gt; from the user's profile (stored in the extension's &lt;code&gt;chrome.storage.local&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uploads resume&lt;/strong&gt; by creating a &lt;code&gt;File&lt;/code&gt; object from the stored blob and dispatching a &lt;code&gt;change&lt;/code&gt; event on the &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answers screening questions&lt;/strong&gt; via Groq — sends the question + user's profile summary, expects a single-line answer that matches the input type (short-text, number, radio)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clicks Submit&lt;/strong&gt;, waits for the "Application sent" confirmation, closes the modal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delays 2-5s randomized&lt;/strong&gt;, moves to the next card&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern is boring on purpose. No fancy async pipelines. No parallel tabs. Just a synchronous walk down the list with realistic delays.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three safety rules that matter
&lt;/h2&gt;

&lt;p&gt;LinkedIn's ML abuse detection is not looking for "does this account use a bot." It's looking for &lt;strong&gt;behavioral signatures&lt;/strong&gt;. Three rules keep AutoApplyMax users under the radar:&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 1 — Never faster than a fast human
&lt;/h3&gt;

&lt;p&gt;Timing between "click Easy Apply" and "click Submit" for a 4-step form: humans do it in 30-90 seconds. AutoApplyMax targets 40-80 seconds. Delays between actions are randomized in a &lt;code&gt;2000 + Math.random() * 3000&lt;/code&gt; ms window. Never a fixed 500ms. That's the giveaway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 2 — Daily cap at 100-150
&lt;/h3&gt;

&lt;p&gt;Above 150 applications/day from one account, LinkedIn's &lt;code&gt;Retryable-Errors: LIMIT_EXCEEDED&lt;/code&gt; starts showing up on Easy Apply modals. Above 200, temporary restrictions start. So the extension has a hard-coded cap at 150 that the user can lower but not raise. Better to spread across days than push past 150.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 3 — Only automate what belongs to the user
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easy Apply on their own account: automated&lt;/li&gt;
&lt;li&gt;Profile data of other users: never scraped&lt;/li&gt;
&lt;li&gt;Sending messages, connection requests: never touched&lt;/li&gt;
&lt;li&gt;Reading job listings: reads what's already visible to the user (their own logged-in search)&lt;/li&gt;
&lt;li&gt;Public post-view counts, follower lists: never scraped&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The line is: the bot can only do things the user themselves can do inside their own logged-in tab. If it would require an unauthenticated crawler or a different account, it's out of scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "form-fill" AI, in one paragraph
&lt;/h2&gt;

&lt;p&gt;The interesting AI work is not "generate a CV." It's answering the ~800 different variations of screening questions LinkedIn shows. "How many years of Python?" "Are you authorized to work in Germany?" "Are you willing to relocate to Bangalore for 6 months?" "What's your notice period in weeks?"&lt;/p&gt;

&lt;p&gt;We send the question + a compact JSON summary of the user's profile to Llama 3.3 70B (via &lt;a href="https://groq.com" rel="noopener noreferrer"&gt;Groq&lt;/a&gt; for latency — &amp;lt;400ms P95). The system prompt forces a specific output format: &lt;code&gt;{answer: "3", confidence: 0.9}&lt;/code&gt; for numeric inputs, &lt;code&gt;{answer: "Yes"}&lt;/code&gt; for booleans. Confidence &amp;lt; 0.7 means the bot skips the question (asks the user next session), rather than lie to LinkedIn.&lt;/p&gt;

&lt;p&gt;Round-robin across 4 Groq accounts (each with a separate free-tier org) gives us ~400K tokens/day of headroom on &lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt;. That's the fun trick: Groq's rate limits are per-org, not per-key, so multiple accounts = multiple TPD pools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I got wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial launch: I tried scraping LinkedIn from a server-side headless Chrome.&lt;/strong&gt; Banned in 2 days. Never do that. Client-side extension is the only sustainable model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wanted to also automate connection messages.&lt;/strong&gt; Wrong. Users hated it (spam signal), LinkedIn caught it fast. Now the bot only touches Easy Apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sent screening question answers with no confidence check.&lt;/strong&gt; LLM would confidently lie about years of experience. Now we check confidence and skip when low.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Didn't rate-limit early.&lt;/strong&gt; Users cranked up caps to 500/day. Banned the accounts. Now hard-cap at 150 with no override.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interview prep AI&lt;/strong&gt; — feeds recruiter reply text + job description + user's background into an LLM to generate 5 likely questions + STAR-format answers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ATS optimization layer&lt;/strong&gt; — before submitting, the extension checks if the resume ATS-matches the JD keywords, offers to swap in a tailored version generated on-the-fly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-account rate-limiting via Supabase RLS&lt;/strong&gt; — track per-user daily counts server-side so a user can't bypass the cap by clearing extension storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you want to see the extension in action, &lt;a href="https://chromewebstore.google.com/detail/autoapplymax/oeaobljpdipleeanlfjppmlokkajodbk" rel="noopener noreferrer"&gt;install AutoApplyMax from the Chrome Web Store&lt;/a&gt; (free). No signup needed to start. Or read the full auto-apply guide at &lt;a href="https://www.autoapplymax.com/blog/how-to-auto-apply-on-linkedin-2026" rel="noopener noreferrer"&gt;autoapplymax.com/blog/how-to-auto-apply-on-linkedin-2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy to answer any technical questions in the comments — especially interested in stories of other people who built form-filling automations.&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>extension</category>
      <category>javascript</category>
      <category>jobsearch</category>
    </item>
  </channel>
</rss>
