· Szymon Berski · Portfolio · 9 min czytania
Katalog części i akcesoriów
Katalog części OEM do VW Polo 6R oparty na headless CMS. Frontend Astro SSG, Vue 3, backend Laravel REST API, panel Filament, tłumaczenia DeepL i opisy AI.

Katalog części i akcesoriów VW Polo 6R
Kompleksowy, wielojęzyczny katalog oryginalnych części OEM i akcesoriów do Volkswagena Polo 6R/6C, zbudowany w pełni oddzielonej architekturze headless. Statyczny frontend Astro pobiera dane z Laravel REST API w czasie budowania, generując czyste strony HTML bez zapytań do bazy danych w czasie działania. Choć nie jest to sklep internetowy, posiada wiele funkcji typowych dla e-commerce — listy produktów, filtrowanie, wyszukiwanie, szczegółowe specyfikacje — z wyjątkiem obsługi płatności.
Projekt przeszedł kilka iteracji: od wczesnego SPA w Vue 2, przez Vue 3, do obecnej konfiguracji Astro 6 SSG z wyspami Vue 3 dla interaktywnych komponentów.
Architektura: Headless CMS + Statyczny Frontend
System jest podzielony na dwa niezależne repozytoria:
Frontend (catalog.polo.blue) — statyczny generator Astro 6 z komponentami Vue 3, stylowaniem UnoCSS i własnym systemem designu. Wszystkie dane są pobierane z API wyłącznie podczas kroku budowania. Przeglądarka nigdy nie kontaktuje się bezpośrednio z backendem (z wyjątkiem narzędzi po stronie klienta, jak dekoder kodów PR).
Backend — aplikacja Laravel 13 serwująca REST API i panel administracyjny Filament 5. Zarządza produktami, kategoriami, tłumaczeniami, mediami, danymi SEO i wdrożeniami strony. Oparty na MySQL, Redis (kolejki przez Laravel Horizon do zadań w tle jak konwersja obrazów, tłumaczenia i buildy strony) i Cloudflare R2 jako storage CDN. Wdrożenia strony można uruchamiać bezpośrednio z panelu administracyjnego.
Ta separacja oznacza, że frontend jest czysto statyczną stroną — szybką, bezpieczną i globalnie cache’owalną przez Cloudflare CDN.
Pipeline obrazów i CDN
Kluczowym wyzwaniem była optymalizacja obrazów przy rozbudowanym katalogu produktów i przewadze ruchu mobilnego. Rozwiązanie ewoluowało od kompresji w czasie budowania przez Sharp/Astro do pipeline’u po stronie backendu:
- Upload — Obrazy są przechowywane na Cloudflare R2 (kompatybilnym z S3) przez Spatie Media Library
- Konwersja — Kolejki Laravel Horizon generują miniaturki w wielu rozmiarach w formatach AVIF i WebP
- Dostarczanie — Serwowane z dedykowanej subdomeny CDN ze zdenormalizowanymi URL-ami zapisanymi bezpośrednio na modelach Product/Category, eliminując zapytania JOIN w widokach list
- Monitoring — Widget CDN Stats w panelu administracyjnym śledzi całkowity storage, rozkład per model i procent produktów z kompletem konwersji
WebP służy jako fallback dla AVIF ze względu na jego wciąż ograniczone indeksowanie w Google Image Search.

Wielojęzyczność i automatyczne tłumaczenia
Katalog obsługuje trzy języki — angielski, polski i niemiecki. Cała tłumaczalna treść (produkty, kategorie, kolory, materiały, kody PR, wpisy FAQ i więcej) współdzieli jeden zunifikowany system tłumaczeń, więc dodanie nowego języka nie wymaga zmian w schemacie bazy.
- DeepL API automatycznie tłumaczy treść z angielskiego na polski i niemiecki przez zadania kolejkowane w tle
- Opisy generowane przez AI używają łańcucha fallbacków na wielu dostawcach LLM do generowania angielskiej treści, która jest następnie tłumaczona przez DeepL
- Struktury URL per język (
/dla EN,/pl/dla polskiego,/de/dla niemieckiego) z prawidłowo skonfigurowanymi tagamihreflang - Statyczne napisy UI ładowane z plików JSON, tłumaczenia treści serwowane już zlokalizowane przez API
Optymalizacja wydajności
System podzielonego budowania
Budowanie wszystkich trzech lokalizacji w jednym przebiegu Astro powodowało wyczerpanie pamięci (10-20 GB RAM). Rozwiązanie: własny skrypt split build przetwarzający jedną lokalizację na raz, uruchamiający indeksowanie Pagefind per lokalizacja, a następnie łączący wszystko w końcowy katalog dist/. Całkowity czas budowania: ~5-6 minut dla wszystkich lokalizacji.
Redukcja zapytań API
Cache prefetch kategorii pobiera wszystkie produkty per główna kategoria w pojedynczym zapytaniu API, następnie filtruje lokalnie. Zredukowało to ~60 indywidualnych zapytań API do kilku wywołań wsadowych podczas budowania.
Wydajność frontendu
content-visibility: autona elementach produktów poza ekranem, redukując koszt renderowania- Stan zwinięcia sidebara przywracany z
localStorageprzed pierwszym renderowaniem, zapobiegając CLS - Preloading czcionek (czcionki marki VW), preconnect do CDN i domen analitycznych
- Ręczne chunki Vite oddzielające kod vendora (Vue, design system) od kodu stron
- Pierwsze 3 obrazy produktów ładowane natychmiast, z
fetchpriority="high"na pierwszym obrazie; reszta leniwie
SEO i odkrywalność
Silne SEO jest głównym źródłem ruchu, szczególnie z wyszukiwarek grafiki. Kluczowe strategie:
- Dane strukturalne (JSON-LD) — Rozbudowany markup
@graphzIndividualProduct(nieProduct, aby sygnalizować katalog nie-handlowy),BreadcrumbList,ItemListdla stron kategorii i encjeOrganization - Mapy witryny XML — Generowane po stronie serwera per lokalizacja i typ (produkty, kategorie, strony), pobierane w czasie budowania z arkuszami stylów XSL do wyświetlania w przeglądarce
- llms.txt — Pliki odkrywalności AI/LLM zgodne ze specyfikacją llmstxt.org
- Linkowanie wewnętrzne — Powiązane produkty, podobne produkty i przyciski nawigacji w kategorii (zwalidowane testami A/B) poprawiają przepływ linków i użytkowników
- Pagefind — Offline’owe wyszukiwanie pełnotekstowe indeksowane per lokalizacja, bez zewnętrznych zależności
- Dashboard SEO — Widgety panelu administracyjnego audytują krótkie/długie tytuły, brakujące opisy i kompletność danych we wszystkich trzech językach
Interaktywne narzędzia
Trzy narzędzia Vue 3 po stronie klienta wzbogacają użyteczność katalogu:
- Kalkulator opon i felg — Porównuje dwie konfiguracje opon/felg, oblicza różnice średnicy i odchylenie prędkościomierza, z wizualizacją SVG
- Przelicznik mocy — Konwertuje między KM, kW i PS z wizualnym wykresem słupkowym
- Dekoder kodów PR — Dekoduje fabryczne kody opcji VW (3-znakowe) odpytując API, z cache’owaniem po stronie klienta
Narzędzia te są wyizolowane w osobnej trasie Astro, aby ich CSS (~25 KB) nie wpływał na główne strony katalogu.
Backend i panel administracyjny
Backend oparty na Laravel 13 i Filament 5 dostarcza REST API i zapewnia kompleksowy panel administracyjny zorganizowany w funkcjonalne klastry:
Zarządzanie treścią
- Zarządzanie produktami ze szczegółowymi specyfikacjami, kodami PR, kompatybilnością silników i obsługą wielu języków
- Hierarchiczna organizacja kategorii z zarządzaniem ikonami i obrazami OG
- Kreator stron CMS z 13 typami bloków (hero, jumbotron, karuzela, CTA, FAQ, statystyki itp.)
- Zarządzanie tłumaczeniami z automatyzacją wsadową DeepL i flagami ochrony dla krytycznych tłumaczeń
REST API
API używa konfigurowalnych presetów odpowiedzi kontrolujących głębokość dołączanych danych per endpoint — utrzymując lekkie odpowiedzi dla list i bogate dla widoków szczegółowych. Nagłówki cache HTTP są dostrajane per trasa, aby zmaksymalizować trafienia CDN.
Dashboardy analityki i monitoringu
- Google Analytics 4 — Odsłony, odwiedzający, sesje, urządzenia, top referrerzy, dane geograficzne (14 widgetów)
- Google Search Console — Kliknięcia, wyświetlenia, CTR, średnia pozycja, top strony i zapytania
- Core Web Vitals — Śledzenie szeregu czasowego CLS, LCP, INP
- Google AdSense — Śledzenie przychodów z wielu stron z alertami o spadkach
Operacje i utrzymanie
- Wdrażanie strony jednym kliknięciem uruchamiające buildy Astro przez zadania kolejkowane (osobna kolejka
site-build, aby nie blokować zadań tłumaczeń/mediów) - Czyszczenie cache Cloudflare według URL, prefiksu lub typu modelu
- Narzędzia backup/przywracania bazy danych
- Logowanie aktywności i pełna ścieżka audytu
- Dashboard kompletności danych audytujący brakujące media, tłumaczenia, opisy i jakość linków
Redirects i odzyskiwanie ruchu 404
Autorski moduł redirectów wbudowany w panel Filament zamienia obsługę błędów 404 z ręcznej roboty w proces oparty na danych:
- Import CSV z raportów GSC i Ahrefs — adresy są wrzucane hurtowo ze znacznikiem źródła na każdym wpisie (
gsc_404,ahrefs_404,manual,import), więc redakcja priorytyzuje po realnym wpływie na ruch zamiast zgadywać - Kontekst GSC zachowany per redirect — kliki, wyświetlenia oraz daty pierwszej i ostatniej detekcji są przypisane do wiersza i widoczne na liście — od razu widać, które 404 faktycznie kosztowały ruch organiczny
- Automatyczne rozwiązywanie błędów crawlowania — utworzenie redirectu automatycznie oznacza pasujące nierozwiązane wpisy
GscCrawlErrorjako rozwiązane i linkuje je do ID redirectu, z zalogowanym userem i znacznikiem czasu - Zabezpieczenie przed self-redirectami — model rzuca wyjątek przy zapisie, jeśli
old_url === new_urlpo normalizacji ścieżki (wielkość liter jest zachowana, ponieważ URL-e typu/6R0601025AEZ49/vs/6r0601025aez49/są różnymi adresami) — nieskończone pętle są wyłapywane przed wejściem na produkcję - Wzorce regex, soft deletes, pełen audit trail przez Spatie Activitylog, obsługa 301/302/307/308 oraz
hit_countilast_hit_atwskazujące stare redirecty bezpieczne do usunięcia
Komentarze z WordPressa — powiadomienia i odpowiedzi
Blog polo.blue działa na headless WordPressie, ale jego komentarze są moderowane w całości z panelu Filament — administratorzy nie muszą już otwierać wp-admin, żeby obsłużyć codzienny strumień:
- Dwukierunkowa synchronizacja z WP REST API —
WordPressCommentSyncpobiera przyrostowo nowe oczekujące i zatwierdzone komentarze (cursor w cache’u z jednominutowym nakładaniem, żeby zabezpieczyć się przed różnicą zegarów między WP a panelem) i wypycha akcje moderacyjne z powrotem przez/wp-json/wp/v2/comments - Pełna moderacja z poziomu panelu — zatwierdzanie, oznaczanie jako spam, wyrzucanie do kosza i odpowiadanie — wszystko bez opuszczania Filamenta. Odpowiedzi są publikowane z powrotem do WP jako komentarze dzieci, automatycznie zatwierdzane i przypięte do rodzica (
wp_reply_id,replied_by_user_id,replied_at), więc zawsze widać, kto i kiedy odpowiedział - Powiadomienia push przy nowych oczekujących komentarzach — administratorzy dostają notyfikację (tytuł + autor + tytuł wpisu, z deep linkiem do
/admin/blog-comments), więc żaden komentarz nie czeka na ręczne sprawdzeniewp-admin - Świadomość wielojęzyczności — każdy komentarz dziedziczy język wpisu źródłowego (EN/PL — blog prowadzony jest w dwóch językach), dzięki czemu można go filtrować per locale w widoku listy
- Metadane wpisu cache’owane — tytuły i permalinki są rozwiązywane raz per batch i reużywane dla kolejnych komentarzy, eliminując zbędne zapytania do WP REST w trakcie synchronizacji
- Awaryjna furtka — każdy wiersz wystawia
wpAdminUrl()jako bezpośredni skok do WP admin edit, na wypadek rzadkich sytuacji wymagających natywnego interfejsu
Baza wiedzy FAQ
Katalog zawiera zintegrowany system FAQ dostarczający specyfikacje techniczne i poradniki dla VW Polo 6R. Treść jest zorganizowana według kategorii produktów (opony, felgi, olej silnikowy, klimatyzacja, hamulce, zawieszenie, części karoserii) i obsługuje wielojęzyczne wyświetlanie z linkami do szczegółowych wpisów na blogu.
Wdrażanie
Frontend używa strategii wdrażania atomowego:
- Push do
mainuruchamia GitHub Actions - Split build Astro wykonywany na serwerze hostingowym
- Każde wydanie trafia do katalogu ze znacznikiem czasu;
public_htmlto symlink - Rollback trwa poniżej 1 sekundy przez przepięcie symlinka na poprzednie wydanie
Wykorzystane technologie
Astro
Statyczny generator z częściową hydratacją — ładuje JavaScript tylko dla interaktywnych wysp Vue. System podzielonego budowania obsługuje 3 lokalizacje bez wyczerpania pamięci.
Vue.js
Napędza interaktywne komponenty: galerie produktów ze Swiperem, kalkulator opon, przelicznik mocy, dekoder kodów PR i pasek detekcji języka.
Laravel
Backend REST API z konfigurowalnymi presetami odpowiedzi, zadaniami kolejkowanymi przez Horizon i storage Cloudflare R2. Serwuje dane w czasie budowania i obsługuje zapytania w runtime.
FilamentPHP
Panel administracyjny z 19+ zasobami i 36+ widgetami zorganizowanymi w klastry: treść, lokalizacja, analityka (GA4, GSC, Web Vitals, AdSense) i utrzymanie (deploy, cache, backupy).
UnoCSS
Atomowy silnik CSS ze współdzieloną konfiguracją eksportowaną z własnego systemu designu, zapewniający spójne stylowanie we wszystkich projektach.
Progressive Web App (PWA)
Instalowalna aplikacja z service workerem Workbox, strategią NetworkFirst dla stron (3s timeout), manifestami per lokalizacja i automatycznymi aktualizacjami w tle.
Cloudflare
Globalne CDN dla zasobów statycznych, storage R2 dla obrazów produktów (AVIF/WebP), ochrona DDoS i czyszczenie cache kontrolowane z panelu administracyjnego.
Pagefind
Offline'owe wyszukiwanie pełnotekstowe budowane per lokalizacja w czasie kompilacji. Bez zewnętrznego serwisu wyszukiwania — cały indeks żyje w statycznych plikach obok HTML.
DeepL i AI
Zautomatyzowany pipeline tłumaczeń (EN → PL, DE) przez DeepL API. Opisy producentów generowane przez AI z łańcuchem fallbacków na wielu dostawcach LLM.
Google Tag Manager
Zarządza Analytics 4, AdSense i raportowaniem Web Vitals. Zdarzenia GTM dataLayer śledzą wyświetlenia produktów, nawigację po kategoriach i Core Web Vitals z atrybucją.
Silne SEO, optymalizacja obrazów i dane strukturalne przyciągają znaczący ruch organiczny — szczególnie z wyszukiwarek grafiki — podczas gdy architektura headless utrzymuje stronę szybką, bezpieczną i łatwą w utrzymaniu.









