Developer Zed (GitHub: M-Abozaid) has published esp32-c3-adblock, an open-source DNS ad blocker for ESP32-C3 boards that have 4 MB of flash and no PSRAM. The repository describes it as a Pi-hole-style blocker. It answers DNS queries over UDP, sinkholes domains on its blocklist and has a web dashboard. The firmware is released under the MIT license. The creator tested it on a C3 SuperMini board. By October 20, 2026, the repository had 3.3k stars and 351 forks.
CNX Software covered the project on October 9, 2026 and described the target hardware as a "$2 ESP32-C3 microcontroller board/module".
The problem it addresses
CNX says the project was inspired by s60sc's ESP32_AdBlocker, but that the code is an independent implementation. ESP32_AdBlocker is an AGPL-3.0 Arduino sketch. It returns 0.0.0.0 for blocklisted domains, forwards all other queries to an external DNS server and has its own web interface. Because it keeps the blocklist in PSRAM, it requires an ESP32 module with PSRAM. Its README says an ESP32-S3 with 8MB PSRAM can host a currently sized blocklist and check a domain in under 50 microseconds. An ESP32 with 4MB PSRAM may have to truncate the list and checks domains in under 100 microseconds.
esp32-c3-adblock targets boards without PSRAM. CNX describes the 16-pin ESP32-C3 Super Mini as using the Espressif ESP32-C3FH4: a single-core 32-bit RISC-V processor running at up to 160 MHz, with 400 KB SRAM, at least 4MB of flash and 2.4 GHz WiFi 4.
How it works
The firmware does not store domain names as text. It hashes each domain with 40-bit FNV-1a, so each entry takes 5 bytes. The sorted hashes are written to flash. For each DNS query, the firmware hashes the requested name and runs a binary search over that table. The creator says about 18 flash reads are needed per lookup.
A truncated hash can make two different domains look the same, which could block a domain that is not on the list. The repository reports zero collisions with a list of about 141k domains and about one collision with a list of about 537k. According to the repository, 32-bit hashes would save 20% of flash but would produce about seven collisions at 250k domains, which is the reason given for using 40 bits.
The repository gives these capacity figures, all measured by the creator:
| Configuration | Domains | Notes |
|---|---|---|
| Default list | ~141k | ~0.67 MB of flash |
| Dual-app OTA partition layout | up to ~250k | Firmware OTA updates remain available |
| Single-app layout, "ultimate" list | ~537k | No firmware OTA |
The creator also reports that the firmware uses about 50 KB of RAM and that a lookup takes about 10 ms, including the Wi-Fi round trip.
The trade-off is in the partition table. On a 4 MB part, keeping two app slots for over-the-air firmware updates limits how many hashes fit. The largest list fits only when the board is flashed with a single-app partition table, which removes firmware OTA.
The README also looks at larger chips. It says that on a 16 MB ESP32-S3, the hashes would hold about 2.7M domains, compared with about 466k domains stored as strings in 8 MB of PSRAM.
Setup and security notes
If the device has no Wi-Fi configuration, it starts an open access point named C3-AdBlock-XXXX with a captive portal for setting up the network. The repository tells users to set the web dashboard credentials and OTA password in src/secrets.h before deploying; it says these gate the dashboard's state-changing endpoints and network OTA, and are not optional. The repository also contains an STL file for a printable enclosure for the SuperMini.
A build for the classic ESP32 was contributed by the community. The repository describes it as compile-tested and names the C3 as the tested target.
What It Means for Makers
- Who it is for: people who want a network-wide DNS blocker on a small ESP32-C3 board without PSRAM, which ESP32_AdBlocker does not support.
- Hardware: the repository lists any ESP32-C3 board with 4 MB of flash as the requirement, with no PSRAM needed. The C3 SuperMini is the board it was tested on. Treat the classic ESP32 build as compile-tested only.
- Choose the partition layout before flashing: decide whether you need firmware OTA updates, because that choice caps the blocklist size.
- Alternatives: if you already have an ESP32 or ESP32-S3 module with PSRAM, s60sc's ESP32_AdBlocker is the earlier option. It is licensed under AGPL-3.0 rather than MIT.
- Where to get it: the firmware, setup instructions and enclosure STL are in the esp32-c3-adblock repository. There is no packaged product. You supply your own ESP32-C3 board.