/panel/ Ramki
Lista ramek (Babcia, Dziadek...). Schedule dnia/nocy, audio preset, shuffle, pogoda 5 miast — wszystko per ramka.
Rodzinna ramka zdjęć na tablecie albo telewizorze. Jeden adres mailowy dla całej rodziny. Bez aplikacji, bez logowania, bez sztuczek.

Wszystko opiera się na zwykłym mailu. Nikt nie musi instalować żadnej aplikacji ani zakładać konta.
Telefonem, aparatem, czymkolwiek. JPEG, PNG, HEIC z iPhone'a, krótki film MP4 — wszystko działa.
Na fotomadrzak@gmail.com. Dopisz #babcia w temacie — trafi na ramkę u Babci. Bez tagu — Babcia sama wybierze gdzie.
Na ramce w salonie, zwykle w pół minuty. Dołącza do rotacji slajdów — będzie się pokazywać razem z innymi.
💡 Wysyłasz do nas pierwszy raz? Zatwierdzimy Cię raz w ramce — kolejne maile lecą już prosto, bez czekania.
Każdy w rodzinie ma własną skrzynkę mailową. To wszystko, czego potrzeba, żeby zdjęcie trafiło na ramkę.
Zdjęcia z telefonu, aparatu, ze skanera — wszystko jedno. Również krótkie filmy i animowane GIF-y. Standardowy limit poczty (do ~25 MB na mail) wystarczy w codziennym użytku.
Dopisz tag do tematu maila:
Bez tagu — zdjęcie trafia do „Niezaadresowanych" w panelu, admin przypisze ręcznie.
Twoje zdjęcia czekają chwilę na zatwierdzenie — żeby na ramkę u Babci nie wpadało nic od przypadkowych osób. Po jednorazowej akceptacji każdy kolejny mail leci od razu, bez czekania.
Zwykle pół minuty od wysłania. Mail dochodzi, zdjęcie się przygotowuje (niewielkie wersje na ramkę i miniaturki), trafia do rotacji slajdów — i już przy następnym pojawi się na ekranie u Babci.
Jeden URL, sesja przez ciastko, kontrola nad każdą ramką, każdym nadawcą i każdym mailem.

/panel/ Lista ramek (Babcia, Dziadek...). Schedule dnia/nocy, audio preset, shuffle, pogoda 5 miast — wszystko per ramka.
/panel/photos?status=pending Zdjęcia od nieznanych nadawców czekają na zatwierdzenie. Jeden klik akceptuje sender + jego zdjęcie.
/panel/senders Allowlista. Per nadawca: domyślna ramka, banowanie, statystyki przyjętych/odrzuconych.
/panel/emails Historia inboxu z dwóch kont IMAP (madrzak + Gmail). Reprocess maila ręcznie, zobacz błąd parsowania, dorzuć tag #slug.
/panel/mascot Frazy które maskotka wyświetla na ramce: imieniny, daty, salwa serc dla Babci.
/panel/apk 6-cyfrowy kod 10 min albo link 24 h. Spróbuj poniżej ↓
Panel · Kod do TV
Generujesz krótki, sześciocyfrowy kod. Wpisujesz go na telewizorze albo nowym tablecie i ramka instaluje się sama. Kod jest aktywny 10 minut — potem znika, żeby nie leżał gdzieś bezczynnie.
Druga opcja: link ważny 24 godziny — wysyłasz go przez Messengera, ktoś klika i ramka się instaluje.
Ciekawi Cię co jest pod spodem? Stack i słownik pojęć są w sekcji Dla geeków ↓
Ten sam Capacitor APK obsługuje oba światy. Onboarding raz, potem urządzenie samo żyje — wybudza się rano, gaśnie wieczorem.

Pomiędzy 7:00 a 22:00 ramka chodzi nieprzerwanie — slajdy, filmy, pogoda, ciekawostki. W nocy gaśnie sama, rano wstaje sama. Dotknij ekran, a wybudzisz ją na 5 minut.

Ramka pojawia się w głównym menu telewizora obok Netflixa i YouTube. Klikasz pilotem — i już patrzysz na rodzinne zdjęcia z kanapy. Bez przewodów, bez magii.
Nie tylko slideshow — pogoda, muzyka, maskotka, news. Wszystko opcjonalne, wszystko per ramka.
Co kilka slajdów ramka pokazuje pogodę z pięciu polskich miast — żeby Babcia widziała, czy w Krakowie u wnuczki pada.
Babcia lubi RMF Classic, Dziadek SomaFM. Każda ramka ma swoją stację — gra cicho w tle przez cały dzień, nocą milknie.
Zdjęcia nie lecą zawsze tak samo — co pewien czas tasujemy, żeby Dziadek nie nauczył się sekwencji na pamięć.
Pływające serca, kwiaty, balony. Życzenia imieninowe wskakują akurat w dzień Babci. Plus stały rezydent — Whiskers.
Raz na jakiś czas mała karta z wiadomościami z Polski. Żeby ramka żyła nie tylko zdjęciami, ale też dniem.
Rano ramka się włącza, wieczorem gaśnie. Filmy puszczają się tylko za dnia. Godziny ustawiasz raz w panelu.
„Babciu zadzwonię o 18:00", „AWARIA WODY DO 15:00" — krótki komunikat na samej górze ekranu, zielony / niebieski / czerwony pulsujący. Sam znika po zadanym czasie.
Zmieniasz godziny snu albo dodajesz miasto pogody w panelu — ramka zauważa sama w 5 minut. Nawet pełen update aplikacji idzie zdalnie, bez wstawania od biurka.
Wnuczka na urodzinach trafia do Babci i Cioci jednym mailem — albo jednym kliknięciem w panelu. Bez powtórnej wysyłki, bez kopii pliku.
Pasek u dołu ekranu, jak w telewizji: „Imieniny obchodzi Stanisław", „Sobota grill o 14:00", „Plan weekendu — kościół 10:00". Do 300 znaków, przewijany albo statyczny, na jedną ramkę lub na wszystkie naraz.
Babcia patrzy na wnuczkę i chce się jej napatrzeć dłużej niż 30 sekund? Tap, pauza — slajd stoi do odwołania. Klawiszem na klawiaturze, pilotem, dotykiem.
Mail od mamy z dziś rano pojawia się na ramce częściej niż zdjęcie z 2014 roku — przez tydzień. Ulubione (★) lecą podwójnie. Nadawcy z wyższym priorytetem dominują rotację, archiwum siedzi w tle.
Każda ramka ma swojego stałego rezydenta w rogu ekranu — postać, która siedzi tam codziennie. Drzemie, oddycha, czasem mrugnie. Te same animacje, które chodzą u nas na ramce — pokażemy poniżej, każdy z nich jest do wyboru w panelu.
catDrzemie w rogu od rana. Klasyk gatunku.
dogDobry kompan. Zasypia ze zmęczenia po spacerze.
owlCzuwa w dzień, mruga okiem. Wszystko widziała.
bunnyChwilę spokoju i już znów zerka na zegar.
pandaSpokojny żywioł. Patrzy uważnie i chrupie liście.
puppyPieseczek-łakomczuch. Macha ogonem i wita każdego.
kittyKociak-zawadiaka. Goni za własnym ogonem do skutku.
jumboSłonik-dżentelmen. Macha trąbą i pamięta wszystko.
crocodile_on_scooterKrokodyl na hulajnodze. Wpada, mruga okiem i już go nie ma.
yachtJacht na spokojnej fali. Płynie cicho, bez pośpiechu.
bunnies_in_boatKróliczki w łódce. Wiosłują razem, śmieją się głośno.
Inne maskotki przelatują przez ekran. Rezydent zostaje — to wasz domownik.
Razem z ramką, kiedy wybija godzina ciszy. Rano się przeciąga i wraca.
Wybierasz zwierzaka, ustawiasz rozmiar (mały / średni / duży) i widoczność (40–100%).
Włącz checkbox w panelu i rezydent zmienia się cyklicznie: kotek → piesek → sowa → króliczek → panda → pieseczek → kociak → słonik. Bez restartu, bez klikania. Babcia i Dziadek mają to samo zwierzę w tym samym 10-minutowym oknie.
Babcia może mieć kotka, Dziadek psa, wnuczek sowę. Każdy ekran inny — chyba że włączysz rotację, wtedy razem.
Rodzinna ramka to też prywatność rodziny. Każda warstwa od maila po APK ma własny chwyt.
Każda ramka ma swój własny klucz, jak zamek do drzwi. Otrzymujesz go raz, przy włączaniu — potem ramka pamięta sama.
Jeśli ramka Babci nagle otworzy się z innego miejsca niż jej salon — dostajesz mail. Spokój ducha bez wglądania co chwilę.
Gdy generujesz krótki kod do telewizora — działa wyłącznie z tego konkretnego TV. Ktoś inny, nawet jakby go podejrzał, nic z nim nie zrobi — kod ma 10 minut ważności i działa tylko z TV, który jako pierwszy go użyje.
Tylko zaproszone osoby mogą wysyłać zdjęcia. Niezaproszony adres trafia do poczekalni — Babcia decyduje, czy wpuścić.
Każdej nocy zapisujemy wszystkie zdjęcia i ustawienia. Masz dwa tygodnie zapasu — gdyby coś poszło źle, zawsze jest gdzie wrócić.
Zdjęcia nie wędrują do żadnego cudzego serwera. Lecą tylko z mailem prosto na nasz komputer, stamtąd na ramkę u Babci.
Szczegóły techniczne (klucze, hashe, oryginały vs. miniaturki) opisaliśmy w sekcji Dla geeków ↓
Cała ramka to seria pragmatycznych decyzji — opisanych dla tych, których ciekawi nie tylko efekt, ale i to, jak dokładnie gra tu każda warstwa.
Co dokładnie kryje się za pojęciami, których pozwoliliśmy sobie nie używać wyżej.
System ma już libheif — HEIC z iPhone'a działa za darmo, bez bindings.
Bez async/await dla DB. Transakcje jako db.transaction(() => {...})(). Online db.backup() co noc, bez przerywania serwisu.
Aplikacja ładuje frontend z server.url + allowNavigation — frontend update bez rebuilda APK. Service Worker wyłączony w native (anty-pattern obok PWA WebAPK).
Tylko AlarmClock + SCREEN_BRIGHT_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP wybudza fizycznie z Doze. Bez tego budzik dzwoni, ale ekran zostaje ciemny.
SSG, ~50 kB HTML + CSS, React islands tylko tam gdzie potrzeba interakcji (animowany hero, demo PIN). Tailwind v4 bez tailwind.config.js — wszystko w @theme w globals.css.
scripts/simulate-slideshow.js odtwarza algorytm Display.jsx 1:1 (te same wagi, ten sam Fisher-Yates z opcjonalnym Mulberry32 seed dla regresji, ten sam lastIndexRef). Generuje pełen cykl, statystyki rozkładu per-priority, detector mikro-pętli (jeśli ostatnie 100 slajdów ma <30 unikalnych ID). Zamiast podpinać tablet do debuggera — odpalasz node simulate-slideshow.js --frame=babcia --seed=42 i widzisz dokładnie co zobaczy babcia.
Pełna specyfikacja MVP (24 sekcje, ~1200 linii) i dziennik decyzji — w prywatnym repo. Kontakt przez fotomadrzak@gmail.com.
Cały projekt jest opisany — stack, decyzje, bolące pułapki Lenovo i Sony BRAVIA. Możesz rozłożyć na części, zbudować swoją wersję, dać Babci pierwszą paczkę zdjęć.
Aby Twoje zdjęcia trafiały na ramkę u Babci Madrzak — wyślij mail na fotomadrzak@gmail.com.