Hide LinkedIn distractions — puzzles, ads, upsells, promoted posts, "People you may know", sidebar junk, and more. Chrome extension, Manifest V3, no dependencies, no network calls, no tracking.
- Clone this repo.
- Open
chrome://extensions/and enable Developer mode. - Click "Load unpacked" and select the repo folder.
- Click the NoiseOut icon to open the dashboard.
21 toggles across 7 categories. Turn on only what bothers you.
| Category | Toggles |
|---|---|
| Visual | Black & White (grayscale the whole site) |
| Feed | Main feed, Sponsored posts, Offers / promo cards, Post composer, Post metrics, Post comments |
| Feed Sidebar | Puzzles / games, "Add to your feed", LinkedIn News, Sidebar ads, Footer |
| Navigation | Notification badges, Messaging popup, Premium upsell, "For Business" nav, Jobs nav |
| Left Sidebar | Profile card, Company page links |
| My Network | "People you may know" (grow page + profiles + search) |
| Services | Premium requests |
The dashboard has a search box, per-category master switches, reset to defaults, and import/export as JSON. Settings are synced across devices via chrome.storage.sync.
A content script runs at document_start on every https://*.linkedin.com/* page. It injects CSS rules for selectors that can be expressed as stable attribute matches (data-testid, aria-label), and runs JavaScript finder functions for elements that need DOM traversal. A debounced MutationObserver keeps hiding new elements as the feed lazy-loads. Pathname polling catches SPA navigation so finders re-run when you click from one LinkedIn page to another.
Hides are sticky by default — once hidden, elements stay hidden. A few selectors opt into dynamic re-evaluation via a stillValid(el) predicate so things like the Services marketplace detail panel can reappear when you click a non-premium request.
storage— to sync toggle stateactiveTab— to read the current LinkedIn tab's pathname for per-page highlightinghttps://*.linkedin.com/*host permission — the extension only runs on LinkedIn
No remote code, no analytics, no network requests of any kind.
- Add an entry to
SELECTORSinselectors.jswith either acssarray (selectors that getdisplay: none) or afind()function returning elements to hide. - Add the toggle key to
TOGGLE_METAinpresets.jswith a label, category, andpagesarray (URL pathname prefixes where it's relevant, or['*']for global). - Add it to
DEFAULT_TOGGLESwith the default state.
MIT