Frontend & UI

Upwork Job Scraper Chrome Extension — A Developer's Deep Dive

Scrapes Upwork job listings straight from the logged-in browser session.

2026-09-121 min read

Chrome extension automating Upwork job discovery from the logged-in browser.

The problem

Server-side scraping of Upwork gets blocked or rate-limited quickly; the reliable path is reading the page exactly as a logged-in user sees it.

The approach

Built a Manifest V3 Chrome extension that reads job listings directly from the active, logged-in Upwork session, de-duplicates against previously seen jobs, and pushes matches out via CSV/JSON export or a Google Apps Script integration for email/Sheets notifications.

The outcome

Collects only relevant jobs, avoids duplicates, exports CSV/JSON, notifies via email or Sheets.

Stack

Chrome Extension MV3, JavaScript, Google Apps Script

Live architecture demo

See it move, not just read about it.

Re-using the original animation from the linked project — same diagrams and trace you see on the case-study page.

Upwork MV3 Scraper Extension

EVENT: NOTIFY & SHEET LOG
Content Script (Active Tab)Bypasses Cloudflare / Blocks
Context:Authenticated DOM Session
Selector Target:[data-test="job-tile-list"]
MV3 Service WorkerBackground Orchestration
Storage:chrome.storage.local (ID Saved)
Filter Action:Unique Match: Dispatched
Apps ScriptWEBHOOK
Targets:Sheets & Email
Sync:Pushing Row ✓
Local ExportBLOB
Format:CSV / JSON
Status:Standby
Bypasses bot protection by reading the logged-in DOM directly. A verified unique job is pushed to Google Sheets & Email.

Reads the logged-in DOM directly — no server-side scraping to get blocked.

Authenticated Browser Scrape Trace

STEP 1/6
MV3 Background Worker • chrome.alarms
background alarm wakes service worker; wakes active search tab across target URLs • 0 ms
Content Script • In-Session DOM
auto-scroll executes; parses rendered job cards within active login session • ~320 ms
Rule Evaluator • In-Memory Filter
matches verified payment, $50+/hr, <5 proposals; drops excluded keywords • ~8 ms
Storage Layer • chrome.storage.local
verifies job ciphertext hash against seen index; prevents cross-run duplicate alerting
Google Apps Script • Webhook Relay
fresh match dispatches to Sheets; appends row and triggers instant Gmail alert • ~650 ms
Chrome APIs • Notifications & Downloads
fires desktop OS notification; updates aggregated JSON/CSV export buffer • ready

← All posts