Kasia zbudowała Kursalio – aplikację do zarządzania kursami online, produktami cyfrowymi i subskrypcjami. Plan Premium opiera się na prostej obietnicy: użytkownik dostanie maila, zanim skończy mu się dostęp do kursu albo zanim odnowi się płatność za subskrypcję. Dotyczy to również okresów próbnych, które po 7 dniach same zamieniają się w pełną miesięczną opłatę.
Problem w tym, że jeśli zadanie wysyłające te maile po cichu przestanie działać, nikt tego nie zgłosi – użytkownik nie wie przecież, że miał dostać przypomnienie. Dowie się dopiero wtedy, gdy straci dostęp do opłaconego kursu albo zobaczy na koncie bankowym pobraną kwotę subskrypcji.
Cisza, której nie dało się odróżnić
W kodzie była luka, która czyniła tę ciszę nierozróżnialną.
„Gdy wygasał klucz do wysyłki maili, zadanie odpowiadało „ok: true” i nie wysyłało nic. A w dniu, w którym nikt nie miał terminu, nie powstawał ani jeden wiersz w bazie. Z zewnątrz „dziś nikt nie miał terminu” wyglądało identycznie jak „nie działa od dwóch tygodni”.”
Dlatego powstał Strażnik – monitoring, którego jedynym zadaniem jest odróżnianie tych dwóch sytuacji.
Jak działa automatyzacja
Strażnik uruchamia się sam
GitHub Actions, codziennie o 9:00 rano – godzinę po przebiegu zadania w aplikacji, żeby miał już co oceniać. Mieszka w osobnym repozytorium niż aplikacja, bo monitoring stojący na tej samej maszynie umiera razem z nią. Około 300 linii w Node, bez ani jednej zależności zewnętrznej.
Sprawdza stan
Czy strona odpowiada kodem 200 i naprawdę ma oczekiwaną treść. Ile dni zostało certyfikatowi SSL. Czy zadanie z przypomnieniami przebiegło w ciągu ostatnich 26 godzin i nie zakończyło się pozornym sukcesem bez wysyłki. Czy baza odpowiada – darmowy plan Supabase usypia projekt po tygodniu bez ruchu. Czy w danych nie ma absurdalnych wartości, np. sesji nauki dłuższej niż doba.
Przekazuje wynik człowiekowi
Jeden mail dziennie: zielony, żółty albo czerwony, z jednym zdaniem po polsku na górze o tym, co się stało i co to znaczy dla użytkowników. Czerwony wynik dodatkowo kładzie przebieg w GitHub Actions. Gdyby sam Strażnik przestał się odzywać, alarm wyśle Healthchecks.io – z zupełnie innej infrastruktury.

Kanarek
Sercem rozwiązania jest konto-wabik na produkcji, z jednym kursem i jedną subskrypcją. Po każdym sprawdzeniu Strażnik przesuwa ich daty na pojutrze, więc następnego dnia zadanie z przypomnieniami musi coś wysłać. Godzinę później Strażnik sprawdza, czy wpis o wysyłce faktycznie powstał.

To dowód end-to-end, że działa cała droga, którą przechodzi prawdziwy użytkownik: baza, logika dat, szablon maila i wysyłka – a nie tylko to, że serwer odpowiada na ping.

Co trzeba było dołożyć po stronie aplikacji
Żeby cokolwiek dało się sprawdzić, Kursalio musiało zacząć zostawiać po sobie ślad: dziennik przebiegów zadań cyklicznych, z jednym wierszem na każde zakończenie – łącznie z nieudanym. Do tego endpoint zdrowia chroniony hasłem, zwracający wyłącznie liczby i znaczniki czasu, bez żadnych danych osobowych.
Endpoint podaje surowe fakty i ich nie ocenia. Progi alarmowe żyją w Strażniku, dzięki czemu aplikacja nie musi nic wiedzieć o tym, że ktoś ją pilnuje.

Czego nauczył Kasię pierwszy przebieg
Pierwsze zapytanie po wdrożeniu zwróciło błąd bazy, a pół minuty później wszystko było zielone – zimny start wyglądał jak awaria. Dlatego czerwony wynik dostaje teraz drugą szansę po pięciu sekundach, i dopiero powtórzona porażka trafia do raportu.
Potem wszystkie czujki świeciły na zielono, a raport nie doszedł, bo adres nadawcy wskazywał na niezweryfikowaną domenę. Na koniec, gdy już wychodził, Gmail wrzucił go do spamu. Trzy razy ta sama lekcja: kanał powiadomień jest wart tyle, ile jego ostatni test. Stąd trzy niezależne kanały zamiast jednego – mail, status w GitHub Actions i Healthchecks.io.
Projekt powstał w Claude Code na konkurs StormIT „Zbuduj Strażnika” z okazji Dnia Programisty 2026. Działa na produkcji, a kod jest publiczny – zobacz repozytorium na GitHubie.
To kolejny z projektów zgłoszonych na konkurs Dzień Programisty 2026. Zobacz pozostałe albo sprawdź, jak zacząć swój.
