Skip to content

Repository files navigation

LinkedIn Job Tracker Extension

Firefox JavaScript esbuild WebExtensions

A Firefox WebExtension that integrates with the Job Relevance Filter backend. It scrapes LinkedIn job postings, listens for job applications, and matches jobs against your CV — all synced to a local API at http://localhost:8050.


Features

  • 📋 Auto-sync applied jobs — when you click "Apply" on LinkedIn, the job is automatically sent to the backend
  • 📁 Sync job tracker history — opens the LinkedIn Jobs Tracker and paginates through all applied jobs, extracting job details from each page
  • 🎯 Match jobs to your profile — calls the backend API to score a job's relevance against your extracted CV profile
  • Daily sync alarm — automatically opens the Jobs Tracker once per day (if more than 24 hours since last sync) to keep your applied jobs up to date
  • 🔗 Works with the Job Relevance Filter dashboard — all synced data appears in the dashboard's job table and tracking board

Requirements

  • Firefox (uses Manifest V2 WebExtensions API)
  • Job Relevance Filter backend running at http://localhost:8050
  • Node.js and npm (for building)

Installation

1. Clone and build

git clone https://github.com/udsey/linkedin-extension.git
cd linkedin-extension

# Install dependencies
npm install

# Build bundled scripts into dist/
npm run build

2. Start the backend

Make sure the Job Relevance Filter dashboard is running:

# In the job-relevance-filter directory
make dashboard

The API will be available at http://localhost:8050.

3. Load the extension in Firefox

  1. Open Firefox and navigate to about:debugging#/runtime/this-firefox
  2. Click Load Temporary Add-on...
  3. Select manifest.json from the linkedin-extension directory

The extension is now active. Navigate to any LinkedIn job search page to see it in action.

How it works

sync_apply.js — Instant apply tracking

Injected on LinkedIn job search and job view pages (/jobs/search/*, /jobs/collections/recommended/*, /jobs/view/*). It:

  1. Waits for the "Apply" button to render on the page
  2. Parses the current job's details (title, company, location, posted time, description)
  3. Attaches a click listener to the apply button
  4. When clicked, sends the job data to POST /api/sync-jobs on the backend

sync_applied.js — Bulk sync from Jobs Tracker

Injected on the Jobs Tracker page (/jobs-tracker/*). It:

  1. Fetches the last sync timestamp from GET /api/last-sync
  2. Waits 3 seconds for the page to load
  3. Iterates through up to 15 pages of applied jobs
  4. Extracts job ID, title, company, location, applied-at date, and posted date from each listing
  5. Sends all extracted jobs to POST /api/sync-jobs

match_job.js — Job relevance scoring

Injected alongside sync_apply.js on job pages. It:

  1. Sends the parsed job details to POST /api/match-job on the backend
  2. Returns the backend's relevance score, matching skills, missing requirements, and summary
  3. Throws an error if the API responds with a non-200 status code

background.js — Daily sync alarm

Runs as a persistent background script. It:

  1. Creates a daily alarm (periodInMinutes: 1440)
  2. On each alarm tick, checks GET /api/last-sync to see when the last sync occurred
  3. If more than 24 hours have passed, opens the LinkedIn Jobs Tracker in a background tab to trigger sync_applied.js

Project structure

├── manifest.json          # Extension manifest (Firefox Manifest V2)
├── package.json           # npm config & build script
├── background.js          # Background script (daily sync alarm)
├── utils.js               # Shared utilities:
│                          #   parseRelativeTime(), postJobs(), waitForElement(),
│                          #   onUrlChange(), getLastSync()
├── sync_apply.js          # Instant apply tracking content script
├── match_job.js           # Job relevance scoring content script
├── sync_applied.js        # Jobs Tracker bulk sync content script
├── dist/                  # Bundled output (generated by npm run build)
├── icons/
│   ├── icon48.png         # Extension icon (48px)
│   └── icon96.png         # Extension icon (96px)
└── README.md              # This file

API endpoints consumed

Endpoint Method Used by Description
/api/last-sync GET background.js, utils.js Returns the last sync timestamp
/api/sync-jobs POST sync_apply.js, sync_applied.js Sends job data to the backend
/api/match-job POST match_job.js Scores a job against your CV profile

All endpoints are hosted by the Job Relevance Filter backend at http://localhost:8050.

Development

# Watch mode — rebuild on changes
npx esbuild sync_apply.js match_job.js sync_applied.js background.js --bundle --outdir=dist --watch

# Production build
npm run build

After rebuilding, reload the extension in about:debugging to pick up changes.

About

Firefox companion extension for Job Relevance Filter — auto-tracks LinkedIn job applications and scores them against your CV in real time. Requires the dashboard running locally.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages