LeatherMaster
Website and a custom CMS for a leather upholstery restoration workshop. Customers book training courses and pay online, and the owner edits the content in the panel.
- Role
- Design, backend, frontend, deployment
- Year
- 2026
- Stack
- Laravel 13, Livewire 4, Tailwind CSS 4, MySQL, GitHub Actions, Cloudflare
BLIK
course payments through ING Pay
Passkey
panel sign-in, plus 2FA
250+
tests on every push
30 days
to restore deleted content

The brief
A workshop near Poznań needed a website that shows its services and before-and-after makeovers, takes training bookings with online payment, and can be edited without a developer.
What I did
All of it myself. I talked it through with the owner, designed the site, wrote the Laravel backend, the Blade and Tailwind front end and the Livewire panel, hooked up payments and set up CI/CD.
Details
Bookings and payments
One booking can hold several seats, with a name for each participant. The hold has a countdown and expires when it runs out, and once paid the customer gets an .ics file for their calendar. Company details fill in by themselves from the tax ID. They come from the Polish VAT registry and I cache them for 24 hours, because the API has a daily request limit.
Payments go through ING Pay, by BLIK or bank transfer. The webhook checks the signature, and a rejected or expired payment can be retried. The sandbox behaves differently from the docs in a few places, so I wrote that down in the README.
Panel
Deleted items stay in the panel's bin for 30 days and can be restored. Every record has a change history, screens can be found with ⌘K, and on a phone the menu sits in a bottom bar.

Security
The panel uses passkey and 2FA sign-in. I sign passkey handles with a separate secret so that rotating APP_KEY doesn't invalidate them.
SEO
The sitemap and structured data are generated automatically. When a page's address changes, the old one redirects to the new one with a 301, and a switched-off site answers with a 503 and a Retry-After header.
The result
The site is live at leathermaster.pl. The owner edits the content and adds training dates, and handles bookings in the panel without needing me.
A closer look

Training page. The next date, the price per person and the format. Customers book from here. 
Booking a date. Three steps, details, payment and confirmation. Company details fill in from the tax ID. 
Dashboard. After signing in, the owner sees the upcoming dates, free seats and whether the latest bookings are paid. 
Dates and bookings. A calendar of group and one-to-one dates. Any date can be hidden from the site with one switch. 
Editing a training. The description in an editor, an image with an adjustable crop, and ⌘S to save.
Bookings and payments
Seat booking for training courses and BLIK payments through ING Pay, with verified webhooks and payment retries.
Livewire 4 panel
Navigation without reloads, a ⌘K screen search, change history and a restorable bin.
Security
Passkey and 2FA sign-in, a Content Security Policy, rate-limited forms and Turnstile.
CI/CD
Tests and static analysis on every push, deploys versioned with CalVer and checked by a smoke test.
Got a similar project?
Tell me in a few sentences what you want to build.