Browser extension that puts you in charge of your feed
FeedKit
The algorithm decides what Facebook shows you. FeedKit hands that decision back: hide Reels, Stories, Sponsored and Suggested posts, filter by keyword, build your own rules, and cap your daily time, all inside your browser.
- Ownership
- Personal work
- Organisation
- Personal product
- My role
- Sole engineer and designer
- Status
- Live on the Chrome Web Store
- TypeScript
- React
- Vite
- Tailwind CSS
- Chrome Extensions (MV3)
Overview
FeedKit is a Chrome extension for people who still need Facebook for groups, events, and friends, but are tired of the feed deciding how they spend their evening.
One small popup switches off the parts of the feed that exist to keep you scrolling. A full options page adds keyword and page filters, a rule engine, video controls, and limits on how far and how long you scroll.
Role and ownership
What I personally did
- Product definition, store listing, and privacy policy.
- Manifest V3 extension: content script, background worker, popup, and options page.
- Post detection that survives Facebook's generated class names, plus the keyword, page, and rule engine.
- Video controls, reading and zen modes, scroll and daily time limits, and on-device usage stats.
Constraints
- Facebook's markup uses generated class names that change between deploys, so nothing can be selected the obvious way.
- The feed is infinite and rendered on the fly, so filtering has to keep up with posts as they appear without making scrolling stutter.
- Privacy was a product requirement: no server, no account, and nothing about the user's feed may leave the browser.
- Manifest V3 rules: no remote code and a background worker that can be shut down at any time.
Solution
Fixed surfaces like Reels, Stories, and sidebars are hidden with structural CSS the moment the page loads, so they never flash on screen. Posts are handled by a MutationObserver that scans each new post as it arrives and applies a verdict: hide, blur, collapse, highlight, or leave alone.
Detection keys off ARIA labels, role attributes, data-pagelet markers, URL patterns, and visible text rather than class names. When Facebook ships a new build, those signals usually survive.
Settings live in browser sync storage and are re-applied live when they change. Usage stats stay in local storage on the device, and a background worker enforces the daily limit using heartbeats from open tabs.
Clean up a feed
FeedKit
Live demo
Feed cleaner
Keyword filter
Mode
4 of 8 posts hidden by FeedKit
Maya Rahman
Finally finished the Sajek trail. Worth every single step.
Like · Comment · Share · 24 comments
Celebrity Buzz Daily
Suggested for youYou will not guess who was spotted at the airport.
Like · Comment · Share · 24 comments
People You May Know
People You May KnowRafi, Nadia, Sumon and 12 others
Like · Comment · Share · 24 comments
Dhaka Tech Meetup
Next session: building browser extensions with React and Manifest V3.
Like · Comment · Share · 24 comments
The popup's controls working on an invented feed. Try the keyword actions and the zen mode.
Controls
Popup
Quick toggles, mode, today's stats
Options page
Filters, rules, video, appearance
Storage
Sync storage
Settings, across your own browsers
Local storage
Usage stats, device only
On the page
Structural CSS
Reels, Stories, sidebars
Post scanner
MutationObserver + rule engine
Background
Service worker
Daily limit, hidden-post counts


Key decisions
Detect by meaning, not by class name
Facebook's class names are generated and change without notice, which breaks most feed-cleaning extensions within weeks.
- Considered
- Target the current class names and patch them whenever they change.
- Chose
- Identify posts and surfaces from ARIA labels, roles, data-pagelet markers, URL patterns, and visible text, the signals the page needs for accessibility and routing.
- Trade-off
- More heuristics to write and test than one selector, but a Facebook deploy rarely breaks the extension.
Two mechanisms: CSS for surfaces, a scanner for posts
Some things never change position (the Reels tray, sidebars); posts stream in endlessly.
- Considered
- Run every rule through one JavaScript scanner.
- Chose
- Static surfaces are hidden with injected CSS before first paint. Only posts go through the MutationObserver and the rule engine.
- Trade-off
- Two code paths to maintain, but nothing flickers on load and the scanner only does work that needs judgement.
No server at all
An extension that reads your feed is exactly the kind of thing people should be suspicious of.
- Considered
- A small backend for accounts, stats, and remote rule updates.
- Chose
- Everything runs locally. Settings sync through the browser's own storage, stats never leave the device, and the optional AI features call the user's chosen provider directly with their own key.
- Trade-off
- No usage analytics to learn from, so feedback comes from store reviews. In return, the privacy policy is short and easy to verify.
Outcome
92
Users on the Chrome Web Store
From the store listing on 19 Oct 2026.
4.3
Average rating out of 5
Six ratings on the Chrome Web Store, 19 Oct 2026.
The whole extension ships in 108 KiB with no remote code, as Manifest V3 requires.
Reflection
The hard part of a feed cleaner is not hiding things, it's finding them. Designing detection around accessibility signals turned a maintenance treadmill into an occasional fix.
Facebook is the first platform. The detection and rule engine are written so Instagram, LinkedIn, Reddit, X, and YouTube can follow.