DEV Community

Cover image for No Listicles! The chrome add-on that removes list-type articles from your DEV.TO feed

No Listicles! The chrome add-on that removes list-type articles from your DEV.TO feed

Lev N. on December 20, 2023

You probably knew this was coming sooner or later. DEV.TO has been filled with listicles lately and something had to be done. But before we contin...
Collapse
 
lionelrowe profile image
lionel-rowe

Here's a regex that seems to give good results (very few false positives/negatives from some quick testing). I've added comments and whitespace to make it easier to read/improve:

const re = new RegExp(
    String.raw`
        (?:                               # location within the title:
            (?:
                ^                         # - at the start
                | : | - | โ€”               # - after certain punctuation (start of subtitle)
                | the | top | mastering   # - words often found before the number in listicles
                | these | first
            )
        )
        [^\p{L}\p{M}\p{N}]*               # followed by 0 or more non-word characters (punctuation etc)
        (?:
            \d{1,3}                       # 1-3 digits (4 digits is most likely a year e.g. "2023")
            | one | two | three           # number words 1..10
            | four | five | six
            | seven | eight | nine
            | ten
        )
    `
        // strip whitespace and comments from preceding regex source
        .replaceAll(/\s+|#.*$/gm, ''),
    // case insensitive and unicode aware
    'iu',
)
Enter fullscreen mode Exit fullscreen mode

Usage:

Object.groupBy(
    [...document.querySelectorAll('.crayons-story__title')]
        .map((x) => x.textContent.trim()),
    re.test.bind(re),
)
Enter fullscreen mode Exit fullscreen mode

Example results:

{
    "true": [
        "9 Project Ideas to Master Frontend Development in 2024 | **with resource**",
        "11 free and fun APIs you must use in your side project",
        "Top 5 Ways To Host Your Full-Stack App For Free ๐Ÿš€โœจ",
        "๐Ÿซต 5 achievable side hustles for developers๐Ÿ’ฐ",
        "5 GitHub Repos To Make You a Better for Learning Developer.",
        "Top 42 ๐Ÿ Python libraries you need to know ๐Ÿฆพ",
        "A Year of Self-Hosting: 6 Open-Source Projects That Surprised Me in 2023",
        "12 Github Repositories To Master NextJS ๐Ÿ†",
        "๐ŸŽ„24 Open-Source Libraries: for your downtime holiday hacking๐ŸŽ…๐Ÿฝ๐ŸŽ",
        "11 Open-Source Projects That Will Rocket Your Resume ๐Ÿš€ (Jumpstart Your Career in 2024! ๐ŸŒŸโœจ)",
        "5 Open Source tools written in Golang that you should know about",
        "๐Ÿ”ฅOur TOP 13 DEPLOYMENT & TEMPLATING tools for KUBERNETES ๐Ÿš€",
        "๐Ÿ› ๏ธ Ready to Launch: Our TOP 11 OPEN SOURCE Tools to START your business! ๐Ÿ’ปโœจ",
        "The Top 10 GitHub Repositories Making Waves ๐ŸŒŠ๐Ÿ“Š",
        "\"Mastering JavaScript: 8 Easy Shortcuts for Awesome Code!\"",
        "First 15 Open Source Advent projects"
    ],
    "false": [
        "HTML can do this? Part 1",
        "Building a Collaborative Whiteboard using ReactJS, Socket.io and NodeJS ๐Ÿค",
        "Shell Scripting For DevOps: Quick Beginner's Guide ๐Ÿ’Ž",
        "๐ŸŽ‰Monitor your Javascript application like a pro๐Ÿง™โ€โ™‚๏ธ๐Ÿ’ซ",
        "๐Ÿ’ณ Payments 101 for a Developer๐Ÿ‘จโ€๐Ÿ’ป",
        "DEV Top Stats & Trends in 2023",
        "โญCrafting Effective Documentation",
        "Complexity by Simplicity - A Deep Dive Into Kubernetes Components",
        "ECMAScript 2023: Fresh Goodies for JavaScript Developers",
        "Supabase Auth: Identity Linking, Hooks, and HaveIBeenPwned integration",
        "Dev.to and \"The Missing Middle\" Economics",
        "Frontend Development in 2024: Crafting a Dynamic Skillset for Success",
        "Introduction to NGINX",
        "Achievable side hustles for developers๐Ÿ’ป๐Ÿ’ฐ",
        "Building a cloud backend in Go using REST and PostgreSQL",
        "A Close Call with Real-Time: How Rethinking Pub-Sub Saved the Day",
        "How to Do Authorization - A Decision Framework: Part 1",
        "๐Ÿš€ Lambda Test Revolution: Master Mocking & Slash Costs with HTTP-Interceptor!",
        "Build a full stack app with Rust, Next.js and Docker",
        "What I've Learned By Building DEV Analytics Dashboard ๐Ÿ’ก",
        "Is tech boring lately or is it me?? ๐Ÿ˜",
        "๐Ÿคจ Who owns the internet?",
        "๐ŸŒŸ Celebrate Your Impact: #DEVImpact2023 Reflections",
        "Deploying a Go backend to Kubernetes with Automatic Cluster Provisioning",
        "The best Javascript UI framework to use in 2023",
        "React Hooks are Dead? How Signals Are Taking Over",
        "Multithreading: Event Loops vs Thread Pools and more...",
        "Building Your DevOps Playground: A Beginner's Guide to Setting Up Your Development Environment",
        "Discrimination Faced by Women In Tech",
        "What was your win this week?",
        "๐ŸŽฌ๐ŸฟWhat's Your Favorite Holiday Film?",
        "What you learning about this weekend? ๐Ÿง ",
        "Featured Mod of the Month: Helen Anderson",
        "I made a Copilot in Rust ๐Ÿฆ€ , here is what I have learned... (as a TypeScript dev)"
    ]
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
lnahrf profile image
Lev N.

This looks good! I am checking words before the number and after the number, along with emojis and other positions (you can check the source code on GitHub). If you think my version can be improved please improve it and I'll merge your code!

Collapse
 
lionelrowe profile image
lionel-rowe

@lnahrf Sure thing, I opened a PR (with a couple of improvements to the regex vs the original one I posted)

Thread Thread
 
lnahrf profile image
Lev N.

Merged your PR and added you to a contributors list. Looks super, thank you.

Collapse
 
davestewart profile image
Dave Stewart

Your method of writing RegExps has made my day. Thanks!

Collapse
 
lionelrowe profile image
lionel-rowe

Glad you like ;) this way of writing regexes is inspired by Ruby's x regex flag. If you're interested, I also published a package a while back that implements a more robust version of this whitespace/comment stripping logic, plus a few other features: fancy-regex

Thread Thread
 
davestewart profile image
Dave Stewart • Edited

Interesting! Yes, have written a few rx utility functions in my time. Daniel Roe of the Nuxt team also has Magic RegExp: regexp.dev/. I'm pretty handy with RegExps myself, but will take a look at your lib for sure. Thanks again!

Collapse
 
skyloft7 profile image
Mohammed

There is a Regex Jedi among us mere mortals. Or just me.

Collapse
 
ingosteinke profile image
Ingo Steinke, web developer

Seriously, this might be the most useful piece of software that EVERY senior DEV user MUST install in 2024. ๐Ÿคฃ praising even before I tried, but THANKS so much already! I had been thinking of coding something similar but I didn't have time yet. Thanks for your contribution!

Collapse
 
lnahrf profile image
Lev N.

Haha, thanks for the support!

Collapse
 
rachelfazio profile image
Rachel Fazio

Hi from the DEV team!! Love this. Thank you for sharing and for coming up with some really great solutions to help us out, while we work on some larger solutions. Be very well!

Collapse
 
lnahrf profile image
Lev N.

Glad you liked it! ๐Ÿ™‚

Collapse
 
pengeszikra profile image
Peter Vivo

Sooner or later?

Image description

Collapse
 
artxe2 profile image
Yeom suyun

In fact, aside from listicles, I haven't been able to find interesting articles here lately.
Interesting topics are scarce as well.
Lately, I've been thinking about some Java tricks used in my work and topics like SQL optimization using indexes have come to mind.
The problem I see with listicles is that most of them don't provide me with new information.
However, if someone were to publish listicles of the same caliber as tools of the Titans, those articles would probably be very intriguing.

Collapse
 
lnahrf profile image
Lev N. • Edited

Yes! I am not against the principle of a listicle (it rhymes, lol).
It's just that the listicles that we see on the top of the feed are just posting irrelevant content over and over again, not providing any additional value.

Even beyond listicles, we are lacking high quality articles.

Collapse
 
andypiper profile image
Andy Piper

I'm seeing some errors reported in Chrome, under manage extensions, after I add this unpacked extension.

Unrecognized manifest key 'runtime_allowed_hosts'.
Unrecognized manifest key 'runtime_blocked_hosts'.
Enter fullscreen mode Exit fullscreen mode

I'm struggling to discover what may be causing this, as I usually run an up-to-date Chrome. Seems to work great anyway. I'll raise an issue on GitHub for reference.

Collapse
 
lnahrf profile image
Lev N.

Commented on your GH issue, thanks!
I am not sure what the issue is myself, will have to dig into the manifest documentation.

Collapse
 
michaeltharrington profile image
Michael Tharrington

How did I miss this?! This is wonderful, Lev, haha!

Collapse
 
lnahrf profile image
Lev N.

๐Ÿ˜ Thanks Michael! Glad you liked it

Collapse
 
alvarolorentedev profile image
Alvaro • Edited

Looks great, will you publish it in the chrome extension store?

Collapse
 
lnahrf profile image
Lev N.

If enough would ask for it, then yes. Let's see what others have to say.

Collapse
 
skyloft7 profile image
Mohammed

Interesting solution.

I definitely tried messing around with the Chrome extension API once but kind of gave up. The listicle problem on DEV is definitely annoying, I kind of miss those longer articles with an interesting story to recount or blog posts and the like.

Cheers

Collapse
 
lnahrf profile image
Lev N.

Yea it got easy once I grasped that the extension and DOM are two different threads that can only speak with each other using messages (which makes sense, security wise).
Thanks!

Collapse
 
best_codes profile image
Best Codes

Awesome! I've made an extension for myself that does this already, but chose not to share it. Yet. Great article!

Collapse
 
rgolawski profile image
Rafaล‚ Goล‚awski

Wow, such a brilliant idea! ๐Ÿ’ก I really appreciate the creative response to the problem. ๐Ÿ‘

Collapse
 
lnahrf profile image
Lev N.

Thank you for the support!

Collapse
 
lnahrf profile image
Lev N.

Thanks for commenting, I completely understand your frustration. Hopefully the DEV team can work on some larger-scale solutions, but in the meantime we have this add-on. Other developers have already improved the source code, so you should definitely try it out.

Collapse
 
cbid2 profile image
Christine Belzie

Thanks for creating a possible solution for listicles @lnahrf! :) Hopefully, it will inspire other developers to come up with other ideas! :)

Collapse
 
lnahrf profile image
Lev N.

Thank you for the support! Other developers have already contributed to the repository ๐Ÿ™‚

Collapse
 
jonrandy profile image
Jon Randy ๐ŸŽ–๏ธ • Edited

Great work, but why call it "Chrome add-on"? it works just fine on Firefox too... and probably most other browsers!

Collapse
 
lnahrf profile image
Lev N.

I had absolutely no idea! Thanks for that.
Run "git pull" to get recent changes ๐Ÿ™‚

Collapse
 
fyodorio profile image
Fyodor

These bloody listicles have triggered the whole new holy war around ๐Ÿ˜„ the next post will be how to build unblocker for the browser extensions blocking the listicles ๐Ÿคฃ come on guys, you can just skip reading them. Also some of them are not this shitty actually.

Collapse
 
lnahrf profile image
Lev N.

They always take the top place in my feed, so I made this

Collapse
 
fyodorio profile image
Fyodor • Edited

The idea itself is very cool, don't get me wrong. I try to filter out my feed in settings as much as possible as well, but the DEV's filters work not ideally. Especially in terms of user blocking, for instance. Probably it'd make sense to make a separate extension for that as well ๐Ÿ˜„ Or even separate DEV ui based on DEV's API... OK, that's probably too much ๐Ÿ˜…

Thread Thread
 
lnahrf profile image
Lev N.

Hahaha, we do tend to over-engineer solutions so I wouldn't be surprised if that actually happens.

Collapse
 
best_codes profile image
Best Codes

Uh oh, I get an error:
Image description

@lnahrf

Collapse
 
lnahrf profile image
Lev N.

Did you follow the build steps written in the readme?

Collapse
 
best_codes profile image
Best Codes

Oops no, sorry. It works great now. Thanks!

Collapse
 
bwca profile image
Volodymyr Yepishev

If I were to post a listicle, I would just copy paste the regex from here and ask ChatGPT to adjust my title to bypass it ๐Ÿซฃ๐Ÿ˜

Collapse
 
lnahrf profile image
Lev N.

You'd have to have a very non-listicle title then, which will require some work and perhaps iterations. So I am okay with that.

Collapse
 
beshanoe profile image
Max

"8 browser extensions to remove listicles from your DEV.TO feed in 2024"

Collapse
 
rinkattendant6 profile image
Vincent

Interesting add-on, but considering I primarily go for the listicles when reading on dev.to and elsewhere, definitely not something I'd use.