Luna to mój własny projekt, nie wdrożenie u klienta. Wymyśliłem ją, zbudowałem i używam jej na co dzień. Opisuję ją tutaj, bo pokazuje w jednym miejscu to, co w automatyzacjach dla firm robię po kawałku: rozumienie zwykłego języka, harmonogram, powiadomienia i kontrolę kosztów modeli. Kod jest publiczny, a aplikację można wypróbować — linki na końcu.
Problem
W aplikacjach do przypomnień trzeba się sporo naklikać. Najpierw wybierasz, czy to zadanie, wydarzenie czy notatka, potem klikasz datę, godzinę, powtarzanie i wyprzedzenie. Każdy krok jest prosty, ale razem robi się z tego formularz, którego nie wypełnisz w biegu, z zakupami w ręce. Więc sprawy nie zapisujesz i przypominasz sobie o niej dzień po terminie.
Chciałem czegoś prostszego: mówię o sprawie tak, jak powiedziałbym drugiej osobie, i niczego nie muszę wypełniać. Zdanie „Za 3 dni rano jadę do urzędu” ma wystarczyć.
Co powstało
Luna to aplikacja instalowana na telefonie prosto z przeglądarki, z powiadomieniami na telefon. Piszesz albo dyktujesz jedno zdanie, a model językowy, czyli AI, które rozumie tekst, rozpoznaje, czego dotyczy sprawa, i sam tworzy to, czego trzeba: jednorazowe przypomnienie, zadanie cykliczne z wcześniejszym przypomnieniem, listę albo notatkę.
- Sprawdza w sieci. Napisałem: „Sprawdź, o której dziś Wiadomości, i przypomnij 10 minut przed”. Luna znalazła godzinę 19:30 i ustawiła przypomnienie na 19:20. Jedno takie sprawdzenie kosztuje około 3 groszy.
- Streszcza strony i pilnuje zmian. Streszczenie powstaje w około 5 sekund, a powiadomienie przychodzi tylko wtedy, gdy na stronie faktycznie coś się zmieniło.
- Czyta zdjęcia. Ze zdjęcia zaproszenia z datą robi przypomnienie, a ze zdjęcia tablicy czy paragonu zwykłą notatkę.
- Zapisuje to, co podyktujesz. Rozpoznawanie mowy działa na moim serwerze, nagrania nie idą do zewnętrznej usługi.
- Wysyła poranny raport: co masz dziś i jutro, a w poniedziałek na cały tydzień. Przy okazji pyta o sprawy po terminie.
- Przypomina dokładnie o czasie. Czerwona karta i seria powiadomień: pięć co 20 sekund, potem pięć co 2 minuty. Na tym kończy, żeby nie męczyć.
- Ma „Biurko”. Wklejasz dłuższy tekst, a Luna dzieli go na osobne sprawy, pokazuje do przejrzenia i dopiero wtedy zapisuje.
Prosiłem o listę, dostałem samo przypomnienie
Pierwsza wersja miała typy: przypomnienie, zadanie cykliczne, lista, notatka. Model czytał zdanie i wybierał jeden z nich. Działało to do pierwszej prawdziwej prośby: poprosiłem o listę kontrolną, która wraca co dwa tygodnie, z przypomnieniem dzień wcześniej. Dostałem samo przypomnienie. Lista przepadła, bo typ „przypomnienie” nie miał na nią miejsca.
To nie był błąd modelu. Zrozumiał zdanie poprawnie, ale aplikacja nie miała gdzie tego zapisać: przypomnienie nie mogło mieć listy. Kazałem mu wybrać jeden typ dla sprawy, która potrzebowała dwóch.
Naprawiłem to, rezygnując z typów. Każda sprawa składa się teraz z części: termin (jednorazowy albo cykliczny), przypomnienia, lista, strona internetowa, której zmian Luna pilnuje, i informacje wyjęte wprost ze zdania. Model dobiera teraz części, zamiast wybierać jeden typ. Cykliczna lista to po prostu termin i lista, która przy każdym powtórzeniu zaczyna się od nowa. Karta na ekranie i widok szczegółów składają się z tych samych części, więc zawsze pokazują to samo.
Kiedy asystent AI „nie rozumie” prośby, pierwsze podejrzenie pada na model albo na instrukcję. Warto najpierw sprawdzić, czy miał gdzie zapisać to, co zrozumiał. Jeśli aplikacja pozwala zapisać tylko jeden rodzaj sprawy, nawet najlepszy model nie zrobi nic więcej.
AI dopisuje brakujące elementy, a drugi model sprawdza ich kod
Niektórych spraw nie da się złożyć z gotowych części: śledzenie wagi, licznik kilometrów, przeczytane strony książki. Wtedy Luna dodaje do sprawy widget, czyli dodatkowy element karty, na przykład licznik albo wykres. Najpierw szuka pasującego we wspólnej bibliotece gotowych widgetów, a jeśli go nie ma, drugi model pisze nowy. Licznik tygodniowy powstał raz dla jednej sprawy. Kolejna, o stronach książki, dostała go z biblioteki w około 10 sekund, tylko z inną jednostką.
Kod napisany przez model i pokazywany wszystkim użytkownikom to oczywiste ryzyko, więc nie trafia do biblioteki od razu. Najpierw sprawdza go automat, a potem czyta go osobny model, którego jedynym zadaniem jest szukanie powodów do odrzucenia. Do tego każdy widget działa w odizolowanej ramce, bez dostępu do reszty aplikacji.
To sprawdzanie naprawdę coś wyłapało. Pierwszą wersję jednego z widgetów drugi model odrzucił, bo kod wstawiał na stronę tekst wpisany przez użytkownika bez żadnego zabezpieczenia. W ten sposób można podrzucić do aplikacji złośliwy kod (ta luka nazywa się XSS). Po odrzuceniu model, który napisał kod, dostaje uzasadnienie i jedną próbę poprawki. Poprawiona wersja przeszła. Zagrożenie nie musi zresztą pochodzić od użytkownika: Luna czyta cudze strony, a złośliwa instrukcja może być ukryta w ich treści. Dlatego zabezpieczenie pobierania stron sprawdziłem osobno, na czterech rodzajach ataku.
Siedem minut czekania na kod od AI
Na pierwsze widgety czekałem od 3 do 7 minut, a zdarzało się, że kod urywał się w połowie. Wyglądało na to, że model jest za słaby do pisania kodu. Pomiar pokazał dwie inne przyczyny. Ten sam model udostępnia kilka firm, a moje zapytania trafiały do tych powolnych. Poza tym model większość czasu zastanawiał się, zanim napisał pierwszą linijkę.
Wystarczyły dwie zmiany w ustawieniach, bez wymiany modelu: zapytania idą teraz do najszybszej firmy, a model ma limit na zastanawianie się. Ten sam model pisze teraz widget w 22–34 sekundy. Poprawienie istniejącego widgetu w rozmowie zajmuje około 15 sekund, a nowa wersja pojawia się bez odświeżania strony.
Podobnie było ze zdjęciami. Odczyt trwał 11–16 sekund, bo obrazy szły do osobnego modelu. Okazało się, że model używany do tekstu też obsługuje obrazy. Po przełączeniu odczyt zajmuje około 5 sekund przy tej samej dokładności, a ja mam o jeden model mniej do utrzymania.
Co nie wyszło: czat, który umiał tylko pisać kod
Poprosiłem w czacie o poprawienie tytułu listy, bo dyktowanie go przekręciło. Czat umiał wtedy wyłącznie pisać widgety, więc zamiast poprawić tytuł, zrobił drugą listę. Po tej wpadce „Popraw” to rozmowa o jednej, wybranej sprawie: Luna mówi, co zamierza zmienić, czeka na „Zrób to” i niczego nie dubluje z własnej inicjatywy.
Koszty pod kontrolą, zanim ktoś obcy zacznie klikać
Za każdą akcję Luny płacę, a aplikację może wypróbować każdy. Dlatego każdy dostęp zatwierdzam sam, nowe konta mają dzienny limit 40 akcji, a na modele ustawiłem osobny budżet z alarmem przy 80, 95 i 100 procentach. Gdy limit się wyczerpie, wpisy nie przepadają. Czekają w kolejce w telefonie i wysyłają się same, kiedy znów jest to możliwe.
Efekt
- zamiast formularza wystarcza jedno zdanie, napisane albo podyktowane; powstaje z niego przypomnienie, zadanie cykliczne, lista lub notatka,
- 3–7 min → 22–34 s — tyle AI potrzebuje na napisanie nowego widgetu,
- 11–16 s → ok. 5 s — odczyt zdjęcia, bez utraty dokładności,
- streszczenie strony w około 5 sekund, sprawdzenie w sieci za około 3 grosze,
- każdy widget napisany przez AI jest sprawdzany dwa razy: automatycznie i przez drugi model; jeden został odrzucony z powodu luki w zabezpieczeniach, zanim ktokolwiek go zobaczył,
- dzienny limit na konto i osobny budżet na modele, więc rachunek nie przekroczy ustalonej kwoty.
Co z tego wynika dla firmy
Lunę zrobiłem dla siebie, ale to samo rozwiązanie sprawdzi się w firmie: ktoś zapisuje sprawę zwykłym zdaniem, a system sam ustala termin i pilnuje, żeby właściwa osoba dostała przypomnienie na czas. Takim zdaniem może być „przegląd gaśnic w marcu”, „Kasi kończą się badania okresowe w maju” albo „oddzwonić do klienta w czwartek”. Dziś takie sprawy są zapisane w arkuszu, którego nikt nie otwiera, albo ktoś po prostu musi o nich pamiętać.
Trzy wnioski z tego projektu przydają się przy każdym wdrożeniu w firmie. Asystent potrafi tylko tyle, ile aplikacja pozwala mu zapisać (historia z typami). Kod i treści od AI ktoś musi sprawdzić, zanim zobaczy je użytkownik (historia z odrzuconym widgetem). Limit kosztów ustawia się przed uruchomieniem, a nie po pierwszej fakturze.
Użyte technologie: cały backend w n8n (API, harmonogram, powiadomienia, generowanie widgetów), baza PostgreSQL, aplikacja PWA z powiadomieniami push, modele językowe przez OpenRouter (DeepSeek 4.1 Flash do rozumienia i zdjęć, GLM 5.3 Flash do kodu widgetów), rozpoznawanie mowy na własnym serwerze, całość na własnej infrastrukturze za Cloudflare. Kod źródłowy: github.com/ldraminski/luna.
Terminy i sprawy w Twojej firmie są w arkuszu albo w czyjejś głowie?
Napisz, czego trzeba u Ciebie pilnować i kto dziś o tym pamięta. Odpowiem, czy da się to oddać asystentowi i ile to pracy. Lunę możesz najpierw wypróbować: poproś o dostęp na luna.draminski.dev, a ja go zatwierdzę.
Inne case studies
Asystent, który zna dokumenty firmy — i podaje źródło każdej odpowiedzi
Pierwsza wersja odpowiadała fatalnie: 0 trafnych odpowiedzi na 5. Oczywista diagnoza okazała się błędna, a prawdziwa przyczyna leżała dwa kroki wcześniej.
Monitoring i alertyAutomatyzacja, która wie, że przestała działać
Monitoring odpowiadał „brak przerwy” także wtedy, gdy w ogóle nie widział strony. Uspokajająca wiadomość w sytuacji, w której nic nie zostało sprawdzone.
Integracje systemówBot na Telegramie: pytasz głosem, dostajesz odpowiedź głosem
Dostęp do firmowego systemu z telefonu, bez otwierania panelu. Po drodze złapana halucynacja i awaria sieci, która zjadała co czwarte połączenie.
AI w procesieAI opisuje zdjęcia produktów, a katalog ładuje się 27 sekund
Katalog, w którym opisy produktów pisze AI ze zdjęcia. Działał, tylko ładował się ponad 27 sekund — i winna nie była wcale sztuczna inteligencja.