Skip to content
Adrian Nita
All projects

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

LeatherMaster homepage: hero with the leather restoration offer and a contact button

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.

LeatherMaster panel dashboard: upcoming training dates with booked seats and recent bookings with payment status (sample data)

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.

  • 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.