Chrome Extension¶
The ColdReach Chrome extension puts email discovery one click away on any job posting. Open a job on Greenhouse, Lever, Indeed, LinkedIn Jobs, or Workable — the extension auto-detects the company and finds contact emails via your local ColdReach server.
Prerequisites¶
- ColdReach installed —
pip install coldreach - API server running —
coldreach serve(startslocalhost:8765) - Node.js 18+ — for building the extension
- Chrome / Chromium
Install (development)¶
# 1. Build the extension
cd chrome-extension
npm install
npm run build
# 2. Load unpacked in Chrome
# Open chrome://extensions/
# Enable "Developer mode" (top-right toggle)
# Click "Load unpacked" → select the chrome-extension/dist/ folder
The extension icon (⚡) appears in your toolbar. A green dot badge shows when ColdReach has detected a job posting on the current tab.
Usage¶
- Start the API server in a terminal:
- Navigate to any supported job posting (or any company page).
- Click the ColdReach toolbar icon — or right-click → "Find emails for this company".
- If a job was detected, the company pre-fills automatically. Click Use "Company Name" → to confirm the domain, or type one manually.
- Choose a scan depth:
- Quick (~10s) — web crawler, GitHub, WHOIS, SearXNG
- Standard (~2 min) — all of the above + theHarvester, SpiderFoot
- Full Scan (2–5 min) — everything including Firecrawl, Crawl4AI
- Click Find Emails — a 0–100% progress bar shows each source as it finishes.
- Click ⎘ to copy a single email, or Copy all / CSV ↓ for bulk export.
- If few results appear, the popup suggests upgrading to Full Scan automatically.
Drafting a cold email from the extension¶
After emails appear, every row has a ✏️ button:
- Click ✏️ next to any email — a compose panel slides in below it.
- Fill in:
- Your name (remembered across sessions)
- What you want — one sentence, e.g. "explore a B2B partnership on embedded payments"
- Type — Auto / Partner / Job / Sales
- Click ✨ Generate draft — Groq reads the company's website and writes a personalised subject + body (1–3 seconds).
- Click 📋 Copy full email — copies
Subject: ... Body: ... Best, [Your Name]to clipboard. - Paste directly into Gmail, Outlook, or any email client.
Requires Groq API key
Add COLDREACH_GROQ_API_KEY=gsk_xxx to .env and restart coldreach serve.
Free key at console.groq.com (14,400 tokens/min free tier).
Click ✏️ again (or ✕) to close the panel without generating.
Right-click context menu¶
Right-click anywhere on a page or on selected text:
- Selected text → opens popup with the selected text pre-filled as the search query
- Page right-click → extracts the current domain and pre-fills it
This works on any website — not just job boards.
Supported job boards¶
| Board | URL pattern | Detection method |
|---|---|---|
| Greenhouse | boards.greenhouse.io/{company}/... |
URL slug |
| Lever | jobs.lever.co/{company}/... |
URL slug |
| Indeed | www.indeed.com/viewjob?jk=... |
DOM element |
| LinkedIn Jobs | www.linkedin.com/jobs/view/... |
DOM element (company name only — no data scraped) |
| Workable | jobs.workable.com/{company}/... |
URL slug |
LinkedIn privacy note
ColdReach reads only the company name that is already displayed on screen — it does not scrape LinkedIn profiles, employee lists, or any data beyond what the user sees. Domain resolution happens via the Clearbit Autocomplete API (free, no key required).
Build output¶
chrome-extension/dist/
├── manifest.json # Manifest V3
├── popup.html # Extension popup
├── content.js # Content script (IIFE, runs on job pages)
├── service-worker.js # Background service worker (ES module)
├── icons/ # Extension icons
└── assets/ # Hashed JS + CSS bundles
Build commands¶
npm run build # full build (popup + content + service worker)
npm run build:popup # popup only
npm run build:content # content script only
npm run build:sw # service worker only
npm run dev # popup watch mode
npm run zip # zip dist/ for Chrome Web Store submission
Icons¶
Development uses SVG placeholder icons (generated by
node scripts/generate-icons.mjs). For the Chrome Web Store, convert to PNG:
# Inkscape
for size in 16 48 128; do
inkscape --export-type=png --export-width=$size icons/icon${size}.svg
done
Then update manifest.json icon paths from .svg → .png.
Project structure¶
chrome-extension/
├── manifest.json
├── popup.html # Vite entry point → dist/popup.html
├── package.json
├── vite.popup.config.ts # Builds React popup
├── vite.scripts.config.ts # Builds content.js (IIFE)
├── vite.sw.config.ts # Builds service-worker.js (ESM)
├── tailwind.config.cjs
├── postcss.config.cjs
├── icons/ # SVG placeholder icons
├── scripts/
│ └── generate-icons.mjs # Generates placeholder icons
└── src/
├── lib/
│ ├── api.ts # fetch wrapper for localhost:8765
│ └── types.ts # Shared TypeScript types
├── popup/
│ ├── main.tsx # React entry point
│ ├── styles.css # Tailwind base
│ ├── App.tsx # Root component + state machine
│ └── components/
│ ├── Header.tsx
│ ├── ServerStatus.tsx # Online/offline indicator
│ ├── JobDetected.tsx # Auto-detected company card
│ ├── DomainInput.tsx
│ ├── ProgressBar.tsx # Live source progress
│ └── EmailTable.tsx # Results with copy + export
├── content/
│ ├── index.ts # Entry: detects board, stores context
│ ├── greenhouse.ts # Greenhouse ATS parser
│ ├── lever.ts # Lever ATS parser
│ ├── indeed.ts # Indeed parser
│ ├── linkedin.ts # LinkedIn Jobs parser
│ └── workable.ts # Workable parser
└── background/
└── service-worker.ts # Badge updates, message relay
How it works¶
Job page loads
↓
content.js detects job board (Greenhouse / Lever / Indeed / LinkedIn / Workable)
↓
Extracts: company name, job title, URL
↓
chrome.storage.session.set({ jobContext })
chrome.runtime.sendMessage({ type: "JOB_DETECTED" }) → badge turns green (●)
↓
User clicks ColdReach icon
↓
popup reads chrome.storage.session → pre-fills company
↓
User clicks "Find Emails"
↓
POST localhost:8765/api/find/stream (SSE — live source updates)
↓
Results stream in, displayed in EmailTable
↓
Copy individual / Copy all / Export CSV
Publish to Chrome Web Store¶
- Convert icons to PNG (see above)
npm run zip— createscoldreach-extension.zip- Go to Chrome Web Store Developer Dashboard
- Upload the zip → fill in store listing → submit for review (~1–3 days)