Usługi Strony internetowe Aplikacje webowe System rezerwacji Aplikacja dla klubu sportowego Produkty white-label Typer O mnie FAQ Kontakt Zadzwoń: +48 730 943 795 Napisz do mnie

Case study · własny produkt AOVP

Typer MŚ 2026: case study własnej aplikacji

Typer to mój własny produkt, więc mogę pokazać wszystko: liczby z bazy, koszty utrzymania, popełnione błędy i to, co zrobiłbym dziś inaczej. Aplikacja obsłużyła cały turniej mistrzostw świata, od pierwszego gwizdka do finału.

Liczby z produkcji

Gracze
27 zarejestrowanych, wszyscy typowali. Ani jedno konto nie zostało założone i porzucone.
Typy
3 829 łącznie: 2 457 typów meczowych, 1 345 typów awansu, 27 typów mistrza.
Zaangażowanie
Średnio 91 typów na gracza przy 104 meczach, czyli około 87% wszystkich możliwych.
Mecze
104 rozegrane, 104 rozliczone automatycznie, bez ręcznego wpisywania wyników.
Czas trwania
Rejestracje od 28 maja, mecze od 11 czerwca do 19 lipca 2026.
Rozmiar bazy
około 380 KB po całym turnieju.

Dane odczytane z produkcyjnej bazy 30.08.2026. Bez danych osobowych, same liczby zbiorcze.

Po co to powstało

Problem: typowanie w arkuszu szybko się rozsypuje

Typowanie wyników w gronie znajomych zwykle kończy się arkuszem kalkulacyjnym albo grupą na komunikatorze. Działa przez tydzień. Potem ktoś wpisze typ po meczu, ktoś inny pomyli kolumnę, a punkty trzeba liczyć ręcznie. Przy 104 meczach to kilkaset operacji.

Blokada po pierwszym gwizdku

Typ da się wpisać wyłącznie przed rozpoczęciem meczu. Brzmi banalnie, ale bez tego rywalizacja nie ma sensu, a żaden arkusz tego nie zapewni.

Punkty liczą się same

Wyniki pobierane są z zewnętrznego API piłkarskiego, a punkty przeliczają się automatycznie po każdym meczu. Przez cały turniej nie wpisałem ręcznie ani jednego rezultatu.

Ranking na żywo

Klasyfikacja, drabinka pucharowa, historia typów i podsumowanie sezonu. Ranking zmienia się po każdym meczu i to on utrzymuje ludzi przy zabawie do finału.

Jak to jest zbudowane

Stack i dlaczego akurat taki

Aplikacja ma 14 stron i działa jako jeden worker. Nie ma serwera, którym trzeba by administrować.

1

Aplikacja

Next.js z Prismą. Renderowanie po stronie serwera, żeby ranking ładował się od razu, bez czekania, aż przeglądarka doczyta dane.

2

Baza i pliki

D1 (SQLite Cloudflare) na dane, R2 na avatary. Baza po całym turnieju zajmuje 380 KB przy limicie 5 GB, więc jej koszt jest praktycznie zerowy.

3

Zadania cykliczne

Pobieranie wyników, przeliczanie punktów i przypomnienia chodzą jako harmonogram wewnątrz workera. Wcześniej były to trzy wpisy w systemowym crontabie na serwerze.

4

Powiadomienia

Maile idą przez HTTP API dostawcy poczty, a powiadomienia push przez Web Push. Push działa też na telefonie po dodaniu aplikacji do ekranu głównego.

Trudna część

Cztery rzeczy, które kosztowały najwięcej czasu

Opisuję każdą z przyczyną i rozwiązaniem.

1

Paczka miała 19 MB zamiast dozwolonych 10

Analiza zależności wciągała do paczki silniki bazodanowe dla Postgresa, MySQL-a, SQL Servera i CockroachDB, czyli sterowniki do baz, których ta aplikacja w ogóle nie używa. Po wykluczeniu niepotrzebnych plików paczka spadła z 19 151 KiB do 3 982 KiB, czyli do 39% limitu. Diagnoza zajęła kilka godzin, poprawka trzy linijki konfiguracji.

2

Plik konfiguracyjny nadpisywał produkcję

Lokalny plik z ustawieniami środowiskowymi trafiał do paczki wdrożeniowej i nadpisywał ustawienia produkcyjne. Logowanie zaczęło przekierowywać na adres lokalny. Objaw wyglądał na błąd uwierzytelniania, a przyczyna siedziała w procesie budowania. Dziś skrypt budujący kasuje te pliki z gotowej paczki.

3

Import danych wywalał się na powiązaniach

Przy przenoszeniu bazy import przerywał się na kluczach obcych, bo wiersze szły w kolejności alfabetycznej tabel, a baza sprawdza powiązania już w trakcie wczytywania. Zrzut musi być posortowany tak, żeby rekordy nadrzędne trafiały przed zależnymi. Szukałem tego godzinę, a rozwiązanie mieści się w jednym zdaniu.

4

Narzędzie potwierdzało mój własny błąd

Wgrywałem avatary do magazynu plików poleceniem, które domyślnie zapisuje pliki lokalnie zamiast w chmurze. Sprawdzenie „czy plik się wgrał” tym samym narzędziem odczytywało tę samą lokalną kopię i potwierdzało sukces. Błąd wyszedł dopiero jako brakujące avatary w działającej aplikacji. Od tamtej pory wynik sprawdzam w działającej aplikacji, innym narzędziem niż to, którym coś zrobiłem.

Migracja

Z własnego serwera na Cloudflare, 29 sierpnia 2026

Aplikacja przez cały turniej działała na VPS-ie za 17 zł netto miesięcznie. Po turnieju przeniosłem ją w całości na Cloudflare. Kilkanaście złotych oszczędności nie miało tu znaczenia. Chciałem przestać administrować serwerem: aktualizacje systemu, certyfikaty, kopie zapasowe, monitoring.

Co się zmieniło pod spodem

Baza z pliku SQLite na serwerze → D1. Avatary z dysku → R2. Maile z SMTP → HTTP API. Trzy wpisy w crontabie → harmonogram w workerze. Sama aplikacja została ta sama.

Ile to trwa dla użytkownika

Start workera 28 ms. Strona 0,8–1,4 s, logowanie zakończone w 0,64 s. Wcześniej odpowiadał jeden serwer w jednym miejscu, teraz odpowiada najbliższa lokalizacja sieci.

Jak sprawdziłem, że nic nie zginęło

Wszystkie 14 stron przetestowane po przełączeniu, komplet danych porównany co do wiersza, a 11 avatarów pobranych z działającej aplikacji i porównanych bajt w bajt z oryginałami. Pełna pętla resetu hasła sprawdzona na koncie tymczasowym.

Wnioski

Czego bym dziś nie zrobił tak samo

Nie stawiałbym tego na własnym serwerze. VPS wydawał się oczywistym wyborem, bo aplikacja ma bazę danych. W praktyce oznaczał kilka miesięcy administrowania maszyną, której jedynym zadaniem było utrzymanie jednej aplikacji dla dwudziestu kilku osób. Migracja zajęła kilka dni roboczych, czyli mniej, niż łącznie kosztowała opieka nad serwerem.

Zadania cykliczne odpalałbym rzadziej. Harmonogram chodzi co minutę, co daje ponad 43 tysiące uruchomień miesięcznie. W dniach meczowych ma to sens, poza nimi to marnotrawstwo, które przy kilku aplikacjach na jednym planie zacznie mieć znaczenie.

Wcześniej dołożyłbym logowanie awarii wysyłki. Przez długi czas nieudana wysyłka maila była całkowicie niema: kod łapał błąd i szedł dalej, więc nikt by się nie dowiedział, że powiadomienia przestały docierać. To najgroźniejszy rodzaj usterki, bo jej nie widać.

Co z tego wynika dla Ciebie

Dlaczego pokazuję akurat to

Jeśli zastanawiasz się nad zamówieniem aplikacji, z tego opisu wynikają cztery rzeczy.

1

To działało naprawdę

104 mecze rozliczone automatycznie i 27 osób korzystających z aplikacji w trakcie turnieju, od 11 czerwca do 19 lipca.

2

Znam koszty utrzymania

Potrafię powiedzieć, ile aplikacja kosztuje miesięcznie po wdrożeniu, bo sam za to płacę. To pytanie, na które wielu wykonawców odpowiada „to zależy”.

3

Umiem powiedzieć, co poszło źle

Na czterech opisanych wyżej pułapkach straciłem własny czas, przy własnym produkcie. Przy Twoim projekcie omijam je z marszu.

4

Można to mieć pod własną marką

Typer jest dostępny jako produkt white-label z Twoim logo, kolorami i adresem. Cennik jest na stronie Typera. Terminarz, wyniki i ranking mogą być też częścią aplikacji dla klubów sportowych.

FAQ

Częste pytania o ten projekt

Ile osób korzystało z Typera podczas MŚ 2026?
27 zarejestrowanych graczy i wszyscy typowali. Nie było ani jednego konta założonego i porzuconego. Średnio każdy wypełnił 91 typów przy 104 rozegranych meczach, czyli około 87% wszystkich możliwych.
Ile kosztuje utrzymanie takiej aplikacji miesięcznie?
Do 29 sierpnia 2026 był to VPS za 17 zł netto miesięcznie. Po migracji aplikacja działa na planie Cloudflare Workers Paid za 5 USD miesięcznie, który obsługuje jednocześnie kilka moich projektów. W przeliczeniu na jedną aplikację wychodzi ułamek poprzedniej kwoty. Baza zajmuje około 380 KB przy limicie 5 GB.
Na czym to jest zbudowane?
Next.js, Prisma, baza D1 (SQLite Cloudflare), pliki w R2, powiadomienia push przez Web Push, maile przez HTTP API Brevo, wyniki meczów z zewnętrznego API piłkarskiego. Całość działa jako jeden worker na Cloudflare, bez własnego serwera do administrowania.
Czy taki typer można postawić pod własną marką?
Tak, to standardowa usługa. Typer jest produktem white-label: działa pod logo, kolorami i adresem klienta. Szczegóły i cennik są na stronie Typera.
Dlaczego w case study są opisane popełnione błędy?
Z tej części najwięcej widać o wykonawcy. Ładny zrzut ekranu pokaże każdy. Mało kto napisze, że paczka wdrożeniowa miała 19 MB przy limicie 10 i dlaczego. Jeśli powierzasz mi projekt, dobrze wiedzieć, jak pracuję, gdy coś nie działa.
Kontakt

Masz pomysł na własną aplikację?

Napisz krótko, co miałaby robić. Pierwsza rozmowa i wstępna wycena są bezpłatne.

➕ Dodaj logo lub materiały (opcjonalnie)

Logo, zdjęcia, teksty albo przykłady rozwiązań, które Ci się podobają.

Do 3 plików, łącznie maksymalnie 2 MB. Formaty: PNG, JPG, WEBP, SVG, PDF, ZIP.

Odpiszę osobiście, zwykle w ciągu jednego dnia roboczego. Dane wykorzystam wyłącznie do kontaktu w tej sprawie. Szczegóły są w Polityce prywatności.