Brief
What the client wanted
- A fast website that feels as premium as the salon
- Online booking that offers only genuinely free time slots
- Keep the client accounts and the appointment history from the old system
- An overview of appointments for staff and for the salon manager
- Working forms, a price list and better visibility in Google and in AI
Challenge
What the client came with
Runway is a beauty salon in the Staré Mesto district of Bratislava that has offered hairdressing, cosmetics, manicures, pedicures and waxing under one roof since 2017. The original website ran on WordPress with the Amelia booking module and later as a set of static HTML pages.
Every page downloaded a Tailwind script of about 4 MB from an outside server, which put the site's look together only in the visitor's browser. The homepage came to around 2,7 MB in total, photos were 500 to 830 kB and had no set dimensions, so the content shifted while it loaded.
The contact form only opened the visitor's e-mail program, the site map (sitemap), the robots.txt file and the 404 error page were all missing, and the “Booking” buttons led to an address that no longer existed. The header and footer were copied into every file and looked slightly different on every page.
At the same time, the salon did not want to lose anything it already had: the client accounts, the appointment history or the bookings the team saw in the Amelia admin.
Solution
What we did and why
A new foundation without the clutter. We rewrote the website in PHP 8.4 with shared templates: the header, the menu and the footer live in one place, so they look the same everywhere. Tailwind CSS is compiled in advance and only what the pages actually use goes to the browser.
Fast images. We converted the photos to the modern AVIF and WebP formats in several sizes for phone, tablet and desktop. The main homepage photo dropped from 828 kB to 41 kB and every image has set dimensions, so the page does not shift while it loads.
Online booking in 4 steps. The client picks a category, a treatment, a staff member and a free time slot. The system offers only a time that fits everything at once: the salon's opening hours, that colleague's working hours, her vacation, slots that are already taken, the length of the treatment and a minimum lead time of 2 hours. A three and a half hour highlights appointment can therefore be booked for 16:30 at the latest.
Client area and appointment management. Once logged in, a customer sees her appointments and the price list, and a staff member sees her upcoming appointments. The manager has a calendar of all appointments by day, week and month, and can add an appointment, move it to a colleague, cancel it with an e-mail to the client or block time for lunch or training.
A smooth move from the old system. We moved the client accounts over from Amelia and new bookings are written back into it, so the salon lost neither its history nor its overview. Anyone who booked before simply enters their e-mail and their login password arrives automatically.
Ready for Google and for AI. The website has a sitemap, robots.txt, structured data (a machine readable description of the salon for search engines), an llms.txt file with a summary for AI search engines and WebMCP tools that let an AI assistant in the browser look up a treatment, a price or the opening hours. It never books an appointment on its own, though: a person always confirms that.
Security and readability. Forms are protected by a CSRF token (protection against forged submissions) and a hidden bot trap, passwords are stored only as a secure hash and logins have a limit on attempts. We tuned the colors so that all text meets WCAG 2.1 AA contrast (the accessibility standard), including text over photos.
Delivery
What the client got
- A custom website in PHP 8.4 with shared templates
- Online booking in 4 steps that works out the free time slots
- A client area for both customers and staff
- Appointment management with a calendar and time blocking
- A treatment price list from the database that you change in one place
- Contact and complaint forms with spam protection
- Images in AVIF and WebP formats with set dimensions
- A sitemap, robots.txt, a custom 404 page and structured data
- llms.txt and WebMCP tools for AI assistants
- Text contrast to WCAG 2.1 AA
Results
What you can verify
We measured the size of both CSS files (24,3 kB + 17,7 kB) and the server response on 9/19/2026 at www.rnw.sk from our own connection. The homepage transfer, the photo sizes and the contrast come from the project's technical documentation.
Process
How the project ran (about 3 weeks)
-
Analysis of the original website
We went through the WordPress site, the static HTML and the data from the Amelia booking module and wrote down what had to be kept and what did not work.
-
A new foundation for the website
A rewrite in PHP 8.4, shared templates, compiled Tailwind CSS, working forms, a sitemap, robots.txt and a 404 page.
-
Accounts and database
Customer and staff accounts, a price list for five treatment categories, migration of users from Amelia, login and password recovery.
-
Online booking
Working out free time slots from opening hours, schedules, vacations and existing bookings, and writing the booking back into Amelia.
-
Appointment management
A list and calendar of appointments for the manager, rescheduling, cancellation, internal notes and time blocking.
-
Speed, accessibility and AI
Image optimization, WCAG 2.1 AA contrast, structured data, llms.txt and WebMCP tools.
Technologies
What it runs on
- PHP 8.4
- a modern programming language that runs both the website and the bookings
- Tailwind CSS
- styles compiled in advance, so only what the site uses goes to the browser
- MySQL
- a database of accounts, prices and appointments
- AVIF and WebP
- modern image formats: smaller files at the same quality
- WebMCP
- a new standard that lets an AI assistant in the browser use the site's functions
- llms.txt
- a short summary of the website for AI search engines such as ChatGPT or Perplexity
Gallery
Examples
(opens the full size image in a new window)
(opens the full size image in a new window)