The internet, minus the worst of it.
A free macOS menu bar app that blocks adult content at the system level —
in every browser, in every app. No accounts, no tracking, no subscription.
CleanBrowse is a lightweight macOS menu bar app that provides system-level protection against adult content. It runs quietly in the background and blocks inappropriate websites across all browsers and applications on your Mac — protection that browser extensions can't match, because it works below them, at the DNS level.
Version 1.0 marks CleanBrowse's first release out of beta — with a rebuilt, faster and lighter DNS engine, six languages, and configurable SafeSearch.
- 🛡️ System-wide blocking — ~249,000 adult domains blocked via
/etc/hosts, covering every app on your Mac - 🌐 DNS proxy — a Network Extension intercepts every DNS query type system-wide, so blocking can't be bypassed with alternative or encrypted DNS
- 🔍 Configurable SafeSearch — enforces SafeSearch on Google, YouTube, Bing, and DuckDuckGo across ~190 country-code domains, with a per-engine toggle in the new settings panel
- 🖼️ Safari image filter — a Safari Web Extension blurs NSFW images and video frames on-device (CoreML) before you ever see them; nothing leaves your Mac
- 🗣️ Speaks your language — fully localized in English, Arabic (RTL included), French, Spanish, Chinese, and German
- ➕ Custom domain blocking — add your own domains to the blocklist right from the menu bar
- ⚡ Faster & lighter — the 1.0 engine resolves queries faster with a lower memory footprint and minimal battery impact
- 🚀 Launch at login — starts automatically with your Mac
- 🫥 Minimal footprint — lives in the menu bar; no Dock icon, no main window
CleanBrowse uses a three-layer blocking strategy — each layer backs up the others, so the protection holds everywhere:
| Layer | Method | What it does |
|---|---|---|
| 1 · Hosts file | /etc/hosts rewrite |
Redirects ~249,000 known adult domains to 127.0.0.1 — covers every application |
| 2 · DNS proxy | NEDNSProxyProvider |
Inspects all DNS query types (A, AAAA, HTTPS/SVCB) and answers NXDOMAIN for anything on the blocklist — what can't resolve can't load |
| 3 · SafeSearch | IP-level redirect | Pins search engines to their SafeSearch/restricted-mode endpoints, so search results stay clean too |
- macOS 14 (Sonoma) or later
- Admin password (required on first launch to modify
/etc/hosts)
Grab the latest release from the Releases page, open the .dmg, and drag CleanBrowse.app into your Applications folder.
- Clone the repository:
git clone https://github.com/EngOmarElsayed/CleanBrowse.git
- Build the Safari extension's JS bundle and CoreML model (both are generated, not committed):
npm install && npm run build python3 -m venv .venv && .venv/bin/pip install -r Tools/requirements.txt .venv/bin/python Tools/convert_model.py # downloads ~350MB, writes Models/BlurShieldNSFW.mlpackage
- Open
CleanBrowse.xcodeprojin Xcode - Build and run
Note: the Network Extension entitlement requires an Apple Developer account to build and test locally.
- Launch CleanBrowse — it appears as a shield icon in the menu bar
- On first launch, enter your admin password to apply the blocklist
- The DNS proxy activates automatically — you're protected from that moment on
- To block extra domains, click the menu bar icon and type a domain into the input field
- To tune search filtering, open the ⚙️ settings and toggle SafeSearch per engine — Google, YouTube, Bing, and DuckDuckGo — or flip them all at once
Version 1.0 is just the start. Here's what's on the road ahead:
| Checkpoint | Status |
|---|---|
Custom DNS resolver — choose the upstream DNS you trust (Cloudflare 1.1.1.1, Google, or any resolver) |
🟢 Coming soon |
| Protect me from myself — lock your own settings so protection can't be switched off in a weak moment | 🛠️ In development |
| Import any blocklist — bring your own lists and CleanBrowse enforces them system-wide | 📋 Planned |
| Blocked-domain explorer — browse everything CleanBrowse blocks and check whether a domain is on the list | 📋 Planned |
- SwiftUI — UI framework
- SwiftData — persistence for custom blocked domains
- Network Extension —
NEDNSProxyProviderfor system-wide DNS interception - ServiceManagement — launch at login via
SMAppService - String Catalogs — localization across all six languages
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a branch for your feature or fix:
git checkout -b feature/your-feature-name
- Commit your changes with a clear message
- Push to your fork and open a Pull Request
- Expanding the blocklist with additional domains
- Improving DNS proxy performance
- Adding new SafeSearch engine support
- New translations, or polish for the existing six languages
- UI/UX improvements
- Bug fixes and documentation updates
Note: Since CleanBrowse uses a Network Extension, you'll need an Apple Developer account to build and test locally.
"Everyone should have the tools to protect themselves and their loved ones online — without a subscription, and without handing their data to anyone."
CleanBrowse is designed, built, and maintained by Omar Elsayed — and it's completely free. No accounts, no analytics on your browsing, nothing ever leaves your Mac.
This project is licensed under the MIT License — see the LICENSE file for details.

