Chrome extension helping with project bidding on Upwork

A browser extension that monitors your Upwork job feed in real time and notifies you the
instant new jobs appear, so you never miss an opportunity while youโre away from the screen.
This is the React + TypeScript rewrite of the original Vue extension that previously lived in
this repository.
Install the ready-to-use extension from the
Chrome Web Store.
Feedback and contributions are highly appreciated!
The extension reads items from your personal job feed. If youโre new to the platform, that
feed may be empty at first. To personalize it, run a job search on Upwork with some criteria
(keywords, minimum budget, etc.) and save the search โ the extension will then track matching
jobs as they appear.
More details about the job feed and other common concerns can be found in the FAQ section
inside the extension.
Node 22 is recommended (see .nvmrc); Node 20 is the minimum supported version.
Build the extension from source and load it as an unpacked extension:
# 1. Install dependencies (Node >= 20)
npm install
# 2a. Run a live-reload dev build...
npm run dev
# 2b. ...or produce a production build
npm run build
npm run build writes the extension to build/chrome-mv3. To load it:
chrome://extensions in Chrome.build/chrome-mv3 directory.| Script | Description |
|---|---|
npm run dev |
Start a live-reload development build |
npm run build |
Produce a production build in build/ |
npm run zip |
Package the build into a distributable .zip |
npm run compile |
Type-check the project (tsc --noEmit) |
npm run format |
Format the codebase with Prettier |
Experimental Firefox variants (dev:firefox, build:firefox, zip:firefox) exist, but Chrome
MV3 is the supported target.
All variables are optional for local development โ the core job-tracking features work without
them. Copy .env.example to .env to configure them. Analytics and error reporting are simply
disabled when their variables are unset.
| Variable | Purpose |
|---|---|
WXT_GA_API_SECRET |
Google Analytics 4 API secret |
WXT_GA_MEASUREMENT_ID |
Google Analytics 4 measurement ID |
WXT_SENTRY_DSN |
Sentry DSN for runtime error reporting |
SENTRY_AUTH_TOKEN |
Sentry auth token for source-map upload at build time |
SENTRY_ORGANISATION |
Sentry organization slug |
SENTRY_PROJECT |
Sentry project slug |
https://www.upwork.com/api/graphql/v1.| Permission | Why itโs needed |
|---|---|
idle |
Detect user activity for scheduling |
alarms |
Schedule periodic background job fetches |
storage |
Persist settings, schedules, and cached jobs |
cookies |
Use your existing Upwork session for API requests |
offscreen |
Play notification sounds in Manifest V3 |
notifications |
Show desktop notifications for new jobs |
declarativeNetRequest |
Adjust request headers needed to call the Upwork API |
https://*.upwork.com/ |
Host access for reading your job feed and proposal pages |
uptoolkit/
โโโ entrypoints/ # Extension contexts
โ โโโ background/ # Service worker (alarms, job fetching)
โ โโโ content/ # Content scripts (Upwork proposal pages)
โ โโโ offscreen/ # Audio playback document
โ โโโ options/ # Settings & dashboard UI (pages, components)
โโโ api/ # Upwork GraphQL API + GraphQL queries
โโโ utils/ # State, notifications, analytics, logging, etc.
โโโ components/ # Shared UI components
โโโ hooks/ # Custom React hooks
โโโ contexts/ # React contexts (storage)
โโโ icons/ # Icon components
โโโ public/ # Static assets (icons, sound, HTML)
This project is licensed under the GNU General Public License v3.0.