Welcome to StevenBlock v1.0 β the zero-bloat ad blocker for rooted Android, rebuilt from the ground up. π
StevenBlock blocks ads, trackers and malware across your entire device with one carefully built /system/etc/hosts file. Your root manager mounts it systemlessly, so /system is never touched. There is no VPN to keep alive, no extra app to install and no permanent background process β just a clean hosts file and a polished WebUI to control it.
Pick from 7 curated blocklists, add your own Allow / Block rules, update with one tap and watch every step in real time. Every change is downloaded, verified, optimized and installed with automatic backups and rollback, so a bad download can never leave you with a broken hosts file. π
Note
v1.0 is a complete rewrite. The terminal menu, volume-key installer and Energized lists of v5.0 are gone. Installation is now fully automatic and everything is managed from the new WebUI. Coming from v5.0? Read β¬οΈ Upgrading from v5.0.
- π Why StevenBlock
- βοΈ How It Compares
- π― Blocklists
- π± Compatibility
- π οΈ Installation
- π₯οΈ WebUI Tour
- π§© Domain Rules Guide
- π Safety Net
- π Privacy & Security
- β¬οΈ Upgrading from v5.0
- ποΈ Uninstall
- π§ FAQ
- π©Ί Troubleshooting
- π Credits
- π License
- π Support
- π¬ Community
- π Watch Us Grow
- β Star History
- π₯οΈ A real WebUI. Switch lists, update, manage domain rules, check status and read logs from a fast, modern interface with dark and light themes. It opens right inside KernelSU, KernelSU Next, SukiSU and APatch, and from the Action button on Magisk.
- π Zero permanent background processes. Blocking is a static hosts file. The local WebUI server only runs while you use it and shuts itself down after 10 minutes without activity. At boot, StevenBlock tidies up leftovers in a moment and exits.
- π― 7 curated blocklists. From the gentle, battle-tested StevenBlack list to HaGeZi Ultimate, each with a clear strength level, live entry count and last-update date.
- π§© Your own domain rules. Always allow a domain a list blocks by mistake, or always block one the list misses. Paste a full URL and StevenBlock extracts the domain for you.
- π Backed-up, atomic updates. Every download is validated before it can touch your hosts file. The new file is written next to the old one and swapped in a single step, then verified. If anything fails, the previous file is restored automatically.
- π§ͺ Applied-state check. StevenBlock compares the live
/system/etc/hostswith its own file and tells you plainly: β Applied, π‘ Not applied yet β reboot required,β οΈ Overridden by another module, or π΄ Not active. - π Works with or without a metamodule. At every boot StevenBlock checks that Android really uses its hosts file. If your root manager didn't mount it, StevenBlock mounts it itself.
- π Private by design. Local only, token-protected, zero telemetry, and the WebUI loads nothing from the internet β not even fonts.
- βοΈ Fully automatic install. No questions, no volume keys. StevenBlock detects your root manager, checks for conflicts, cleans up old versions and installs the default list on its own.
- π‘οΈ Safe by construction. Every entry from every list is rewritten to
0.0.0.0, so a list can only ever block a domain β it can never redirect you somewhere else.
Every approach has trade-offs. Here is an honest look at how a systemless hosts file stacks up against the other common ways to block ads on Android:
| π‘οΈ StevenBlock (hosts) | π VPN-based blockers | π Private DNS | π§ Browser extensions | |
|---|---|---|---|---|
| System-wide | β Yes, for apps that use Android's resolver | β Yes, for traffic routed through the VPN | β Yes, for apps that use Android's resolver | β Only inside that browser |
| VPN slot | β Stays free | β Occupied, so no other VPN at the same time | β Stays free | β Stays free |
| Battery | β No background service | β Negligible | β Minimal | |
| Customization | β 7 lists plus allow and block rules | β Usually extensive | β Extensive, including cosmetic filtering | |
| Root required | β No | β No | β No |
Tip
A hosts file blocks whole domains. It can't hide page elements (cosmetic filtering) or block ads served from the same domain as the content. A browser with a built-in or extension-based blocker is a great companion for that β it works alongside StevenBlock.
All lists are downloaded straight from their official sources. Pick one in π Lists β the WebUI shows each list's live entry count and last-update date, read from the list's own header without downloading the whole file.
| # | List | Type | Level | Approx. entries* | Best for |
|---|---|---|---|---|---|
| 1 | StevenBlack Main | Unified list (default) | π’ Balanced | ~74K | Everyone. The safe, battle-tested default. |
| 2 | hBlock | Mixed list built from many sources | π΅ Mixed | Varies | Broad coverage from many public lists in one file. |
| 3 | HaGeZi Light | Basic protection | π’ Basic | ~155K | Zero-hassle blocking that shouldn't break anything. |
| 4 | HaGeZi Normal | All-round protection | π΅ All-round | ~365K | Stronger everyday protection, rarely breaks anything. |
| 5 | HaGeZi Pro | Extended protection | π‘ Extended | ~468K | Power users who don't mind an occasional allow rule. |
| 6 | HaGeZi Pro++ | Aggressive | π Aggressive | ~521K | Experienced users. Some legitimate sites may break. |
| 7 | HaGeZi Ultimate | Most aggressive | π΄ Maximum | ~569K | Maximum blocking. Can restrict app and site features. |
*As of October 2026. Lists update often, so the WebUI always shows the current numbers.
Warning
π Pro++ and π΄ Ultimate are strict on purpose. If something stops working, add the affected domain as an β Allow rule or step down to a lighter list.
| Root manager | WebUI | Action button | How to open the WebUI |
|---|---|---|---|
| Magisk v28+ | π In your browser | β | Tap Action |
| KernelSU | β Built in | β | Tap WebUI on the StevenBlock card. |
| KernelSU Next | β Built in | β | Tap WebUI on the StevenBlock card. |
| SukiSU | β Built in | β | Tap WebUI on the StevenBlock card. |
| APatch | β Built in | β | Tap WebUI on the StevenBlock card. |
- π Magisk (including the current v31.1) has no built-in module WebUI. The Action button (Magisk v28+) starts a private server on
127.0.0.1:9090and opens the WebUI in your browser. You can also open the WebUI natively with KsuWebUI, MMRL or WebUI X. βΆοΈ On KernelSU, KernelSU Next, SukiSU and APatch the Action button works too: it opens the same WebUI in your browser.- π Metamodules: recent KernelSU, SukiSU and APatch releases leave module mounting to a metamodule (such as meta-overlayfs). StevenBlock doesn't depend on one: right after the boot-time mount, and again when boot finishes, it checks that
/system/etc/hostsreally is its file and bind-mounts the file itself if not. - π§° StevenBlock uses the BusyBox that ships with your root manager. It downloads with
curlwhen available, otherwise with BusyBoxwget.
- π₯ Download
StevenBlock.zipfrom the StevenBlock repository. - π¦ Install it from your root manager: Modules β Install from storage β select the zip.
- β Sit back. The installer runs on its own:
- β detects your root manager and BusyBox,
- π§© warns you about conflicting hosts blockers (installation continues),
- π§Ή removes leftovers from StevenBlock v5.0,
- πΎ keeps a copy of your original hosts file,
- β¬οΈ downloads, verifies and installs StevenBlack Main.
- π Reboot. Your new hosts file is active after the restart.
- π₯οΈ Open the WebUI β see π± Compatibility for your root manager.
Tip
No internet during install? No problem. StevenBlock writes a clean localhost-only hosts file and finishes the installation anyway. After you reboot, it retries the download automatically as soon as you're online β and you can also tap β¬οΈ Download now in the WebUI.
Note
Updating from an earlier v1.x release keeps your selected list, your domain rules and your enabled or disabled state.
The StevenBlock logo, the version and a live status badge: π’ Active, π΄ Disabled, π‘ Reboot required,
Whenever saved changes are waiting for a reboot, a banner appears at the top with a π Reboot now button. It always asks for confirmation first.
The number of blocked domains, the active list with its level, your rule counts, when the list was last updated and whether the hosts file is actually applied to the system.
Every list as a card with its name, a short description, a level badge (π’ / π΅ / π‘ / π / π΄), the entry count and the last-update date. The active list is highlighted with a β Active badge and a colored border.
- β¬οΈ Use this list opens a confirmation with the list's details, then shows live progress: β¬οΈ Download β π Verify β π§Ή Optimize β π¦ Install, with percentage, size and speed whenever the server reports the file size.
- βοΈ Cancel stops a download safely β nothing is changed.
- π½ Hide tucks the progress into a small bar at the bottom while you keep exploring. Close the WebUI and come back later β a running task is still shown.
- π Refresh re-reads entry counts and dates. They are cached for 6 hours.
- If a count can't be fetched, the card says β Couldn't fetch entry count with a π Retry button.
Type a domain or paste a full URL, then tap β Allow Domain or β Block Domain. Your rules appear in two tabs with a ποΈ button to remove each one. See the π§© Domain Rules Guide.
- π Update Current List β checks whether the list changed (by its ETag, or the date in its header) and only downloads when there's something new. Otherwise you'll see β Already up to date.
- π Check Status β the active list, enabled state, total blocked domains, allow and block rule counts, last update, whether a reboot is pending, your root manager, the module version and the applied state of
/system/etc/hosts. - β» Disable / Enable Blocker β Disable swaps in a clean localhost-only hosts file but keeps your list and rules. Enable rebuilds the hosts file from the cached list instantly, without downloading again. Both take effect after a reboot. While the blocker is disabled, switching or updating lists is paused.
Every operation is logged with a timestamp and a level β βΉοΈ INFO,
Links to the developer's GitHub and the Telegram group, plus the blocklist and font projects StevenBlock is built on. Links open in your browser.
Domain rules sit on top of whichever list you use, and they stay when you switch lists.
| You want to⦠| Rule | Example |
|---|---|---|
| Unblock a domain your list blocks by mistake | β Allow | links.newsletter-service.com |
| Block a domain your list doesn't cover | β Block | ads.annoying-site.net |
- π Paste anything.
https://Shop.Example.com/cart?id=42becomesshop.example.comautomatically. - π‘ Lowercase is automatic, and international domain names are converted to their
xn--form. - π« Not accepted: spaces, ports (
example.com:8080), wildcards (*.example.com) and IP addresses. - βοΈ One list per domain. A domain can't be in both Allow and Block β StevenBlock tells you which list already has it.
Important
Hosts files have no wildcard support. A rule matches exactly the domain you enter: allowing example.com does not allow cdn.example.com, and blocking ads.example.com does not block tracker.ads.example.com. Add each subdomain you need as its own rule.
After a rule change, StevenBlock rebuilds the hosts file from its cached copy of your list β no download needed β and asks for a reboot only if the hosts file actually changed.
Your hosts file is too important to gamble with, so StevenBlock checks everything twice:
- π One task at a time. A lock file (with stale-lock detection) prevents two operations from colliding. Busy buttons are disabled while a task runs.
- πΎ Free space check before every download.
- π Download validation. The server must answer HTTP 200, the file can't be empty or an HTML error page, it must contain at least 1,000 valid entries, and its size must match
Content-Length. If any check fails, your hosts file is never touched. - π§Ή One-pass normalization with
awk: comments, blank lines and CRLF line endings are removed, every redirect becomes0.0.0.0, system entries (localhost, broadcasthost, ip6-*) are skipped, invalid domains are dropped, and everything is lowercased and de-duplicated. - ποΈ Backups. The current hosts file is backed up before every write. The last 3 backups are kept.
- βοΈ Atomic write. The new file is written next to the old one under a temporary name and moved into place in one step, so a half-written hosts file can't happen.
- β
Verification. The new file must exist, be non-empty, contain the
127.0.0.1 localhostand::1 localhost ip6-localhostlines and have exactly the expected number of entries. If not, the backup is restored automatically. - π§½ DNS cache flush. StevenBlock tries the
ndc resolvermethods your Android version supports. If none is available, that's only logged β the reboot clears the cache anyway. - π Mount check at every boot. If the hosts file is missing or damaged, it's rebuilt from the cached list. If Android isn't using StevenBlock's file and no other module provides one, StevenBlock bind-mounts it directly β
/systemitself is never written. - π Nothing fails silently. Every error appears in the WebUI and in the log.
- π Local only. When you open the WebUI with the Action button, its server listens on
127.0.0.1:9090only β never on your network β and only while you use it. The built-in WebUI of KernelSU, KernelSU Next, SukiSU and APatch needs no server at all. - π Token protected. Every Action press creates a fresh random session token. Requests without the right token are rejected, so other apps on your phone can't control StevenBlock.
- π§± Locked-down backend. The WebUI can only call a fixed list of commands. It never sends URLs, file paths or shell commands, and every input is validated again on the device.
- π΅ Zero telemetry. No analytics, no tracking, no accounts.
- π€ No external requests from the WebUI. Fonts, icons and code are all bundled in the module.
- π The only network traffic is downloading the blocklists β and reading their headers for entry counts and dates β from their official sources.
- π― Lists can only block. Every entry is rewritten to
0.0.0.0, so even a tampered list can't redirect a domain to another server. - ποΈ Systemless. StevenBlock never writes to
/system. Its data lives in/data/adb/stevenblock/and is readable by root only.
StevenBlock v1.0 replaces v5.0. Because it's a complete rewrite, the version numbering starts fresh at v1.0 β and its version code (1000) is higher than v5.0's (500), so your root manager offers it as a normal update.
What changed
| v5.0 | v1.0 |
|---|---|
| π» Terminal menu in the Action screen | π₯οΈ Full WebUI |
| ποΈ Volume-key list selection during install | βοΈ Fully automatic install |
| β‘ Energized Spark, Blu and Ultimate | π― StevenBlack, hBlock and five HaGeZi lists |
| β | π§© Allow and block rules, π backups and rollback, π§ͺ applied-state check, π logs |
What happens to your old setup
- π§Ή The v5.0 files
config.txt,hosts.bakandhosts.tmpin/data/adb/stevenblock/are removed automatically during installation, and the old terminal menu is replaced by the new module files. - π― Energized lists are no longer offered, so every v5.0 user starts with StevenBlack Main. Switch to any other list from the WebUI after rebooting.
- Open your root manager β Modules β StevenBlock β Remove.
- Reboot.
On removal StevenBlock stops its WebUI server, deletes /data/adb/stevenblock/ and its temporary files. Because /system was never modified, your original hosts file is back after the reboot β no traces left.
β Can I use StevenBlock together with AdAway or Magisk's βSystemless hostsβ?
Please don't. Only one module can provide /system/etc/hosts, so two hosts-based blockers fight over the same file. Turn off Systemless hosts in Magisk (it creates a module called βSystemless Hostsβ β remove it in the Modules tab) and don't use AdAway's root (hosts) mode alongside StevenBlock. The installer and π Check Status warn you when they spot a conflict.
β I use KernelSU, KernelSU Next, SukiSU or APatch and still see ads in Chrome. Why?
These managers can hide module changes from apps that aren't granted root β the umount modules option. If it's active for your browser, the browser sees the original hosts file instead of StevenBlock's.
Fix: open your root manager β Superuser β select Chrome (or Brave, Edgeβ¦) β Custom β uncheck βumount modulesβ. Then fully close and reopen the browser.
β Do browsers with βSecure DNSβ bypass the hosts file?
They can. Chromium-based browsers (Chrome, Brave, Edge and others) have a built-in Secure DNS (DNS-over-HTTPS) option that can resolve domains on its own instead of through Android's resolver, which means your hosts file may be skipped.
Fix in Chrome: Settings β Privacy and security β Use secure DNS β turn it off. Other Chromium browsers have the same option in their privacy or security settings. Android's own Private DNS setting is different: it doesn't bypass the hosts file, so you can keep using it.
β Why does the official YouTube app still show video ads?
Those ads are served from the same servers as the videos themselves. A hosts file blocks whole domains, so blocking them would also block the videos. That's a limitation of every hosts-based blocker. For ad-free YouTube, use a client with built-in ad blocking such as ReVanced. StevenBlock keeps handling everything else on your device.
β Why do my changes need a reboot?
StevenBlock's hosts file is mounted over /system/etc/hosts at boot β by your root manager, or by StevenBlock itself when the manager doesn't. When StevenBlock installs a new hosts file, it swaps in a complete new file atomically β but the mount keeps showing the previous file until the next boot. Your current protection keeps working in the meantime. After the reboot, π Check Status shows β
Applied.
β A website or app broke. What now?
- π§ͺ Find out whether StevenBlock is the cause: β» Disable Blocker, reboot and try again. (Enable it again afterwards.)
- π Identify the blocked domain β the error message, a browser's network inspector or the app's support pages often name it.
- β Add that domain as an Allow rule. Remember that rules match the exact domain only.
- ποΈ Using π Pro++ or π΄ Ultimate? Step down to π‘ Pro or π΅ Normal β the stricter lists trade compatibility for blocking power.
β Do I need a metamodule on KernelSU, SukiSU or APatch?
No. Recent releases of these root managers only mount module files through a metamodule, and some metamodules mount a copy of the module that was made during installation β so later list changes would never reach the system. StevenBlock checks at every boot whether /system/etc/hosts is its current file. If it isn't, and no other module provides a hosts file, StevenBlock bind-mounts its own file directly. π Check Status shows who mounted it under π Mounted by.
β Does StevenBlock slow down my phone or drain my battery?
No background service runs for blocking β it's a static file read by Android's resolver. Downloading and processing a list takes a few seconds and only happens when you switch or update. The WebUI server only runs while you use it.
| Symptom | Solution |
|---|---|
| π‘ βNot applied yet β reboot requiredβ | Reboot. Saved changes become active after the restart. |
Another module provides /system/etc/hosts (often Magisk's Systemless hosts or AdAway). Remove or disable it and reboot. π Check Status lists the conflicting modules. |
|
| π΄ βNot activeβ | Android isn't using StevenBlock's hosts file. Reboot β StevenBlock mounts it at startup. If it stays, check π Check Status (π Mounted by) and π Logs, and share them in the Telegram group. |
| π βWebUI server stoppedβ in the browser | The server stops after 10 minutes without activity. Tap Action |
| π βSession expiredβ or βSecure session requiredβ | Open the WebUI from the Action |
| β βPort 9090 is already in use by another appβ | Another app is using port 9090. Close it (or reboot) and press Action |
| β βBusyBox httpd isn't availableβ | Your BusyBox lacks httpd. Open the WebUI with KsuWebUI, MMRL or WebUI X instead. |
| π βCouldn't reach the list serverβ | Check your connection and try again. Your previous hosts file stays in place. |
| π§± βThe server sent a web page instead of a hosts listβ | A captive portal or network filter answered instead of the list server. Sign in to the network or switch networks, then retry. |
| β³ βSetup pendingβ after installing offline | Connect to the internet β StevenBlock retries automatically after boot β or tap β¬οΈ Download now. |
| β βCouldn't fetch entry countβ on a card | Tap π Retry on the card or π Refresh at the top of the list section. |
| πΊ Ads still show in a browser | See the FAQ entries on umount modules and Secure DNS. |
Still stuck? Check π Logs in the WebUI and ask in the Telegram group.
StevenBlock stands on the shoulders of these outstanding open-source projects:
- StevenBlack β the unified hosts list behind our default, StevenBlack Main.
- hBlock β merges many reputable blocklists into one hosts file.
- HaGeZi β the Light, Normal, Pro, Pro++ and Ultimate lists.
- Inter by Rasmus Andersson β the typeface of the WebUI, bundled under the SIL Open Font License 1.1.
StevenBlock is released under the GNU General Public License v2.0 β see LICENSE. The blocklists belong to their maintainers and are downloaded directly from their official sources. The Inter font is distributed under the SIL Open Font License 1.1; its license is included in webroot/fonts/LICENSE.txt.
StevenBlock is built and maintained in spare time. If it keeps your phone clean, fast and private, you can help:
- β Star the repository β it helps others find StevenBlock.
- π£ Share it with friends who root their phones.
- π Report bugs with a screenshot of π Check Status and the relevant π Logs entries.
Questions, ideas or just want to hang out with fellow performance purists? Join our Telegram group! π