# yuxiaoma66/linkedin-job-match-extension architecture

> Architecture diagram of the GitHub repository yuxiaoma66/linkedin-job-match-extension, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/yuxiaoma66/linkedin-job-match-extension
- Repository: https://github.com/yuxiaoma66/linkedin-job-match-extension

## Overview

LinkedIn Job Match is a local-first Chrome extension that turns supported LinkedIn and Netherlands Indeed job pages plus a selected structured resume into evidence-based match results. Content scripts extract jobs and display inline scores/signals; the background service worker coordinates resume handling, configuration, cache lookup, model analysis, and reusable history. The side panel manages resumes, analysis settings, history, and saved positions. README capabilities are represented; unsampled subsystem wiring is limited to documented behavior and the shown service-worker orchestration.

Main entry points: [`src/background/service-worker.js`](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/service-worker.js) (Service worker), [`src/background/match-engine.js`](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/match-engine.js) (Match engine), [`src/content/index.js`](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/index.js) (Page adapter), [`src/background/resume-manager.js`](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/resume-manager.js) (Resume library)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Job capture"]
  node_content["Page adapter<br/>[index.js]"]
  node_linkedin["LinkedIn adapter"]
  node_indeed["Indeed adapter<br/>[indeed-adapter.js]"]
end

subgraph group_orchestration["Background workflow"]
  node_worker["Service worker<br/>[service-worker.js]"]
  node_config["Config manager<br/>[config-manager.js]"]
end

subgraph group_analysis["Resume analysis"]
  node_resume_mgr["Resume library<br/>[resume-manager.js]"]
  node_resume_doc["Resume structure<br/>[resume-document.js]"]
  node_prompts["Analysis prompts"]
  node_match["Match engine<br/>[match-engine.js]"]
  node_llm["Provider adapter<br/>[llm-adapter.js]"]
  node_scoring["Evidence scoring"]
  node_schema["Result validation"]
  node_scoring_profile["Scoring profile<br/>[scoring-profile.js]"]
  node_sponsor["Sponsor review<br/>[sponsor-checker.js]"]
end

subgraph group_experience["User experience"]
  node_panel["Side panel<br/>[app.js]"]
end

subgraph group_state["Local state"]
  node_sponsor_data["IND dataset<br/>[ind_sponsors.json]"]
  node_cache["Analysis cache<br/>[cache-manager.js]"]
  node_positions["Position manager"]
end

node_job_sites(("Job pages"))
node_model_service(("Model providers"))
node_local_storage[("Extension storage")]

node_job_sites -->|"renders pages"| node_content
node_content -->|"uses LinkedIn adapter"| node_linkedin
node_content -->|"uses Indeed adapter"| node_indeed
node_content -->|"sends job data"| node_worker
node_worker -->|"sends results"| node_panel
node_panel -->|"requests actions"| node_worker
node_worker -->|"loads settings"| node_config
node_worker -->|"manages profiles"| node_resume_mgr
node_resume_mgr -->|"normalizes profiles"| node_resume_doc
node_resume_mgr -->|"reads and writes"| node_local_storage
node_worker -->|"runs analysis"| node_match
node_worker -->|"checks and stores results"| node_cache
node_worker -->|"builds cache context"| node_scoring_profile
node_match -->|"builds prompts"| node_prompts
node_match -->|"requests completion"| node_llm
node_llm -.->|"calls configured provider"| node_model_service
node_match -->|"checks sponsorship"| node_sponsor
node_sponsor -->|"checks organisation"| node_sponsor_data
node_match -->|"validates response"| node_schema
node_match -->|"scores evidence"| node_scoring
node_match -->|"uses scoring policy"| node_scoring_profile
node_cache -->|"reads and writes"| node_local_storage
node_worker -->|"manages saved jobs"| node_positions
node_positions -->|"reads and writes"| node_local_storage
node_content -->|"injects score signals"| node_job_sites
node_panel -->|"saves positions"| node_positions

click node_content "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/index.js"
click node_linkedin "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/linkedin-ai-adapter.js"
click node_indeed "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/indeed-adapter.js"
click node_panel "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/sidepanel/app.js"
click node_worker "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/service-worker.js"
click node_config "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/config-manager.js"
click node_resume_mgr "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/resume-manager.js"
click node_resume_doc "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/resume-document.js"
click node_prompts "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/prompts/prompt-templates.js"
click node_match "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/match-engine.js"
click node_llm "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/llm-adapter.js"
click node_scoring "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/evidence-scoring.js"
click node_schema "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/schema-validator.js"
click node_scoring_profile "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/scoring-profile.js"
click node_sponsor "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/sponsor-checker.js"
click node_sponsor_data "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/public/data/ind_sponsors.json"
click node_cache "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/cache-manager.js"
click node_positions "https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/position-manager.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_content,node_linkedin,node_indeed toneBlue
class node_worker,node_config,node_local_storage toneAmber
class node_resume_mgr,node_resume_doc,node_prompts,node_match,node_llm,node_scoring,node_schema,node_scoring_profile,node_sponsor toneMint
class node_panel toneRose
class node_sponsor_data,node_cache,node_positions,node_job_sites,node_model_service toneIndigo
```

## Components

### Job capture

- [Page adapter](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/index.js): `src/content/index.js`
- [LinkedIn adapter](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/linkedin-ai-adapter.js): `src/content/linkedin-ai-adapter.js`
- [Indeed adapter](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/content/indeed-adapter.js): `src/content/indeed-adapter.js`

### Background workflow

- [Service worker](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/service-worker.js): `src/background/service-worker.js`
- [Config manager](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/config-manager.js): `src/background/config-manager.js`

### Resume analysis

- [Resume library](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/resume-manager.js): `src/background/resume-manager.js`
- [Resume structure](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/resume-document.js): `src/shared/resume-document.js`
- [Analysis prompts](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/prompts/prompt-templates.js): `src/prompts/prompt-templates.js`
- [Match engine](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/match-engine.js): `src/background/match-engine.js`
- [Provider adapter](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/llm-adapter.js): `src/background/llm-adapter.js`
- [Evidence scoring](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/evidence-scoring.js): `src/shared/evidence-scoring.js`
- [Result validation](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/schema-validator.js): `src/shared/schema-validator.js`
- [Scoring profile](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/shared/scoring-profile.js): `src/shared/scoring-profile.js`
- [Sponsor review](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/sponsor-checker.js): `src/background/sponsor-checker.js`

### User experience

- [Side panel](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/sidepanel/app.js): `src/sidepanel/app.js`

### Local state

- [IND dataset](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/public/data/ind_sponsors.json): `public/data/ind_sponsors.json`
- [Analysis cache](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/cache-manager.js): `src/background/cache-manager.js`
- [Position manager](https://github.com/yuxiaoma66/linkedin-job-match-extension/blob/main/src/background/position-manager.js): `src/background/position-manager.js`

### Other components

- **Job pages**
- **Model providers**
- **Extension storage**

## Connections

- Job pages → Page adapter: renders pages
- Page adapter → LinkedIn adapter: uses LinkedIn adapter
- Page adapter → Indeed adapter: uses Indeed adapter
- Page adapter → Service worker: sends job data
- Service worker → Side panel: sends results
- Side panel → Service worker: requests actions
- Service worker → Config manager: loads settings
- Service worker → Resume library: manages profiles
- Resume library → Resume structure: normalizes profiles
- Resume library → Extension storage: reads and writes
- Service worker → Match engine: runs analysis
- Service worker → Analysis cache: checks and stores results
- Service worker → Scoring profile: builds cache context
- Match engine → Analysis prompts: builds prompts
- Match engine → Provider adapter: requests completion
- Provider adapter → Model providers: calls configured provider
- Match engine → Sponsor review: checks sponsorship
- Sponsor review → IND dataset: checks organisation
- Match engine → Result validation: validates response
- Match engine → Evidence scoring: scores evidence
- Match engine → Scoring profile: uses scoring policy
- Analysis cache → Extension storage: reads and writes
- Service worker → Position manager: manages saved jobs
- Position manager → Extension storage: reads and writes
- Page adapter → Job pages: injects score signals
- Side panel → Position manager: saves positions
