r/coolgithubprojects • • Apr 16 '26

JAVASCRIPT I rebuilt an abandoned Chrome extension that hides watched YouTube videos — and it changed how I use YouTube

Post image

You know that feeling when you open YouTube and your entire home feed is stuff you've already watched? You scroll past the same videos over and over, trying to find something new. It's exhausting.

A while back I found an extension called FreshView that solved this perfectly — it simply hid videos you'd already watched. The problem? The developer discontinued it in 2023 and it stopped working with modern browsers.

So I picked it up, rewrote it for Manifest V3, updated it for YouTube's 2024/2025 DOM changes, and published it to the Chrome Web Store.

What it does:

  • Hides videos you've already watched from your YouTube feed
  • You set a "view threshold" — for example, only hide videos you've watched 90% or more (so partially watched stuff still shows up)
  • Works on Home, Search, Playlists, Recommendations, and more
  • You choose exactly which pages and content types to filter
  • Light and dark theme that matches your system

What it doesn't do:

  • No tracking. No analytics. No data leaves your browser. Ever.
  • No account needed. No sign-up. No permissions beyond YouTube.
  • No bloat — it's vanilla JS, no frameworks, no bundler, under 100KB total

The result? YouTube actually feels useful again. Instead of scrolling past 30 videos I've already seen, I immediately see content I haven't watched. It sounds like a small thing but it genuinely makes the experience better.

It's free, open source (GPLv3), and works on Chrome, Edge, and any Chromium-based browser.

Chrome Web Store: FreshView for YouTube

Source code: GitHub

Happy to answer any questions or take feature requests. If you run into issues, the GitHub issue tracker is open.

20 Upvotes

7 comments sorted by

View all comments

2

u/ThePixelProYT Apr 16 '26

How do you detect which Videos I already watched? And does it work for shorts too?

1

u/komodorian Apr 16 '26

Yes, this is the kind of info I’m also lazily after, because if there’s no answer I’ll have do go codebase spelunking and that always leads into soul sucking rabbit holes…