Feedless
Hide the distracting parts of Instagram and Facebook — feeds, Reels, Stories, suggested posts, notification badges. Nineteen independent toggles, zero network requests.

The constraint
Unhook solved this for YouTube years ago, but Meta's surfaces have no equivalent. Blunt blockers remove the whole site, which is not what most people want — they want Instagram's DMs without Instagram's Reels, and there is no setting for that.
The approach
One toggle per surface, nineteen of them, applied instantly with no page reload and no flash of hidden content. Feature definitions in src/features are the single source of truth: the popup UI, the generated hiding CSS, and the test suite are all derived from them.
- 1One definition, three consumers
Made the feature modules generate the popup UI, the hiding CSS, and the test fixtures, so adding a toggle cannot leave one of the three behind.
- 2Attribute-gated CSS
Content scripts stamp data-df-* attributes on <html> at document_start and CSS does all the hiding — which is why there is no flash of content before the rules apply.
- 3Selector fixtures under test
Pinned Meta's selectors in Playwright fixtures so a silent upstream markup change fails a test instead of quietly un-hiding a feed.
- 4Verify against the live site
Kept a manual release checklist for live-site verification, because fixtures can only prove the selectors that were captured.
Outcomes
- 19 independent toggles — 9 on Instagram, 10 on Facebook
- Instant apply with no reload and no flash of unhidden content
- Settings sync across browsers; per-site pause switch
- Zero analytics and zero network requests — the storage permission is the only one requested
- Automate detection of upstream markup drift rather than catching it at release time.
- Extend the same model to a third surface — the feature-definition layer is the reusable part.
- Publish to the Chrome Web Store and Firefox Add-ons.
Built a browser extension hiding 19 individually toggleable Instagram and Facebook surfaces, derived from a single typed feature-definition module that also generates the hiding CSS and the test suite.
Used document_start attribute stamping with attribute-gated CSS to apply changes instantly with no reload and no flash of hidden content, requesting only the storage permission.
Related projects
- Read →
Cocoon
A privacy-first Chrome extension that lowers sensory load online: it softens algorithmic feeds, reduces motion, and keeps a grounding exercise one click away. No accounts, no analytics, nothing leaves the device.
- Read →
unlinkd
Get yourself removed from the internet — and keep the proof. A local-first, fully encrypted workspace for data-broker removal requests and the tamper-evident paper trail a GDPR or CCPA escalation actually needs.
- Read →
FraudStream
A production-grade streaming pipeline that scores financial transactions for fraud in milliseconds rather than hours, built on Kafka, Spark Structured Streaming, and a Snowflake medallion warehouse.