Skip to content
Archived
Tools
Open Source
Jul 2026

Feedless

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

19
Toggles
storage only
Permissions
Zero
Network calls
One module
Source of truth
Feedless project visual

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.

Process
  1. 1
    One 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.

  2. 2
    Attribute-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.

  3. 3
    Selector 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.

  4. 4
    Verify 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
What I'd do next
  • 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.
Details

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.