It's an iOS app using WKWebView with three layers of filtering per platform:
1. WKContentRuleList blocks URLs (/reels/, /shorts/) at the network level before they load. Also applies static CSS display:none. Compiled once at launch, zero JS cost.
2. CSS injected at document start for complex selectors (:has() combinators and such) that the content rule API can't express.
3. MutationObserver in JS catches content that Instagram/YouTube inject after initial load (both are SPAs that render feed items dynamically). WeakSet tracks processed nodes, rAF-debounced.
Selectors target aria-labels, data attributes, and href patterns instead of class names. Instagram rotates classes constantly. Each platform has its own manifest.json that defines what to block, so updating selectors when platforms change their DOM is a ~5 minute edit.
The part I didn't expect: removing algorithmic content isn't enough. Even "clean" Instagram is still designed to pull you back. So I added time limits, scheduled blocks (no Instagram after 11pm), and a friction gate. A small challenge appears before opening a platform. The friction gate alone cut my impulsive opens roughly in half.
Tradeoffs I'm aware of:
1. This is a cat-and-mouse game. Platforms change DOM, filters break, I update. The three-layer approach means if one layer breaks the others still catch most content, but it's ongoing work. 2. iOS only. WKWebView is the only way to do this on iOS without a VPN/proxy. Android would need a different approach entirely. 3. No free tier. $3.99/mo or $14.99/yr. I considered freemium but didn't want to gate filtering behind a paywall. It's all-or-nothing. 4. "Why not a Safari extension?" I tried this first. Extensions can't intercept SPA navigations reliably, can't do MutationObserver-based filtering, and the UX of opening Safari and navigating to instagram.com is much worse than tapping a platform icon.
No accounts, no analytics, no data leaves the device.
gcampos•2h ago