DEV Community

Yagnesh
Yagnesh

Posted on

🧩 I Built a Privacy-First Chrome Extension to Collect Public Emails from LinkedIn

While job hunting and doing outreach, I kept running into the same problem:

A lot of LinkedIn posts and profiles already have email addresses in plain sight, but finding them is slow and repetitive. You scroll, click β€œsee more”, copy one email, scroll again… repeat.

I tried a few tools that claimed to solve this, but most of them had at least one of these issues:

  • They sent data to external servers
  • Required accounts or logins
  • Over-automated things in a way that felt risky
  • Or clearly wouldn’t pass Chrome Web Store review

So I decided to build a small tool myself.

That’s how ReachIn was born.

πŸ‘‰ Repo: https://github.com/yagnesh97/reach-in


What ReachIn Is (and What It Isn’t)

ReachIn is a Chrome extension that helps collect publicly visible email addresses from LinkedIn search result pages.

What it does

  • Works only when you explicitly click a button
  • Scrolls through LinkedIn search results
  • Expands visible content
  • Extracts email addresses already shown on the page
  • Stores everything locally in your browser
  • Lets you copy results or view past collections

What it does not do

  • No background scraping
  • No credential access
  • No analytics or tracking
  • No servers
  • No remote APIs
  • No automation running on its own

Privacy From Day One

Chrome reviewers care far more about intent and data handling than fancy features.

So I set a few non-negotiable rules early:

  1. Everything runs locally
  2. No network requests
  3. User action triggers everything
  4. The behavior must be easy to explain in plain English

Under the Hood (High Level)

ReachIn is a plain Manifest V3 Chrome extension. No frameworks, no build step.

Structure looks like this:

β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ css/
β”‚   β”‚   └── popup.css
β”‚   β”œβ”€β”€ js/
β”‚   β”‚   β”œβ”€β”€ background.js
β”‚   β”‚   β”œβ”€β”€ content.js
β”‚   β”‚   └── popup.js
β”‚   β”œβ”€β”€ icons/
β”‚   β”‚   β”œβ”€β”€ icon-16.png
β”‚   β”‚   β”œβ”€β”€ icon-32.png
β”‚   β”‚   β”œβ”€β”€ icon-48.png
β”‚   β”‚   └── icon-128.png
β”‚
β”œβ”€β”€ popup.html
β”œβ”€β”€ manifest.json
β”‚
β”œβ”€β”€ README.md
β”œβ”€β”€ PRIVACY.md
β”œβ”€β”€ LICENSE
└── .gitignore
Enter fullscreen mode Exit fullscreen mode

The flow is simple:

  • The popup controls everything
  • The content script runs only on linkedin.com
  • Scripts are injected only after user action
  • Data is stored with chrome.storage.local

Content Script

The content script does three things:

  1. Scrolls the page
  2. Clicks β€œsee more” where needed
  3. Extracts emails from visible text and mailto: links

That’s it.

  • No DOM mutation beyond expanding content.
  • No hidden scraping.
  • No background execution.

This was critical for staying within Chrome Web Store policies.


What’s Next

I’m keeping the roadmap intentionally conservative:

  • Minor UX improvements
  • Performance tweaks
  • Optional export formats

If you’re curious, feel free to check out the repo:
πŸ‘‰ https://github.com/yagnesh97/reach-in

Happy building.

Top comments (0)