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

To nie jest opis wdrożenia u klienta, tylko mojego własnego produktu — dlatego mogę pokazać wszystko: prawdziwe 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 — i 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 — 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 zawsze 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. To brzmi banalnie, ale jest jedyną rzeczą, która sprawia, że rywalizacja ma sens — i pierwszą, której nie zapewni żaden arkusz.

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. To ranking, nie tabela — i to on utrzymuje ludzi przy zabawie do finału.

Jak to jest zbudowane

Stack i dlaczego akurat taki

14 stron aplikacji, jeden worker, zero serwerów do administrowania.

1

Aplikacja

Next.js z Prismą. Renderowanie po stronie serwera, żeby ranking ładował się od razu, a nie po doczytaniu danych w przeglądarce.

2

Baza i pliki

D1 (SQLite Cloudflare) na dane, R2 na avatary. Baza po całym turnieju zajmuje 380 KB przy limicie 5 GB — to skala, w której koszt bazy praktycznie nie istnieje.

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 przez HTTP API dostawcy poczty, powiadomienia push przez Web Push — działają też na telefonie po dodaniu aplikacji do ekranu głównego.

Trudna część

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

To najbardziej użyteczny fragment tego opisu. Ładny zrzut ekranu pokaże każdy — o tym, co poszło nie tak, mało kto pisze.

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. Godzina szukania, jedno zdanie rozwiązania.

4

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

Wgrywałem avatary do magazynu plików poleceniem, które domyślnie zapisuje lokalnie, nie do chmury. 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. Wniosek, który stosuję od tamtej pory: weryfikuj przez aplikację, nie przez narzędzie, którym właśnie coś zrobiłeś.

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 — nie dla oszczędności kilkunastu złotych, tylko żeby 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 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.

Uczciwie

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 — 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 jest czystym marnotrawstwem — i 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 — taki, którego nie widać.

Co z tego wynika dla Ciebie

Dlaczego pokazuję akurat to

Jeśli zastanawiasz się nad zamówieniem aplikacji, ten opis mówi o wykonawcy więcej niż portfolio z ładnymi obrazkami.

1

To działało naprawdę

Nie makieta ani projekt koncepcyjny — 104 mecze rozliczone automatycznie i 27 osób korzystających z aplikacji przez sześć tygodni.

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

Cztery opisane wyżej pułapki kosztowały mnie czas, a nie klienta. 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.

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, które założono i porzucono. Ś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?
Bo to jedyna część, która naprawdę coś mówi o wykonawcy. Każdy pokaże ładny zrzut ekranu; niewielu napisze, że paczka wdrożeniowa miała 19 MB zamiast 10 i dlaczego. Jeśli powierza mi się projekt, warto wiedzieć, jak pracuję, gdy coś nie działa.
Kontakt

Masz pomysł na własną aplikację?

Napisz krótko, co miałaby robić — odpowiem osobiście, zwykle w ciągu jednego dnia roboczego. 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 — więcej w Polityce prywatności.