Siedmego października wątek na Hacker News zebrał 188 punktów i ponad 80 komentarzy dla projektu, który po polsku przeszedł niezauważony, choć duże serwisy anglojęzyczne pisały o nim już w lipcu. Nazywa się esp32-c3-adblock, leży na GitHubie pod licencją MIT i odsiewa reklamy oraz trackery dla całej sieci domowej, odpowiadając na zapytania DNS zamiast prawdziwego resolvera. Sprzęt to płytka za 25,90 zł, wpięta przez dongle USB-A do USB-C w wolny port routera i zasilana z tego portu. Nie ma tu systemu operacyjnego, dysku ani wentylatora. Jest mikrokontroler, 4 MB flasha i sposób na zmieszczenie setek tysięcy zablokowanych domen we flashu płytki, przy około 50 kilobajtach RAM.
Tekstu nie poprzemy własnym testem, bo płytki nie mamy: opisujemy README, pomiary cytowane przez Tom’s Hardware i krytykę z wątku HN, z linkiem przy każdym twierdzeniu. Ceny płytek sprawdziliśmy w polskim sklepie z elektroniką, a przy instalacji wskażemy miejsce, w którym łatwo sobie zaszkodzić bezpieczeństwem.
Spis treści:
- Skąd ten projekt i czemu piszemy dopiero teraz
- Jak to działa: hasze we flashu zamiast listy w pamięci
- Co dostajesz w praktyce
- Gdzie to bolało na Hacker News
- Instalacja krok po kroku
- Ile to kosztuje w Polsce
- Dla kogo to jest
- Źródła
Skąd ten projekt i czemu piszemy dopiero teraz
Autor o nicku M-Abozaid wrzucił kod na GitHuba 19 czerwca 2026 roku. Na dziś projekt ma 2313 gwiazdek, 210 forków i ostatni zapis w kodzie z 6 października, więc rozwija się na żywo. Tom’s Hardware opisało go 19 lipca pod tytułem o „dongle za 5 dolarów”, który mieści 537 tysięcy domen, zużywa około 50 KB RAM i odpowiada na zablokowane zapytania w 10 milisekund. Wczorajsza fala na Hacker News różniła się od lipcowej tym, że komentujący przestali klaskać i zaczęli mierzyć: latencję przez Wi-Fi, rachunek na kolizje haszy, jakość dokumentacji. Z tej wymiany wyszło więcej niż z nagłówków.
Po polsku temat stoi pusty, choć popyt jest: „esp32 adblocker” ma w Google sześć podpowiedzi, od „esp32 adblocker github” po „esp32 dns adblock”, a frazy „pi hole czy warto” i „adguard home vs pihole” żyją od dawna. Żadne krajowe medium tego projektu nie opisało.
Jak to działa: hasze we flashu zamiast listy w pamięci
Bloker DNS ma prostą robotę: gdy przeglądarka pyta o domenę serwera reklamowego, odpowiada zerowym adresem i śledzik nigdy nie zostaje odpytany. Pi-hole i AdGuard Home robią to na maszynie z systemem, trzymając listę domen jako tekst w RAM. W mikrokontrolerze tej przestrzeni nie ma. ESP32-C3 nie obsługuje zewnętrznego PSRAM, a wewnętrznej pamięci ma kilkaset kilobajtów, z których firmware i tak zużywa większość.
Trik tego projektu polega na tym, że lista domen w ogóle nie ląduje w RAM. Domeny zapisano we flashu jako posortowane hasze 40-bitowe (FNV-1a) i wyszukuje się je binarnie. Zapytanie zamieniane jest na hasz, do tego hasze wszystkich nadrzędnych sufiksów, po czym binarne przeszukanie flasha stwierdza trafienie albo jego brak. Trafienie dostaje w odpowiedzi 0.0.0.0, chybienie idzie do prawdziwego resolvera i odpowiedź wraca do urządzenia. Autor podaje konkretne liczby: 141 tysięcy domen mieści się w 0,67 MB flasha, wyszukanie to około 18 odczytów flasha i około 10 milisekund łącznie z opóźnieniem Wi-Fi, a RAM zajęty przez blokera to około 50 KB.
| Lista tekstowa w RAM | Hasze we flashu (ten projekt) | |
|---|---|---|
| Wymagany sprzęt | ESP32 z PSRAM, około 8 USD | ESP32-C3 bez PSRAM, około 2 USD |
| 141 tys. domen | około 2,5 MB RAM | 0,67 MB flasha |
| Zajętość RAM | większość pamięci układu | około 50 KB |
| Wyszukanie | porównania tekstów | około 18 odczytów flasha, ~10 ms z Wi-Fi |
| Kolizje haszy | nie dotyczy | 0 przy 141 tys., 1 przy 537 tys. |
Czterdzieści bitów to nie przypadek. Przy 32 bitach autor liczy około siedmiu kolizji na liście 250 tysięcy domen, a 64 bity dokładałyby trzy bajty na domenę, rozwiązując problem, którego nie ma. Na większych układach ten sam pomysł działa jeszcze lepiej: na ESP32-S3 z 16 MB flasha hasze pomieszczą około 2,7 miliona domen, gdy stringi w 8 MB PSRAM tylko 466 tysięcy.
Co dostajesz w praktyce
Płytka wystawia panel w przeglądarce pod adresem c3adblock.local: statystyki zapytań, ręczne dopisywanie i wycofywanie domen. Konfiguracja Wi-Fi idzie przez portal: gdy płytka nie zna sieci, uruchamia własny punkt dostępowy C3-AdBlock-XXXX z witryną konfiguracyjną, do której wchodzisz telefonem, wybierasz swoją sieć i podajesz hasło. Przeniesienie na nową sieć to przycisk Forget WiFi w panelu albo przytrzymanie przycisku BOOT przy zasilaniu.
Listy blokujące buduje się osobnym skryptem w Pythonie z plików hosts, zwykłych list domen albo reguł w formacie AdGuard (blokady ||domena^ i wyjątki @@). Domyślnie skrypt składa bazę StevenBlack z lekką listą Hagezi, około 100 tysięcy domen, z założeniem bezpiecznym dla komunikatorów i mediów społecznościowych. Blokada domeny obejmuje jej subdomeny. Reguł z wyrażeniami regularnymi, gwiazdkami i kosmetycznych, czyli takich, które chowają elementy strony, skrypt nie umie i jawnie je zlicza, zamiast udawać, że je obsłużył. Wyjątek @@ odblokowuje dokładnie jedną domenę, nie tnie subdomen.
Aktualizacje idą przez sieć. Zespół projektu publikuje świeży plik blocklist.bin raz w tygodniu (ostatni wypuszczono 4 października) pod stałym adresem, więc raz wklejony URL w opcji Remote auto-update utrzymuje urządzenie aktualnym bez dotykania. Firmware też da się podmienić po Wi-Fi, ale to kosztuje: dwa sloty na obraz zostawiają około 1,3 MB na listę, czyli maksimum około 250 tysięcy domen. Wariant z 537 tysiącami wymaga partycji jednoslotowej i wtedy aktualizacji firmware po sieci nie ma. Wybór sprowadza się do jednego pliku partitions.csv.
W praktyce jest to bloker reklam i pomiarów naraz: trackery i domeny telemetryczne odpadają razem z banerami, bo siedzą na tych samych listach. Reklam w YouTube to nie wyłączy, bo serwowane są z tych samych serwerów co treść, i to samo pytanie pada przy Pi-hole, bo fizyka DNS jest wspólna. Świat pomiaru reklam opisywaliśmy osobno przy ciasteczku __obi, jeśli chcesz zobaczyć, kto i po co mierzy.
Gdzie to bolało na Hacker News
Latencja to główny zarzut. Autor README podaje około 10 milisekund na zapytanie razem z czasem Wi-Fi, a komentujący rozpisali, co to znaczy w praktyce: samo Wi-Fi dokłada u jednego z nich typowo około 8 ms, każdy skok interferencji potrafi dodać 50-100 ms, podczas gdy DNS po kablu w tej samej sieci odpowiada poniżej 1 ms. Systemy i przeglądarki cache’ują odpowiedzi DNS, więc koszt płaci się głównie przy pierwszym odpytaniu każdej domeny. Jak to wychodzi w domu z kilkunastoma urządzeniami, nikt w wątku nie zmierzył.
Kolizje haszy brzmią groźniej, niż bolą. Kolizja to sytuacja, gdy uczciwa domena wyląduje na tym samym 40-bitowym haszu co zablokowana i przestanie się otwierać. Przy budowaniu list autor zmierzył zero kolizji dla 141 tysięcy domen i jedną dla 537 tysięcy. Część wątku zajęła sobie spór o rachunek oczekiwanej liczby kolizji (wychodzi 0,13 dla 537 tysięcy wg problemu urodzinowego, zamiast „około jednej”), ale rozbieżność jest kosmetyczna: rząd wielkości to „mniej niż jedna”. Gdy już padnie, domenę odblokowujesz w panelu.
Osobny wątek to dokumentacja: kilku komentujących uznało README za pisane przez model, inni odparli, że oskarżanie o AI stało się nowym polowaniem na czarownice. Z naszej strony: liczby z tabeli porównawczej sprawdziło w dyskusji kilku matematycznie zaprawionych czytelników i poza nieścisłą prezentacją kolizji się obroniły. Trzeba też pamiętać o zasilaniu, bo tanie i luźne adaptery USB-C potrafią wybić układ w trakcie nadawania Wi-Fi; autor zaleca ładowarkę albo port routera. Płytka idzie na 45-55 stopni w spoczynku, więc w drukowanej obudowie z repo zostawiono otwory wentylacyjne, a przestrzeń przy antenie PCB ma zostać wolna od tworzywa i metalu.
Instalacja krok po kroku
Do wgrania potrzebujesz zwykłego komputera z aktualnym PlatformIO. Tu pierwsza pułapka: wersja z repozytoriów dystrybucji (4.3.4) jest za stara i wysypuje się z błędem AttributeError na resultcallback, o czym pisze issue #4. Bierz rdzeń z rozszerzenia VSCode albo robisz pip install -U platformio w środowisku wirtualnym. Dalej już prosto:
- Kopiujesz src/secrets.example.h do src/secrets.h i wpisujesz WEB_USER, WEB_PASS i OTA_PASS. Te trzy hasła pilnują panelu i aktualizacji OTA i są obowiązkowe, bo jeszcze niedawno endpointy zmieniające stan były otwarte dla każdego w sieci lokalnej. WIFI_SSID i WIFI_PASS możesz zostawić i skonfigurować przez portal.
- Budujesz listę: python3 tools/build_blocklist.py data/blocklist.bin (domyślnie StevenBlack plus Hagezi Light, można podać własne URL-e i pliki).
- Wgrywasz firmware i system plików: pio run -t upload, potem pio run -t uploadfs. To jedyny raz, gdy płytka widzi kabel USB.
- Podpinasz płytkę do portu USB w routerze donglem USB-A do USB-C i sprawdzasz przez pio device monitor, na jakim adresie wstała, albo otwierasz c3adblock.local.
- Bez zapisanej sieci płytka wystartuje punkt C3-AdBlock-XXXX: wchodzisz telefonem, podajesz hasło do Wi-Fi, gotowe.
- Ostatni krok jest wspólny dla każdego blokera DNS: w ustawieniach DHCP routera wpisujesz adres płytki jako serwer nazw, tak samo, jak zrobiłbyś to z Pi-hole. Od tej chwili cała sieć pyta płytkę.
Ile to kosztuje w Polsce
Wymagany jest dowolny ESP32-C3 z 4 MB flasha. Autor testował na SuperMini, czyli chińskim klonie kosztującym za granicą równowartość kilku złotych, a w polskich sklepach odpowiedniki wg kart produktów z 8 października stoją tak: Seeed Xiao ESP32-C3 to 25,90 zł, Waveshare ESP32-C3-Zero to 32,89 zł, oba na Botlandzie. Klasyczny ESP32 też się buduje (kompilację sprawdzili współpracownicy projektu, choć testowanym celem jest C3). Zasilanie bierze się z portu routera, a obudowę w STL wydrukuje każdy, kto ma dostęp do drukarki 3D.
| Ścieżka | Sprzęt | Koszt startu |
|---|---|---|
| ESP32-C3 (ten projekt) | płytka + dongle USB | od 25,90 zł |
| Pi-hole | komputer działający całą dobę (klasycznie Raspberry Pi) + zasilacz i nośnik | kilkukrotnie więcej |
| AdGuard Home | urządzenie, które już pracuje: router z OpenWrt, NAS, stary laptop | 0 zł, jeśli je masz |
Porównanie ma sens tylko z kontekstem. Jeśli masz NAS albo router z OpenWrt, AdGuard Home na tym urządzeniu będzie szybszy, bo nie idzie przez Wi-Fi, i nie dokłada drugiego urządzenia do prądu. Płytka wygrywa tam, gdzie liczy się osobne, głupie urządzenie, które nie umie nic poza swoją robotą: nie ma na nim konta do przejęcia, nie aktualizuje systemu co miesiąc i nie da się na nim przypadkiem uruchomić czegoś innego.
Dla kogo to jest
Ten projekt jest dla ludzi lubiących grzebać w elektronice, nie dla szukających najprostszej drogi bez reklam. Do flashowania potrzebujesz komputera z terminalem i cierpliwości do PlatformIO; jeśli to brzmi obco, zacznij od AdGuard Home. Za to jeśli niedawno składałeś klaster BitNet na siedmiu płytkach albo myślisz o nim, ta płytka to naturalny następny krok w tym samym klimacie: tani sprzęt robi jedną rzecz lokalnie, bez chmury i abonamentu. Temat lokalnego liczenia bez wysyłania czegokolwiek na zewnątrz rozwinęliśmy w poradniku o lokalnym AI na komputerze.
Projekt żyje: ostatni zapis kodu 6 października, dwadzieścia otwartych zgłoszeń i propozycji zmian, autor zapowiada instalator w przeglądarce jednym kliknięciem. Gdy płytka trafi do redakcji, dopiszymy własne pomiary latencji, bo to jedyna rzecz, której nikt w dyskusji nie zmierzył na prawdziwym sprzęcie.
Źródła
- Repozytorium esp32-c3-adblock (GitHub, licencja MIT)
- Dyskusja na Hacker News z 7.10.2026 (188 pkt)
- Tom’s Hardware 19.07.2026: 537 000 domen w dongle za 5 USD
- Release blocklist.bin z 4.10.2026 (GitHub)
- Cennik: Seeed Xiao ESP32-C3, 25,90 zł (Botland, stan 8.10.2026)
- Cennik: Waveshare ESP32-C3-Zero, 32,89 zł (Botland, stan 8.10.2026)
- Lista StevenBlack/hosts (GitHub)
- Listy Hagezi DNS (GitHub)
