Tired of the AI slop in your LinkedIn feed? Unfollow everyone in one click.
Unfollow everyone in your LinkedIn feed, at human pace, in your own browser. Free, open source, no account, no server, no telemetry.
You stay connected to everyone — unfollowing is not disconnecting. You just stop seeing their posts.
And because unfollowing everybody does not empty the feed — LinkedIn refills it with what your network liked, commented on and reposted — Quiet feed hides those in the page too. See below.
Download for Chrome → (a 69 KB zip from the latest release) · Install guide with pictures
Four steps, about two minutes. It is not on the Chrome Web Store — see why.
Take linkedin-unfollow.zip from the
latest release,
then unzip it somewhere you will keep it. Chrome loads the extension from
that folder every time it starts, so do not leave it in Downloads and then empty
Downloads.
Type the address in by hand — it will not come up in search results. The switch is in the top-right corner.
Pick the folder itself, the one holding manifest.json — not a file inside it.
Click the jigsaw-piece icon, find LinkedIn Unfollow, click the pin. Then go to linkedin.com, sign in as normal, and click the icon.
Three buttons and a number box. Work through them in order; do not skip to the third one.
- Check count — how many accounts you follow, and the first few names. Changes nothing.
- Preview — the list of people it would unfollow, read by exactly the same call. Sends no unfollow at all.
- Unfollow — set "Unfollow up to" to 1 first. Run it. Check that person really is unfollowed on LinkedIn. Then set it to 25, or 500, or clear the box to work through everyone.
Under the box are two tick boxes, both off to begin with: also unfollow my connections, which is the one that actually silences the feed (see below), and fast, which sends three at a time.
While it runs there is a progress line and a Stop button. Stop ends the run after the person it is on.
Emptying the Following list to zero does not silence your feed.
LinkedIn makes you follow everybody you connect with, and those connections never appear on the "Following" page — which is the list LinkedIn shows you, and the list this extension reads. Verified on a real account: with that list down to 0, the feed was still full of posts from connections.
The state is visible on your followers list instead, where every row comes
back with its own following: true or false. That is what the tick box under
"Unfollow up to" turns on:
Also unfollow my connections (scans your followers list; slower)
With it ticked, a run works through the Following list exactly as before, and then reads your followers list fifty at a time and unfollows the ones still marked as followed. Nobody is disconnected: you stay connected, you just stop seeing the posts.
It is slower because it is far more reading. 9,479 followers is 190 requests before a single unfollow is sent, so "Check count" with the box ticked takes a couple of minutes, and the progress line reads "Scanning followers… N of M" while it works.
Unfollow everybody and the feed does not go quiet — it refills.
Unfollowing removes what you subscribed to, and nothing else. LinkedIn then fills the space with what the people you are still connected to have been doing — the posts they liked, commented on and reposted, the people they follow — plus its own suggestions and its ads. Quiet feed hides all of that in the page, so what is left is the people you chose to follow.
Verified on a real account the day after unfollowing everyone: with the Following list at zero, every post on the home feed carried a header line above the author saying why it was there.
| What is in the post's first lines | What it is |
|---|---|
| "Priya likes this", "celebrates", "loves", "finds this insightful" | somebody's reaction |
| "Priya commented", "Priya and 3 others commented" | somebody's comment |
| "Priya reposted this" | somebody's repost |
| "Followed by Priya", "Priya follows this page" | somebody a connection follows |
| "Priya was mentioned…", "Northwind is hiring" | other activity |
| "Suggested" | LinkedIn's recommendation |
| "Promoted" — above the name for a person, below it for a page | an ad |
| a Follow button on the post, and no header at all | somebody you don't follow — an unlabelled suggestion |
a group's name above an inline author line (Tariq Mahmood • 3rd+) |
a post in a group you joined |
| "Jobs recommended for you", "People you may know", "Add to your feed" | a recommendation module, not a post at all |
| none of the above | somebody you follow — this is what stays |
Everything below the first four rows took two more passes against the live feed to find, and none of it is a header:
- LinkedIn only draws a Follow button on a post when you do not already follow its author, which makes it exactly the statement "Suggested" makes, without the word — and on a feed you have just emptied it is the largest category there is.
- Ads on company pages put "Promoted" under the page name rather than above it, and company posts carry no connection-degree marker at all: their author block is a bare follower count ("10,927 followers").
- A group post puts the group's name where a header would go and then runs
the author's name and degree together on one line. A plain person's post puts
the name on its own line above a bare
• 3rd+, with nothing above that — the difference in shape is the whole tell. - The recommendation modules have no author and no author block whatsoever, which is why they survived everything else. They announce themselves in a fixed phrase on the first line, matched whole: "Recommended for you" is a module, "Recommended for you: three books" is somebody's post.
LinkedIn's markup has no stable class names — they are obfuscated on every build — so all of this is read off the rendered text of the post. Everything else is left alone, and "left alone" is the default in every unclear case: an item with no author block (a degree marker, a follower count, or the post's own age) is not a post as far as this is concerned — that is the composer, the draft box, the "Start a post" card, "Add to your feed", the sort control — and a header form it has not been taught falls through to shown. A Follow button only counts as one when it is a line of its own up where the author is, so "Follow us on Instagram" in somebody's post is not one. It hides only what it positively recognised.
Turn it on and off in the popup, in the card above the unfollow one: a master switch, and four tick boxes — Network activity, Promoted, Suggested and people you don't follow, and Posts in groups you've joined. All five are on to begin with. At the top of the feed a single grey line says what it did — "Quiet feed: hid 30 posts (4 network activity, 3 promoted, 5 recommendations, 12 from people you don't follow, 6 from groups). Show them" — and Show them puts every one of them back for that page load.
New posts are classified and hidden the moment LinkedIn inserts them, in the same turn of the event loop, so a fast scroll never flashes a post before it goes; only the line at the top and the tally wait for the batch to settle.
Nothing is deleted, nothing is sent. It adds one CSS class to posts already in
your browser; no request is made, LinkedIn is not told, and the count in the
popup is a number in chrome.storage.local on your own machine.
It makes the same requests linkedin.com's own pages make, from your own signed-in browser:
| List | GET /voyager/api/graphql?…MYNETWORK_CURATION_HUB…PEOPLE_FOLLOW… — the total comes straight from LinkedIn's totalResultCount, so "you follow 735 people" is the real number, not a count of rows on screen. |
| Followers list | GET /voyager/api/graphql?…MYNETWORK_CURATION_HUB…FOLLOWERS… — the same query with resultType FOLLOWERS, fifty rows at a time. Read only when "also unfollow my connections" is ticked. Each row comes back with its own following state, which is the only place your connections' state appears. |
| Unfollow | POST /voyager/api/feed/dash/followingStates/urn:li:fsd_followingState:urn:li:fsd_profile:<id> with {"patch":{"$set":{"following":false}}} — one person, one request. |
Around those calls:
- Paced like a human. One person every 0.8–1.6 seconds, randomised, one request at a time. Never a burst.
- Stops on any LinkedIn challenge. 429, 451, 401 and 403 end the run on the spot, and so do two non-200s in a row. Nothing is ever retried. A CAPTCHA or "confirm it's you" check — which usually arrives as a redirect to a web page rather than as an error code — ends the run too, is never counted as an unfollow, and stops any further run until you have completed the check yourself. More below.
- You can stop it. Stop takes effect after the person it is on, so you are never left wondering whether the last one landed.
- Never more than you asked for. The limit is enforced in the engine, and one run will not do more than 5,000 whatever you type.
- Nothing leaves your browser. No account, no server, no analytics, no
telemetry, no third-party requests of any kind. The only host it talks to is
www.linkedin.com, with your own cookies. Readsrc/— it is about 4,400 lines and there is no build step, so what you install is what you can read. - Nothing is bypassed. The CSRF token is your own
JSESSIONIDcookie, read through Chrome'scookiesAPI. No security measure is defeated, worked around or forged; if you are not signed in, it simply fails.
Fast mode. Ticking "Fast (3 at a time — more likely to trip LinkedIn's rate limit)" runs three streams over the same list instead of one, each leaving 0.5–0.9 seconds between its own requests: roughly four unfollows a second rather than one. The three share one cursor, one list of people already handled and one pool of limit slots, so they cannot between them overshoot the limit you typed or send anyone twice, and a 429, 403 or 401 on any one of them ends the run for all three — Stop and the progress line work across them as usual. Careful, one at a time, is the default, and it is the one to use: fast is several times quicker and correspondingly more likely to be the thing LinkedIn notices.
If LinkedIn rotates the hashed query id the list call depends on, there is a second engine that clicks the Following page instead, exactly as a person would. See docs/fallback.md.
LinkedIn sometimes stops what you are doing and asks you to prove you are you: a CAPTCHA puzzle, a "Let's do a quick security check" page, a code sent to your email or phone, or a request to sign in again.
The short version. The extension notices the check, stops, and tells you. You complete the check yourself, in your own browser. You leave it alone for a while. Then you press a button to say you are done. It never tries to solve a check or get round one.
LinkedIn does not publish its rules, so nobody outside LinkedIn can give you a complete list. These are the things most often reported to bring one on:
- A new device, browser or IP address — somewhere LinkedIn has not seen you sign in from before.
- Speed. Actions closer together than a person would manage. This is what the "Fast" tick box risks.
- Volume. Hundreds or thousands of the same action in one sitting.
- Many profile views in a short time, if you have been doing that as well.
- A fresh or restricted account. A new account, a dormant one, or one that has been warned before gets much less room.
- VPNs and proxies. An address shared with thousands of strangers, or one that puts you in a different country from yesterday.
- Two tools at once. Another extension or service automating the same account at the same time. LinkedIn sees the sum.
A check is not a ban. It is LinkedIn asking a question.
Every response is classified before it is believed
(src/classify-response.js):
| What comes back | What it means | What happens |
|---|---|---|
The request is redirected to /checkpoint/… or a path containing /challenge |
Security check | The run ends; nothing more starts |
A 200 that is an HTML page mentioning a CAPTCHA, a security check, a security verification, "verify you're human", unusual activity or a checkpoint |
Security check | The run ends; nothing more starts |
A JSON body carrying a top-level challengeUrl, or a 403 whose body names a challenge |
Security check | The run ends; nothing more starts |
| 451 | Security check | The run ends; nothing more starts |
The request is redirected to /login, /uas/login, /m/login or /authwall, or a 200 that is the sign-in page, or 401 |
You are signed out | The run ends; sign in and run it again |
| 429, 999 or 403 | Rate limited, or refused | The run ends |
The redirect row is the one that matters. LinkedIn's usual way of interrupting a request is not an error code: it sends the request to a web page, the browser follows it, and what arrives looks like a success — status 200. Before 1.2.1 the extension read that as an unfollow that had worked, and counted somebody who was never unfollowed. It no longer does: a redirected 200 is never a success.
When it is a security check:
- The run ends there. In fast mode all three streams stop.
- The person it was on is not counted and not listed. Everyone before them, who really was unfollowed, is.
- The time is written to
chrome.storage.localaschallengedAt. While that is set, nothing starts — not Check count, not Preview, not Unfollow, and not the click-the-page fallback, which is a different route to the same place and therefore not one the extension will take. - The popup shows a banner at the top, LinkedIn is asking you to confirm it's you, with three numbered steps.
Closing the popup does not clear it. Restarting Chrome does not clear it. Time passing does not clear it. One thing does: you, pressing I've done it — resume.
Quiet feed is not involved in any of this. It makes no requests, so there is nothing for it to be challenged on, and it goes on working.
- Complete the check by hand. The banner's Open LinkedIn button opens linkedin.com in a new tab and does nothing else. Do whatever LinkedIn asks: the puzzle, the code, the sign-in.
- Wait. Leave it alone for at least 24 hours. The banner shows when that is. Using LinkedIn by hand in the meantime is fine.
- Do less at once. Set "Unfollow up to" to 25 or 50 rather than clearing the box, and come back another day for the rest.
- Leave "Fast" unticked.
- Do not run two automation tools at once. If you also use LinkedIn Toolkit, lower its daily caps and keep its warm-up on — and do not run it while this is running.
- Turn off your VPN. Use the connection LinkedIn is used to seeing you on.
- Then press "I've done it — resume", and start with a limit of 1.
If a second check arrives soon after the first, stop for a week rather than a day.
Nothing that solves a CAPTCHA, passes a check on your behalf, or gets round one. No solver services, no retrying the request that was challenged, no switching to another route when one is blocked, no rotating addresses or browser fingerprints, and no clearing the pause automatically after some amount of time.
Two reasons. It is evasion of a security measure — a check is LinkedIn making sure the person at the keyboard is the account holder, and software that answers it for you defeats that on purpose. And it is how a warning becomes a ban: a check is a question, and an account whose automation carries straight on, or comes back seconds later with the puzzle mysteriously solved, has confirmed exactly what the check was asking about.
- On a VPN, a proxy or an unfamiliar network? Turn it off, or go home.
- Is another tool touching this account? Remove it. One tool per account.
- Is "Fast" ticked? Untick it.
- Working through everyone in one go? Do 25–50 a day instead.
- Did you resume too soon? 24 hours is a minimum. After a second check, wait a week.
- Is the account new, or has it been restricted before? Use it by hand for a month first.
- Did you press "I've done it — resume" without doing the check? The next request will be challenged again. Open LinkedIn and look.
If none of that helps, stop automating that account.
The redirect behaviour was found by reading the code, not by watching it happen: nobody on this project has captured a live security check against these calls, because one cannot be produced on demand and we will not try to provoke one. So the exact paths LinkedIn redirects to, the wording on its check page (English phrases only are looked for), and the JSON shapes in the table above are assumptions. What does not depend on them: a response that is not a genuine answer from the API is never counted as an unfollow, whatever it turns out to be.
If you hit a real check, please open an issue saying what the popup showed and whether the run stopped.
Is this against LinkedIn's terms? Yes — automating your account is. LinkedIn's User Agreement prohibits using "bots or other automated methods" to access the service, and LinkedIn restricts and permanently bans accounts for it. This tool does not pretend otherwise. Use it on your own account, with your eyes open, or do not use it.
Does it bypass any security measure? No. It sends the requests the page itself sends, signed with your own session cookie, at a fraction of the rate a person clicking could manage. It does not defeat rate limits, solve challenges, rotate identities, or touch anyone else's account — and when LinkedIn puts up a challenge it stops rather than working around it.
LinkedIn showed me a CAPTCHA / asked me to confirm it's me. What now? The run has already stopped, and the popup has a banner with three steps: open LinkedIn and complete the check yourself, leave it for at least 24 hours, then press "I've done it — resume". Nothing will run until you do. The person it was on when the check arrived was not unfollowed and is not counted. See CAPTCHAs and security checks.
Can it solve the CAPTCHA for me? No, and it never will. Solving or getting round a security check is evading a security measure, and it is also how a warning becomes a ban.
I keep getting security checks. Turn off your VPN, stop any other tool that automates the same account, leave "Fast" unticked, do 25–50 a day rather than everyone at once, and wait longer between runs. The full list is above.
It said 0 following but I still see posts from connections. That is what the "also unfollow my connections" tick box is for. Connections are followed automatically when you connect and never appear in LinkedIn's Following list, so emptying that list leaves every one of them behind. Tick the box and run it again — it reads your followers list, where their state actually shows up.
I unfollowed everyone and my feed is still full. It will be. Unfollowing only empties the list of people whose posts you subscribed to; LinkedIn immediately refills the feed with what your connections liked, commented on and reposted, plus suggestions and ads. That is what Quiet feed is for — it hides them in the page, and it is on by default.
Does Quiet feed send anything to LinkedIn? No. It reads the text of the posts already on screen and adds a CSS class to the ones it recognises. No request is made, nothing is deleted, and pressing "Show them" at the top of the feed puts them all back.
Will I lose my connections? No. Unfollowing is not disconnecting. Your connections stay connections; you just stop seeing their posts. You can follow anyone again by hand.
Can I undo it? No. Not in bulk. Unfollowing 800 people would have to be reversed 800 times by hand. This is why "Preview" and a limit of 1 exist — use them.
How long does 800 people take? Roughly fifteen minutes. The popup can be closed while it runs.
Does it work on Edge, Brave, Arc? It is a standard MV3 extension, so any Chromium browser that can load an unpacked extension should run it. Only Chrome is tested.
Do you see any of my data? No. There is nothing to see it with: no account, no backend, no analytics.
Read this before you install it.
Automating your LinkedIn account may breach LinkedIn's User Agreement. LinkedIn detects automation and restricts, suspends and permanently bans accounts for it, including accounts that have done nothing else wrong. That risk is entirely yours. The pacing and the stop conditions in this extension reduce it; nothing removes it.
This software is provided as is, without warranty of any kind. The author is not responsible for any restriction, suspension or loss of your LinkedIn account, for any people you unfollow and cannot get back, or for any other consequence of running it. It performs an irreversible bulk action on your own account: preview first, try one, and never run it against an account you cannot afford to lose.
It is for your own account only. Do not use it on an account you do not own or have not been asked to operate.
Store policy forbids extensions that facilitate breaking another site's terms of service, and an honest reading of LinkedIn's terms puts automating your own account in that territory. Loading it unpacked keeps the decision — and the code you are running, which you can read — with you.
npm install
npm test # vitest, with an in-memory chrome mock — nothing touches LinkedIn
npm run lint # eslint
npm run zip # dist/linkedin-unfollow-v1.2.1.zipThere is no build step. src/ is what ships.
| Path | What it is |
|---|---|
src/linkedin.js |
The three API calls, and the parsers for the two list responses. |
src/classify-response.js |
What a response actually was: an answer, a security check, signed out, rate limited, or an error. Pure — no fetch, no chrome. |
src/background.js |
The engine: two sources, one to three streams, pacing, limits, stop conditions, the security-check pause, message router. |
src/dom-fallback.js |
The click-the-page engine, kept for when the query id rotates. |
src/content/classify.js |
Quiet feed's classifier: a post's text in, a category out. Pure — no DOM, no chrome. |
src/content/quiet-feed.js |
The content script: find the posts, hide the ones the tick boxes name, draw the line at the top. |
src/content/boot.js |
Three lines, because MV3 will not load a module as a content script. |
src/popup/ |
The one screen. |
tests/ |
358 tests. Every fixture is invented; no real person appears in them. |
Built by Dominic Gonsalves, founder of Formatix AI — GitHub @FormatixAI.
Want search export, saved lists, an AI copilot and 30-odd other things on LinkedIn? That is the bigger project this was carved out of: LinkedIn Toolkit.
MIT licensed. See LICENSE.



