LeatherMaster
Strona i własny panel CMS dla zakładu renowacji tapicerki skórzanej. Klienci zapisują się na szkolenia i płacą online, a właściciel sam zmienia treści w panelu.
- Rola
- Projekt, backend, frontend, wdrożenie
- Rok
- 2026
- Stack
- Laravel 13, Livewire 4, Tailwind CSS 4, MySQL, GitHub Actions, Cloudflare
BLIK
płatność za szkolenie przez ING Pay
Passkey
logowanie do panelu, do tego 2FA
250+
testów przy każdym pushu
30 dni
na przywrócenie usuniętej treści

Zadanie
Zakład z Dąbrówki pod Poznaniem potrzebował strony, która pokaże usługi i metamorfozy przed i po, przyjmie zapisy na szkolenia z płatnością online i da się edytować bez programisty.
Co zrobiłem
Wszystko sam. Rozmawiałem z właścicielem, zaprojektowałem stronę, napisałem backend w Laravelu, front w Blade i Tailwindzie oraz panel w Livewire, podpiąłem płatności i ustawiłem CI/CD.
Szczegóły
Zapisy i płatności
Jednym zapisem można zarezerwować kilka miejsc i podać nazwisko każdego uczestnika. Rezerwacja ma licznik czasu i po nim wygasa, a po opłaceniu klient dostaje plik .ics do kalendarza. Dane firmy wypełniają się same po wpisaniu NIP-u. Biorę je z białej listy VAT i trzymam w cache przez 24 godziny, bo API ma dzienny limit zapytań.
Płatności idą przez ING Pay, BLIK-iem albo przelewem. Webhook sprawdza podpis, a odrzuconą lub wygasłą płatność klient może ponowić. Sandbox w kilku miejscach zachowuje się inaczej, niż mówi dokumentacja, więc zapisałem to w README.
Panel
Usunięte rzeczy leżą w koszu panelu przez 30 dni i można je przywrócić. Każdy rekord ma historię zmian, ekrany wyszukuje się pod ⌘K, a na telefonie menu jest w dolnym pasku.

Bezpieczeństwo
Do panelu loguje się passkeyem i kodem 2FA. Identyfikatory passkeyów podpisuję osobnym sekretem, żeby zmiana APP_KEY ich nie unieważniła.
SEO
Sitemap i dane strukturalne generują się same. Gdy zmieni się adres podstrony, stary przekierowuje 301 na nowy, a wyłączona strona odpowiada 503 z nagłówkiem Retry-After.
Efekt
Strona działa pod adresem leathermaster.pl. Właściciel sam zmienia treści i dodaje terminy szkoleń, a zapisy obsługuje w panelu bez mojej pomocy.
Z bliska

Strona szkolenia. Najbliższy termin, cena za osobę i forma zajęć. Stąd klient przechodzi do zapisów. 
Zapis na termin. Trzy kroki, czyli dane, płatność i potwierdzenie. Dane firmy uzupełniają się po wpisaniu NIP-u. 
Pulpit. Po zalogowaniu właściciel widzi najbliższe terminy, wolne miejsca i to, czy ostatnie zapisy są opłacone. 
Terminy i zapisy. Kalendarz z terminami grupowymi i indywidualnymi. Każdy termin chowa się ze strony jednym przełącznikiem. 
Edycja szkolenia. Opis w edytorze, zdjęcie z ustawianym kadrem i zapis skrótem ⌘S.
Zapisy i płatności
Rezerwacja miejsc na szkolenia i płatność BLIK przez ING Pay, z weryfikacją webhooków i ponowieniem płatności.
Panel w Livewire 4
Przejścia bez przeładowań, wyszukiwarka ⌘K, historia zmian i kosz z przywracaniem.
Bezpieczeństwo
Logowanie passkey i 2FA, Content Security Policy, limity formularzy i Turnstile.
CI/CD
Testy i analiza statyczna przy każdym pushu, deploy z wersją CalVer i smoke testem.
Masz podobny projekt?
Napisz w kilku zdaniach, co chcesz zbudować.