Skip to content

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

  1. ColdReach installedpip install coldreach
  2. API server runningcoldreach serve (starts localhost:8765)
  3. Node.js 18+ — for building the extension
  4. 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

  1. Start the API server in a terminal:
    coldreach serve
    
  2. Navigate to any supported job posting (or any company page).
  3. Click the ColdReach toolbar icon — or right-click → "Find emails for this company".
  4. If a job was detected, the company pre-fills automatically. Click Use "Company Name" → to confirm the domain, or type one manually.
  5. Choose a scan depth:
  6. Quick (~10s) — web crawler, GitHub, WHOIS, SearXNG
  7. Standard (~2 min) — all of the above + theHarvester, SpiderFoot
  8. Full Scan (2–5 min) — everything including Firecrawl, Crawl4AI
  9. Click Find Emails — a 0–100% progress bar shows each source as it finishes.
  10. Click ⎘ to copy a single email, or Copy all / CSV ↓ for bulk export.
  11. 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:

  1. Click ✏️ next to any email — a compose panel slides in below it.
  2. Fill in:
  3. Your name (remembered across sessions)
  4. What you want — one sentence, e.g. "explore a B2B partnership on embedded payments"
  5. Type — Auto / Partner / Job / Sales
  6. Click ✨ Generate draft — Groq reads the company's website and writes a personalised subject + body (1–3 seconds).
  7. Click 📋 Copy full email — copies Subject: ... Body: ... Best, [Your Name] to clipboard.
  8. 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

  1. Convert icons to PNG (see above)
  2. npm run zip — creates coldreach-extension.zip
  3. Go to Chrome Web Store Developer Dashboard
  4. Upload the zip → fill in store listing → submit for review (~1–3 days)