Dziewięć polskich stacji
Wiadomości, muzyka i polskie sprawy przez Wi-Fi — na Twoim głośniku Bluetooth albo wbudowanym. Włączasz i gra, resztą kostka martwi się sama.
Rodzina i znajomi za granicą lubią mieć w tle polskie radio. Do tej pory oznaczało to płatne aplikacje albo drogie dedykowane odbiorniki, więc zrobiłem kostkę, która gra dziewięć polskich stacji radiowych przez Wi-Fi i Bluetooth. Do tego generator białego, różowego i brązowego szumu: usypia, wycisza i działa bez internetu. Obraz systemu udostępniam za darmo — możesz powielić ją u siebie.
yoRadio to świetny kombajn DIY: sam dobierasz ekran i przetwornik, lutujesz, kompilujesz w Arduino IDE i grasz po kablu. Szanujemy. My budujemy od zera nową platformę o innej filozofii: Bluetooth zamiast kabla, mobilność, wygoda i lekkość.
A jeśli kochasz grzebać: yoRadio ma 65 tysięcy slotów na stacje, MQTT i Home Assistanta — i jest w tym świetne. My robimy radio dla twojej mamy. A może po prostu nowy trend, niezależnie od wieku: mała kostka, która daje ci tło — muzykę albo szum — żeby lepiej się żyło i pracowało.
W dzień polskie stacje. Wieczorem generator szumu, który usypia i wycisza. Jedna kostka.
Wiadomości, muzyka i polskie sprawy przez Wi-Fi — na Twoim głośniku Bluetooth albo wbudowanym. Włączasz i gra, resztą kostka martwi się sama.
Jeden dotyk i radio staje się maszyną do wyciszania: sen niemowlaka, drzemka, medytacja, praca w skupieniu. Szum powstaje w kostce, więc działa bez internetu — w hotelu, w aucie i w samolocie.
Miliony Polaków mieszkają poza krajem. Ta kostka kosztuje tyle, co dwie pizze, a daje coś, czego nie sprzedaje żadna platforma: polskie poranki, polskie wiadomości i polską muzykę w Dublinie, Chicago czy Oslo.
Zero subskrypcji, konta i regulaminu, który jutro się zmieni. Nie ma OTA ani chmury, więc nie ma też przycisku, którym ktoś zdalnie zgasi twoje radio.
Hotelowe Wi-Fi wystarczy na radio, a szum gra nawet bez sieci. Do dwóch godzin na wbudowanym aku, dalej dowolny powerbank.
Strumienie stacji są publiczne, szum rodzi się w kostce. Nie ma czego opłacać co miesiąc.
Kostka nie jest usługą. Nie ma serwera, który może paść, ani firmy, która może zmienić zdanie. Jest twoja — jak radio na półce, tylko że gra z internetu.
Open Radio powstało z jednego założenia: kupić gotowy sprzęt all-in-one i napisać do niego cały system. Zakres funkcji zamknęliśmy z premedytacją.
Dziewięć dużych polskich anten — od rocka Antyradia po klubowe mixy RMF MAXX Club. Kostka gra ich oficjalne, publiczne strumienie MP3 wprost od nadawców: bez retransmisji, bez nagrywania, bez pośredników. Z perspektywy stacji to po prostu kolejny słuchacz na liczniku, tyle że w ładniejszym pudełku. Linki prowadzą na oficjalne strony.
Bo to jedyna droga do 50 € bez lutowania. Ekran, dotyk, głośnik, bateria, obudowa i oba radia są w cenie — wyciągasz z pudełka i flashujesz.
Płaci się za to jedną walutą: Wi-Fi i Bluetooth dzielą jeden modem radiowy 2,4 GHz i muszą się nim wymieniać w czasie. Większość wpisów w dzienniku poniżej wynika wprost z tej jednej decyzji zakupowej.
Sam Core2 to fragment większego ekosystemu M5Stack: kostki Core z ekranem, mniejsze Atom i StickC oraz dziesiątki nakładanych modułów — wszystko na ESP32, z publiczną dokumentacją. Do tego projektu niczego nie dokładaliśmy: jedna kostka prosto z pudełka.




Wybrane wpisy z dziennika inżynierskiego. Wszystkie liczby pochodzą z telemetrii zrzucanej z urządzenia podczas wielominutowych testów.
Wi-Fi i Bluetooth siedzą w ESP32 na wspólnym module 2,4 GHz i dzielą antenę w czasie. Gdy A2DP nadaje, okno TCP (~5,7 KB — stała kompilacji Arduino LWIP) pomnożone przez RTT rozdęte do 350–500 ms daje 12–14 KB/s. Strumień MP3 128 kb/s potrzebuje 16. Deficyt to nie bug, to arytmetyka.
Klasyczna rada z forów na przyspieszenie Wi-Fi w ESP32. Przy aktywnym Bluetoothu kontroler robi abort() i kostka boot-loopuje co 26 sekund. Bez modem-sleep koegzystencja obu radiów po prostu się sypie.
CDN oddaje pierwsze sekundy strumienia szybkim burstem, potem już dokładnie 1× realtime. Każdy próg bufora ustawiony powyżej punktu równowagi nigdy nie zostanie osiągnięty — radio w nieskończoność „czeka, aż się zbuforuje". Wszystkie progi rezerw musiały zejść poniżej.
Potrojenie pracy dekodera na przebieg pętli nie dodało ani jednej ramki audio (deficyt siedzi w sieci), za to wydłużyło przebieg do 1,6 s i zabiło dotyk. Przy deficycie sieciowym budżet dekodera decyduje wyłącznie o responsywności interfejsu. Wróciło 8192 ramek na przebieg.
Ścieżki śmierci strumienia nie czyściły aktywnego endpointu, więc „rotacja kandydatów" od zawsze otwierała w kółko ten sam martwy URL. Objaw: 81 restartów w 3 minuty. Naprawa sprowadziła się do czyszczenia endpointu w trzech miejscach.
Handshake TLS potrzebuje ~40 KB wolnego DRAM. Przy grającym Bluetoothu zostaje 25–30 KB, więc przełączenie na stację wymagającą discovery przez HTTPS w trakcie grania jest fizycznie niewykonalne. Rozwiązanie: przypięte fallbacki plain-HTTP per stacja plus cache ostatniego działającego źródła.
Głośnik po odłączeniu zasilania nie czeka grzecznie na skan — sam dzwoni do kostki. A kostka odrzucała nieznajomych. Klincz. Fix: dotknięcie „skanuj" otwiera okno, w którym przychodzący zgodny głośnik zostaje adoptowany i zapamiętany.
Kostka 2 m od punktu dostępowego tnie audio falami; w drugim pokoju gra idealnie. Nadajnik Wi-Fi routera zagłusza odbiornik Bluetooth w kostce. Czasem najlepszą poprawką firmware'u jest przestawienie urządzenia o trzy metry.
Zasada projektowa: wtyczka + prąd = gra. Każdą awarię radio ma przeżyć samo, bez telefonu i bez człowieka.
System powstaje w całości w parze agentów AI pracujących na jednej maszynie, z audytami krzyżowymi między silnikami. Człowiekowi zostają decyzje i uszy.
Architektura, firmware, symulator GUI z pixel-parity (przeglądarka rysuje dokładnie te same piksele RGB565 co urządzenie), dwujęzyczna dokumentacja.
Przejęcia produkcji w kryzysie: fizyka toru audio, hotfixy rotacji i TLS, bramki QC, audyty krzyżowe raportów drugiego silnika.
Wyznacza granice produktu, słucha wyników na żywo i zatrzymuje każdy flash, który nie przeszedł protokołu. Jedyny element układu, który słyszy.
Werdykt PASS/FAIL wydaje telemetria. Każdy kandydat na firmware przechodzi wielominutowy test z zapisem: starvation Δ0 · watchdog Δ0 · wstrzyknięta cisza 0,0 s / 300 s · kolejki pełne. Dopiero potem człowiek słucha.
W repo jest ponad 100 numerowanych dokumentów inżynierskich, każdy po polsku i angielsku. Tak, do radia.
Część z nich naprawdę.
Żona lubi siedem z nich. Dwie kolejne dodały się same, bo miały stabilny strumień. Inżynieria bywa prosta. ;)
Bo router krzyczy Wi-Fi prosto w bluetoothowe ucho kostki. Zmierzyliśmy to. Trzy metry odstępu robią więcej niż niejeden firmware-fix, szczegóły w LOG-08.
Są, czasem płatne. Tylko że telefon dzwoni, powiadamia i wychodzi z tobą z kuchni. Kostka stoi i gra.
Sprzęt ~50 €. Do tego 2,75 miliarda tokenów AI, których nie przeliczamy na złotówki, bo miało być hobby.
Kolejność wydania odwróciliśmy celowo: zamiast wypuszczać surowe źródła, najpierw udostępniamy gotowy obraz do wgrania — jedna komenda esptool i kostka gra. Kod trafi na GitHub po szlifach, testach długodystansowych i domknięciu bramek licencyjnych.
Licencje zadeklarowane: GPL-3.0-or-later (kod) · CC BY-SA 4.0 (dokumentacja) · CC0 (katalog stacji) · bez retransmisji i nagrywania audycji · logotypy stacji tylko za zgodą nadawców