Heal your feed. Bouncer is a browser extension that uses AI to filter unwanted posts from your Twitter/X feed. Define filter topics in plain language — "crypto", "engagement bait", "rage politics" — and Bouncer classifies and hides matching posts in real time.
Available on the app stores for Chrome, Firefox, Safari, iOS, and Android
- Semantic filtering: define your filters in natural language, rather than giving exact strings to remove
- AI detection: remove slop text and images using our custom-trained AI detector model
- On-device inference: local models run entirely in your browser with zero data sent externally
- Image-aware filtering: multimodal models can classify posts based on images, not just text
- Multiple AI backends: run models locally on your GPU, or use cloud APIs (OpenAI, Google Gemini, Anthropic, OpenRouter)
- Theme-aware UI: adapts to light, dim, and dark modes automatically
cd Bouncer
npm install
npm run build- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked and select the
Bouncer/folder - Navigate to twitter.com / x.com
- Click "Settings" in the Bouncer element and add your preferred provider API key (or enable local models) and select your preferred model from the dropdown.
cd Bouncer
npm install
npm run build:firefox- Open
about:debugging - Click This Firefox on the left menu
- Click Load Temporary Add-on... and select the file
Bouncer/manifest.json - Navigate to twitter.com / x.com
- Click "Settings" in the Bouncer element and add your preferred provider API key (or enable local models) and select your preferred model from the dropdown.
- A MutationObserver watches the Twitter feed for new posts
- Post text, images, and metadata are extracted via the Twitter adapter
- Posts are queued and sent to the selected AI model for classification against your filter topics
- The model returns a category match and reasoning for each post
- Matching posts are hidden with a fade-out animation and added to your filtered posts list
- Click View filtered to review hidden posts and see why each was filtered
Results are cached so re-encountering a post doesn't require another inference call.