-
-
Save jaydorsey/d728423051fbcb54f1abd53ed3920c9e to your computer and use it in GitHub Desktop.
# Block things on LinkedIn with uBlock Origin that LinkedIn won't let you block | |
# Choose "Options" in uBlock Origin with a right-click, and add these to | |
# "My filters" | |
# ADDING YOUR OWN FILTERS | |
# | |
# Using Linkedin.com as an example | |
# | |
# 1. Open up the webpage | |
# 2. Find some text you want to block | |
# 3. Open up a console (right-click, Inspect, click the Console tab) | |
# 4. Using the "greedy" placeholder example, find your text | |
# | |
# $x("//*[(text()[contains(.,'YOUR TEXT HERE')])]") | |
# | |
# Click the arrow to expand the result in the console and hover over | |
# one of the numbered elements shown; it should highlight an element in | |
# the webpage | |
# | |
# The code above usually just finds the HEADER where the text is present. You typically | |
# want to block one of the parent elements. Which parent element? | |
# | |
# You can use the xpath parent navigator syntax to move "up" thru the parents. Just | |
# take what you wrote above, and keep adding a bunch of /.. values to the end. In between | |
# each, expand the result in your console and hover over the elements to see if you've | |
# moved up the tree enough to block the entire element you want | |
# 2023-10-07 So many recommendations from LinkedIn | |
linkedin.com##:xpath('//*[(text()[contains(., "Suggested")])]/../../../../../../../../../..') | |
linkedin.com##:xpath('//*[(text()[contains(., "Expert answers on ")])]/../../../../../../../../../..') | |
linkedin.com##:xpath('//*[(text()[contains(., "Recommended for you")])]/../../../../../../../../../..') | |
linkedin.com##:xpath('//*[(text()[contains(.,"Events recommended for you")])]/../../../../../../../../../..') | |
# 2020-02-24 Promoted posts | |
linkedin.com##xpath('.//span[contains(@class, "feed-shared-actor__sub-description") and text()[contains(.,"Promoted")]]/../../../..') | |
# 2023-01-23 Promoted posts (thanks @Vaansh! & @kagzgenius) | |
linkedin.com##li:has-text(Promoted) | |
# Sponsored posts (old version) | |
linkedin.com##:xpath('//*[(text()[contains(.,"Promoted")])]/../../../..') | |
# Events recommended for you 2023-03-03 | |
linkedin.com##:xpath(//span[text()[contains(.,'Events recommended for you')]]/../../../../../..) | |
# Recommended for you 2023-03-03 Generic recommendation block w/ companies or pages | |
linkedin.com##:xpath(//span[text()[contains(.,'Recommended for you')]]/../../../../../..) | |
# 2021-09-24 Add to your feed | |
linkedin.com##:xpath('//*[(text()[contains(.,"Add to your feed")])]/../../../../../../..') | |
# Courses & News 2021-09-24 | |
linkedin.com##:xpath('//*[(text()[contains(.,"Today’s top courses")])]/../../../..') | |
# Completely unrelated jobs that are always the exact opposite of your profile | |
linkedin.com##:xpath('//*[(text()[contains(.,"Jobs recommended for you")])]/../../../../../../..') | |
# 2022-12-06 | |
linkedin.com##:xpath(//span[(text()[contains(.,'Recommended for you')])]/../../../../../../../../../..) | |
linkedin.com##:xpath(//span[(text()[contains(.,'Events recommended for you')])]/../../../../../../../../../..) | |
# LinkedIn News 2023-03-03 | |
linkedin.com##:xpath(//span[text()[contains(.,'LinkedIn News')]]/../../..) | |
# I think this one stopped working, but leaving here for reference | |
linkedin.com##:xpath('//*[(text()[contains(.,"LinkedIn News")])]/../../../../../..') | |
# Network likes 2023-03-03 | |
linkedin.com##:xpath(//span[text()[contains(.,'likes this')]]/../../../../..) | |
# Starting a new position banner image 2023-03-03 | |
linkedin.com##:xpath(//div[contains(@class, 'feed-shared-celebration-image')]) | |
# Facebook junk (no longer updated, I don't use facebook) | |
# Sponsored post garbage | |
facebook.com##:xpath('//*[(text()[contains(.,"Sponsored")])]/../../../..') | |
# Marketplace garbage | |
facebook.com##:xpath('//*[(text()[contains(.,"Still Available on Marketplace")])]/../../../../../..') |
From the OP, here is the list of the lines that do not break the page:
linkedin.com##:xpath('//[(text()[contains(., "Expert answers on ")])]/../../../../../../../../../..')
linkedin.com##:xpath('//[(text()[contains(., "Recommended for you")])]/../../../../../../../../../..')
linkedin.com##:xpath('//*[(text()[contains(.,"Events recommended for you")])]/../../../../../../../../../..')
linkedin.com##xpath('.//span[contains(@Class, "feed-shared-actor__sub-description") and text()[contains(.,"Promoted")]]/../../../..')
linkedin.com##li:has-text(Promoted)
linkedin.com##:xpath('//*[(text()[contains(.,"Promoted")])]/../../../..')
linkedin.com##:xpath(//span[text()[contains(.,'Events recommended for you')]]/../../../../../..)
linkedin.com##:xpath(//span[text()[contains(.,'Recommended for you')]]/../../../../../..)
linkedin.com##:xpath('//*[(text()[contains(.,"Today’s top courses")])]/../../../..')
linkedin.com##:xpath('//*[(text()[contains(.,"Jobs recommended for you")])]/../../../../../../..')
linkedin.com##:xpath(//span[(text()[contains(.,'Recommended for you')])]/../../../../../../../../../..)
linkedin.com##:xpath(//span[(text()[contains(.,'Events recommended for you')])]/../../../../../../../../../..)
linkedin.com##:xpath(//span[text()[contains(.,'likes this')]]/../../../../..)
linkedin.com##:xpath(//div[contains(@Class, 'feed-shared-celebration-image')])
I spent some time with these rules today. Some items seems to be nested at new levels - I'm not sure if that's consistent across browsers/devices, but this is when I ended up with.
I tested yours, it works great. I still get the "suggested posts" but I'm not sure it can be removed.
Amazing ! thank you @superresistant and @RiskTolerance
Still couldn't manage to filter out spammy polls.
I think I could use PollComponent
and DynamicPollComponent
:)
Going ham on ubo attempting to block Promoted posts, nothing is working. WTH?
linkedin.com##li:has-text(Promoted)
linkedin.com##li:has-text(/^Promoted$)
linkedin.com##span:has-text(Promoted):upward(6)
linkedin.com##span:has-text(/^Promoted$/):upward(8)
linkedin.com##xpath('.//span[contains(@class, "feed-shared-actor__sub-description") and text()[contains(.,"Promoted")]]/../../../..')
linkedin.com##:xpath('//*[(text()[contains(.,"Promoted")])]/../../../..')
linkedin.com##:xpath(//span[text()[contains(.,'Promoted')]]/../../../../../../../../../../..)
linkedin.com##:xpath('//*[(text()[contains(.,"Promoted")])]/../../../..')
linkedin.com##:matches-path(/feed):xpath('//*[(text()[contains(.,"Promoted")])]/../../../../../..')
linkedin.com##:matches-path(jobs/search):xpath('//*[(text()[contains(.,"Promoted")])]/../../../../../..')
linkedin.com##li:has-text(Promoted)
On the job search-results pages, this works for me - uBO 1.54.0, Firefox. In fact, I'ld go mad if it didn't.
Firefox
Is what's different. This now works, but literally no results are returned which is weird b/c it implies all posts are promoted...
amazing job! thanks !
@jaydorsey Do you want to turn this into a repo so we can submit PRs? I am also considering making a general "clean UI" stylesheet/filter list/plugin that would involve a lot more modifications.
@jaydorsey Do you want to turn this into a repo so we can submit PRs? I am also considering making a general "clean UI" stylesheet/filter list/plugin that would involve a lot more modifications.
I don't have time to manage and moderate, but I think making it a repo is a good idea.
I suspect most people found this gist via a Google search (it shows as a top result for unlock LinkedIn)
If you or anyone else wants to create a repo, I'll edit my gist with a note & add a link to it.
Thank you and all the other participants for such a helpful blocking list.
Just in case, I'm using the following subset that works at the moment I'm writing this post:
linkedin.com##li:has-text(Promoted)
linkedin.com##:xpath('//*[(text()[contains(., "Suggested")])]/../../../../../../../../../..')
linkedin.com##:xpath('//*[(text()[contains(., "Expert answers on ")])]/../../../../../../../../../..')
linkedin.com##:xpath('//*[(text()[contains(., "Recommended for you")])]/../../../../../../../../../..')
linkedin.com##:xpath('//*[(text()[contains(.,"Events recommended for you")])]/../../../../../../../../../..')
linkedin.com##:xpath(//span[text()[contains(.,'likes this')]]/../../../../..)
Copy and paste it to the uBlock's My Filters
tab and click Apply changes
Hi I'm unable to see any jobs when I enable the filter to remove promoted filter. It does render again but I find jobs on very limited of those pages. Does it work on chrome
Hi I'm unable to see any jobs when I enable the filter to remove promoted filter. It does render again but I find jobs on very limited of those pages.
Blocking 'Promoted' listings on Linkedin is like that old joke:
Person: Hey Doc! Everytime I twisted arm like this, I get a terrible pain.
Doctor: Then don't do that.
The pain is Linkedin: they're pushing more&more listings to be paid ie 'Promoted'. It seems most listings already are. Who knows if/when they'll block free listings.
So don't block 'Promoted' ; instead filter on job Title, Company name or Location like I described here.
Thanks a lot for this suggestion. Appreciate it. Had to block this staffing agencies which had 100's of jobs on Linkedin. It does help me with that and make my search effective !
I spent some time with these rules today. Some items seems to be nested at new levels - I'm not sure if that's consistent across browsers/devices, but this is when I ended up with.
Edit: I scoped the rules to the /feed page... I think the only thing that is broken now is when I view my own posts...
linkedin.com##:matches-path(/feed):xpath('//[(text()[contains(., "Suggested")])]/../../../../../../../../../..')
linkedin.com##:matches-path(/feed):xpath('//[(text()[contains(., "Expert answers on ")])]/../../../../../../../../../..')
linkedin.com##:matches-path(/feed):xpath('//[(text()[contains(., "Recommended for you")])]/../../../../../../../../../..')
linkedin.com##:matches-path(/feed):xpath('//[(text()[contains(.,"Events recommended for you")])]/../../../../../../../../../..')
linkedin.com##:matches-path(/feed):xpath('//*[(text()[contains(.,"Promoted")])]/../../../../../..')
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'likes this')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'celebrates this')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'loves this')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'finds this insightful')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'finds this funny')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,'supports this')]]/../../../../../../..)
linkedin.com##:matches-path(/feed):xpath(//span[text()[contains(.,' • 2nd')]]/../../../../..)
linkedin.com##.scaffold-layout__aside
linkedin.com##.text-align-left.link-without-hover-state.t-bold.t-black.t-12.feed-identity-module__anchored-widget--premium-upsell.feed-identity-module__anchored-widget.link-without-visited-state.app-aware-link
linkedin.com##.premium-upsell-link--extra-long.premium-upsell-link--truncate.global-nav__spotlight-upsell.global-nav__primary-link--premium.global-nav__primary-link.link-without-visited-state
linkedin.com##.pr3.global-nav__app-launcher-trigger.pl3.global-nav__primary-item--divider.global-nav__primary-link
linkedin.com##:matches-path(/feed)header#global-nav__branding-logo:style(margin-left: 4 !important)
linkedin.com##:matches-path(/feed)header#global-nav:style(padding-left: 0 !important)
linkedin.com##:matches-path(/feed)header#global-nav:style(padding-right: 0 !important)
linkedin.com##:matches-path(/feed)header#global-nav:style(display: flex !important)
linkedin.com##:matches-path(/feed)header#global-nav:style(justify-content: center !important)
linkedin.com##:matches-path(/feed)header#global-nav__content:style(width: 1000px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout:style(display: flex !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout:style(justify-content: center !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__inner:style(margin-top: -455px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__inner:style(padding-top: 25px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__row:style(display: block !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__row:style(margin-top: 0px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__row:style(padding-left: 350px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__row:style(padding-right: 50px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(width: 250px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(height: 455px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(position: sticky !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(top: 52px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(padding-top: 25px !important)
linkedin.com##:matches-path(/feed)div.scaffold-layout__sidebar:style(margin-left: -300px !important)