Polyarix 5.0

Редизайн сайту нашої компанії: статичний фронт на Astro, headless-CMS на Laravel і SEO-архітектура без компромісів

Corporate websiteFigmaTypeScriptAstrothree.jsLaravel
Клієнт
Polyarix - наш власний сайт
Завдання
Повний редизайн: дизайн-система, фронтенд, CMS, SEO
Терміни
3 місяці
Рік
2026

Власний сайт - найвимогливіший проєкт: замовник прискіпливий, дедлайнів немає, а результат бачать усі. Це чесна історія про те, як сайт нашої компанії пройшов шлях від WordPress через Laravel до зв’язки «статичний фронт на Astro + headless-CMS на Laravel» - і чому нова версія завантажується миттєво, живе чотирма мовами й перезбирає себе сама після кожної зміни в адмінці.

Життя перше: WordPress (2013-2022)

Історія сайту тягнеться з 2013 року, і всі перші версії жили на WordPress. Це не був «сайт із шаблону»: унікальна тема, написана під нас, ефекти на three.js, кастомні поля на ACF, мультимовність. За ці роки сайт пережив кілька редизайнів - змінювався зовнішній вигляд, але платформа лишалася тією самою. Мови теж додавалися поступово: до 2020 року сайт жив двома, потім їх стало три.

І WordPress чесно робив свою роботу. Якщо щось і вимагало постійної уваги - то це безпека: WordPress - найпопулярніша CMS у світі, а отже й найбільш атакована, тому ядро і плагіни треба патчити без пауз.

З часом накопичилося й інше спостереження: сайт із важкою 3D-графікою та кількома мовами впирався в архітектуру універсальної CMS. Усе працювало, але ми хотіли не «працює» - ми шукали максимально зручне і швидке рішення. Для компанії, яка робить сайти клієнтам, власний сайт - це ще й полігон: на ньому ми обкатуємо підходи, перш ніж пропонувати їх іншим.

Життя друге: Laravel (2022-2026)

У 2022 році ми перенесли сайт на Laravel - фреймворк, на якому будуємо більшість клієнтських проєктів. Класичний моноліт: Laravel збирає сторінки на сервері, контент у базі даних, власна адмінка.

  • Повний контроль над кодом: будь-яка функція - це питання розробки, а не пошуку відповідного плагіна.
  • Порядок у даних: проєкти, статті, відгуки, вакансії й технології стали повноцінними сутностями в базі зі своїми полями та зв’язками.
  • Спокійніше з безпекою: Laravel з коробки закриває цілі класи атак, а поверхня атаки помітно менша, ніж у CMS із десятками сторонніх плагінів.

Ця версія відпрацювала чотири роки. Але до 2026-го ми знову захотіли більшого.

Laravel-версія сайту Polyarix (2022-2026): світлий hero з градієнтом

Чому вирішили будувати третю версію

Дизайн час було оновлювати: ринок пішов у бік легких, повітряних, анімованих сайтів. Серверний рендеринг надлишковий для вітрини: контент змінюється кілька разів на тиждень, а сервер збирав кожну сторінку заново на кожен візит. І виросли SEO-амбіції: ми хотіли ідеальну технічну базу.

Що ввійшло в редизайн:

  • Дизайн-система і живий UI-kit
  • Статичний фронтенд на Astro
  • Headless-CMS на Laravel + Backpack
  • SEO-архітектура і структуровані дані
  • Автотести та CI/CD
  • Автоматична перезбірка після змін контенту

Дизайн: спершу система, потім сторінки

Нову версію почали не з коду, а з дизайну. Референс за настроєм - легкі «дихаючі» сайти з широкою сіткою: ми обрали контейнер 1520 пікселів замість звичних 1140-1200, щоб роботам і типографіці було просторо. Фірмові константи бренду зберегли: логотип, фірмовий синій, шрифт Gotham Pro. Додали акцентну палітру - фіолетовий, помаранчевий, м’ятний, персиковий.

Важливе архітектурне рішення: дизайн-система існує не у вигляді PDF-гайдлайна, а як жива сторінка просто всередині сайту. Це внутрішній UI-kit, який рендерить реальні токени й компоненти з продакшен-коду: палітру, типографічну шкалу, відступи, радіуси, кнопки, картки, форми, акордеони. Дизайн і код не можуть роз’їхатися: якщо токен змінився в CSS - він змінився і в гайдлайні. У прод ця сторінка не потрапляє.

Усі токени живуть в одному CSS-файлі як custom properties:

:root {
  --c-blue: #0204f5;
  --c-purple: #b535fc;
  --c-orange: #ff642c;
  --c-mint: #85f4c4;
  /* ...типографічна шкала, відступи, радіуси, тіні, easing-функції */
}

Один файл - єдине джерело правди для всього візуалу на кожній із сотень сторінок.

Жива дизайн-система Polyarix: сторінка всередині сайту з реальними токенами

Стек: що обрали й навіщо

  • Astro - фреймворк фронтенду. Збирає сторінки в готовий HTML заздалегідь і за замовчуванням відправляє відвідувачу нуль кілобайтів JavaScript. Для порівняння: типовий сайт на React несе 100-300 КБ скриптів лише щоб «завестися».
  • Vite - збирач, на якому Astro працює під капотом: миттєвий дев-сервер і агресивна оптимізація продакшен-коду.
  • TypeScript - кожна сутність контенту описана типом, і якщо API поверне не те, що чекає шаблон, - помилка спливе на збірці, а не у відвідувача.
  • three.js - 3D-графіка для анімації на головній. Використовуємо «голим», без обв’язок: менше коду, вищий FPS.
  • sanitize-html - фільтр для HTML з адмінки: контент із CMS фізично не може принести на сторінку вразливість.
  • sharp - обробка зображень на етапі збірки.
  • Laravel + Backpack CRUD - контент-API й адмінка: описуєш сутність - отримуєш готовий інтерфейс зі списками, фільтрами і правами доступу.
  • Cloudflare Pages - хостинг статики в CDN-мережі: відвідувач із Варшави, Києва чи Нью-Йорка отримує сайт із найближчої точки.
  • GitHub Actions - CI/CD: кожна зміна проганяється через тести й деплоїться автоматично.
  • Sentry - моніторинг помилок з обох боків: ми дізнаємося про проблему раніше, ніж відвідувач напише в підтримку.

Фронтенд на Astro: як це влаштовано

Ключова ідея: сайт-вітрина має бути статикою. Браузер отримує готовий HTML із найближчого CDN-сервера - рендерити нічого, чекати нічого. Пошуковий робот бачить повністю готову сторінку, а не порожній контейнер, який «колись домалює JavaScript». У статичних файлів немає бази даних і сесій - атакувати в буквальному сенсі нічого.

Уся збірка - 119 сторінок чотирма мовами приблизно за 2,5 секунди. І це лише старт: сторінки активно додаються - блог, посадкові під послуги, нові кейси.

«Нуль JS за замовчуванням» не означає «нудно». Анімації є, але кожна підключається точково: «signal field» на головній вантажиться ліниво і зупиняється поза екраном; halftone-портрети у відгуках раструються просто в браузері; поява блоків на скролі й лічильники - вручну на IntersectionObserver, без жодної бібліотеки.

Показовий приклад - головна. Спершу ми інтегрували ефектну 3D-кулю зі скла: React, фізичний рушій, 3D-модель. Красиво, але важко - мегабайти коду і WebAssembly-фізика. Замінили її на «signal field»: чистий three.js без React і фізики. Візуально майже не програли, а у вазі та плавності виграли в рази. Іноді правильне інженерне рішення - вчасно відмовитися від красивого, але дорогого.

Окремо про мови: сайт живе англійською, російською, українською та польською - чотири мови вперше за всю історію проєкту. Кожна сторінка існує в чотирьох версіях із правильними URL, і всі вони збираються з одного набору компонентів - змінюються лише словники перекладів і контент із CMS.

Headless CMS: Laravel лишається, але змінює роль

У класичній CMS адмінка і сайт - одне ціле: система і зберігає контент, і малює сторінки. У headless-підході CMS «обезголовлена»: вона лише зберігає контент і віддає його по API - у форматі JSON. А малює сторінки хтось інший - у нашому випадку Astro.

Ми не стали викидати напрацювання другої версії: Laravel-бекенд лишився, але змінив професію - із «сервера, що рендерить сайт» перетворився на контент-API й адмінку на Backpack. У ній живуть десять типів контенту: сторінки, статті, автори, проєкти, відгуки, клієнти, послуги, технології, вакансії та налаштування сайту.

API віддає перекладні поля мапою всіх локалей із фолбеком (якщо польський текст не написаний - покажеться англійський), приховує чернетки, кешується і відповідає лише довіреним доменам фронтенду.

Контент складних сторінок - кейсів і послуг - це не «простирадло» тексту, а масив типізованих блоків: факти, текст, колонки, зображення, галерея, слайдер, кроки, FAQ, заклик до дії. Редактор збирає сторінку з блоків, як із конструктора, а на боці Astro один спільний рендерер перетворює кожен тип на свій компонент:

{blocks.map((block) => {
  switch (block.type) {
    case 'facts':   return <FactsGrid {...block} />;
    case 'gallery': return <Gallery images={block.images} />;
    case 'steps':   return <StepsTimeline {...block} />;
    case 'cta':     return <CtaBanner {...block} />;
    /* ...text, columns, image, slider, faq */
  }
})}

Контент-менеджер отримує свободу верстки, але не може зламати дизайн: кожен блок рендериться строго за дизайн-системою. А весь HTML з адмінки проганяється через санітайзер: вичищаються потенційно небезпечні теги й навіть вирівнюється ієрархія заголовків - щоб редактор фізично не міг зіпсувати SEO-структуру сторінки. До речі, цю сторінку ви читаєте саме з таких блоків.

Адмінка Backpack: списки контенту, фільтри та SEO-поля

Як статичний сайт лишається «живим»

  1. Менеджер зберігає запис в адмінці
  2. Laravel помічає зміну і зводить прапорець «потрібна перезбірка» (серія змін схлопується в один запуск)
  3. Laravel смикає deploy hook Cloudflare Pages
  4. Cloudflare збирає свіжий сайт із GitHub і контенту API - за пару хвилин усі сторінки всіма мовами оновлені по всьому світу

Від зміни в адмінці до оновлення на продакшені минає 3-4 хвилини, без участі розробника. На випадок, коли чекати не хочеться, в адмінці є кнопка «Перезібрати сайт». Це і є архітектура JAMstack: швидкість і невразливість статики плюс зручність звичайної CMS.

Деталь для надійності: знімки API-відповідей закомічені в репозиторій фронтенду. Сайт можна зібрати й протестувати взагалі без бекенда, а спеціальна перевірка звіряє структуру знімків із живим API - про зміну формату ми дізнаємося з перевірки, а не зі зламаного продакшену.

Cloudflare Pages: автоматична збірка сайту після зміни контенту

SEO як частина архітектури

SEO для цього проєкту було вимогою номер один до архітектури - ми закладали його від самого початку.

  • Миттєва віддача HTML: статика з CDN дає найкращі Core Web Vitals - немає сервера, який «думає», і немає JS-рендерингу, який пошуковику довелося б виконувати.
  • Рівно один h1 на кожній сторінці й без пропусків рівнів заголовків - це гарантовано навіть для контенту з CMS.
  • Canonical, title і description - по одному на сторінку, для кожної зі 119.
  • Мультимовне SEO: кожна сторінка оголошує свої мовні версії через hreflang, а карта сайту генерується автоматично з усіма зв’язками.
  • Структуровані дані: граф Schema.org на кожній сторінці - Organization, WebSite, WebPage, плюс Article, JobPosting, FAQPage, Service, BreadcrumbList, Person. Із цього Google збирає розширені сніпети.
  • Чесні 404: без спеціального файлу Cloudflare Pages віддає на неіснуючі URL головну з кодом 200 (soft-404, за який пошуковики карають) - ми впіймали це на аудиті й полагодили.
  • Жодних посилань сторінки на саму себе: логотип на головній, активний пункт меню і поточна мова - не посилання. Гігієна посилального графа, яку майже ніхто не робить.

І головне: усе перелічене перевіряється автоматично. Власний скрипт-аудитор проганяється по всіх зібраних сторінках, і SEO-регресія не проникне на сайт непоміченою - нуль зауважень або збірка не їде в прод.

Форми і тести

Статика статикою, але заявки приймати треба. Форми відправляються напряму в Laravel API: валідація на сервері, захист від спаму, резюме - у приватне сховище, а кожна заявка фіксує сторінку й мову користувача.

Бекенд покритий набором із 72 автотестів: контракт API (усі локалі на місці, чернетки приховані), CORS, форми, перезбірка, імпорт контенту. Деплой фізично неможливий, поки хоч один тест червоний. На фронтенді свої вартові: структурний SEO-аудит усіх сторінок і перевірка контракту з API. Помилки продакшену ловить Sentry з обох боків.

Повна вага головної сторінки

Laravel-версія (2022-2026)
3149 КБ
Polyarix 5.0 (Astro)
624 КБ

Медіана трьох замірів однією мережею: повне завантаження головної з усіма ресурсами, десктоп, липень 2026.

Час повного завантаження головної

Laravel-версія (2022-2026)
1460 мс
Polyarix 5.0 (Astro)
276 мс

Той самий замір: від запиту до події load. У нової версії майже вся вага - лінива 3D-анімація, яка не блокує завантаження.

Результати в цифрах
ПоказникЗначення
Сторінок на старті119 × готовий HTML - і каталог активно росте
Мов4 (EN / RU / UK / PL)
Час збірки всього сайту~2,5 секунди
JS на типовій сторінці~0 КБ: інтерактив вантажиться ліниво й точково
Від зміни в адмінці до продакшену3-4 хвилини, автоматично
Автотестів на бекенді72
Зауважень SEO-аудиту0 на всіх сторінках
PageSpeed (мобільні)продуктивність 94 · доступність 95 · найкращі практики 100

Хочете такі самі результати?

Обговорімо проєкт

Розкажіть про задачу — відповімо протягом одного робочого дня.

Що вам потрібно?
Бюджет

Дякуємо!

Заявку отримано. Відповімо протягом одного робочого дня.