Strona nie działa? Zadzwoń.

Tworzenie Stron Rzeszów to marka firmy Prownex IT Services Sp. z o.o. (NIP 8161717256). Tworzymy strony internetowe i sklepy dla małych i średnich firm z Rzeszowa i okolic, utrzymujemy je na własnym hostingu prowde All Inclusive oraz naprawiamy, zabezpieczamy i przenosimy istniejące strony WordPress.

Wynik 100 w PageSpeed Insights: jak zbudowaliśmy naszą stronę

Nasza strona ma w PageSpeed Insights 100 punktów we wszystkich czterech kategoriach, na komputerze i na telefonie (raport z 03.11.2026), mimo filmu w nagłówku, animacji i trzech krojów pisma. Opisujemy, co zrobiliśmy, czego ten wynik nie mówi i dlaczego ostatni punkt na telefonie zależał od jednego wiersza tekstu.

Ilustracja: prędkościomierz ze wskazówką wychyloną mocno w prawo, pod nim laptop i telefon, obok stoper i błyskawica

Opublikowano: 03.11.2026 · stan na listopad 2026 · Redakcja Tworzenie Stron Rzeszów

W skrócie

Strona
tworzenie-stron-rzeszow.pl, nasza strona: 57 adresów (stan na 03.11.2026; usługi, problemy, branże, cennik, realizacje, poradniki), film w nagłówku strony głównej, animacje
Cel
100 punktów w każdej kategorii PageSpeed Insights, na komputerze i na telefonie, bez rezygnacji z filmu i ruchu na stronie
Wynik
raport z 03.11.2026, 14:21: komputer i telefon 100/100/100/100, z podpowiedzi raportu została jedna; to samo w naszych sześciu pomiarach. Rano tego dnia telefon miał 99
Co zabierało ostatni punkt
na telefonie: łagodne pojawianie się jednego wiersza tekstu w nagłówku i za duże zdjęcie tła
Czego wynik nie mówi
to test laboratoryjny jednego wejścia na stronę; danych od prawdziwych odwiedzających Google jeszcze nie ma

Raport Google z 03.11.2026: komputer i telefon

Raport PageSpeed Insights dla strony głównej z 03.11.2026, 14:21: u góry komputer, niżej telefon. W obu wersjach 100 punktów w wydajności, ułatwieniach dostępu, sprawdzonych metodach i SEO, a „Przeglądanie agentowe” 3 z 3. „Brak danych” przy wrażeniach użytkowników znaczy, że Google nie ma jeszcze pomiarów od prawdziwych odwiedzających; piszemy o tym niżej.

Dwa zrzuty raportu PageSpeed Insights dla tworzenie-stron-rzeszow.pl z 03.11.2026, 14:21: na komputerze i na telefonie po 100 punktów w wydajności, ułatwieniach dostępu, sprawdzonych metodach i SEO, przeglądanie agentowe 3 z 3, przy wrażeniach użytkowników „Brak danych”

Co mierzy PageSpeed Insights

PageSpeed Insights to bezpłatne narzędzie Google. Wczytuje stronę raz, w warunkach laboratoryjnych: jako średniej klasy telefon na wolnym internecie komórkowym i jako komputer. Daje cztery oceny od 0 do 100:

  • Wydajność: jak szybko pojawia się treść, czy strona reaguje i czy nic nie skacze;
  • Ułatwienia dostępu: czy stroną posłużą się osoby słabowidzące, z czytnikiem ekranu albo bez myszy;
  • Sprawdzone metody: bezpieczeństwo i poprawność techniczna (np. szyfrowane połączenie, brak błędów w przeglądarce);
  • SEO: czy wyszukiwarka zrozumie stronę (tytuł, opis, język, linki).

Raport pokazuje też „Przeglądanie agentowe” (stan na 2026-11): czy ze strony skorzystają asystenci AI. Nasza strona: 3 z 3.

Ocena 90–100 jest zielona. 100 w wydajności oznacza, że wszystkie pięć pomiarów, z których Google ją liczy, jest na najwyższym poziomie.

Czego 100 nie oznacza

To nie są dane od Twoich klientów. Górna część raportu („Dowiedz się, jakie są wrażenia użytkowników”) pokazuje „Brak danych”. Google zbiera pomiary od prawdziwych użytkowników Chrome i pokazuje je dopiero przy odpowiedniej liczbie wizyt. Nasza strona działa od początku listopada 2026, więc tych danych jeszcze nie ma.

  • To jedno wejście na jedną stronę. Wynik się waha. Dlatego mierzyliśmy kilka razy i sprawdziliśmy też podstrony.
  • To nie jest pozycja w Google. Szybkość to jeden z wielu sygnałów. Treść, dopasowanie do pytania i linki ważą więcej.
  • To nie jest gwarancja wygody. Strona może mieć 100 punktów, a i tak źle działać na telefonie. Opisaliśmy to w przypadku przeprojektowania strony firmy usługowej.

Dlaczego warto

Google mierzy u prawdziwych użytkowników trzy rzeczy (Core Web Vitals) i podaje progi „dobrze”: największy element widoczny w 2,5 s, reakcja na kliknięcie w 200 ms, przesunięcia układu poniżej 0,1 (stan na 2026-11). Strona, która w laboratorium mieści się w progach z zapasem, ma rezerwę na słabszy telefon i gorszy zasięg. A klient, który szuka firmy z telefonu, nie czeka: w naszym teście na symulowanym wolnym internecie pierwsza treść pojawia się po ok. 1 s.

Co zrobiliśmy

Bez gotowego motywu i bez wtyczek do wyglądu. Strona stoi na Craft CMS z własnymi szablonami. Do przeglądarki trafia tylko kod, którego strona używa: na stronie głównej 5 małych plików JavaScript (razem 8 KB) i jeden plik stylów (13 KB). Bez jQuery i bez bibliotek z cudzych serwerów. Craft CMS wymusza taką budowę od zera, WordPress na nią pozwala, ale jej nie wymusza: porównanie trzech stron zbudowanych na obu systemach.

  • Zero połączeń z obcymi serwerami. Czcionki, statystyki, zdjęcia i film są na naszym serwerze. Bez Google Fonts, bez menedżera tagów, bez banera cookies (pojawi się tylko wtedy, gdy włączymy Google Analytics).
  • Zdjęcia w kilku rozmiarach i nowych formatach. Każde zdjęcie istnieje w 2–5 szerokościach jako AVIF i WebP. Przeglądarka wybiera najmniejszy plik, który wystarczy. Zdjęcia niżej na stronie wczytują się dopiero przy przewijaniu. Każde ma zapisane wymiary, więc nic nie przeskakuje.
  • Czcionki tylko z potrzebnymi znakami. Polskie litery (ą, ć, ę, ł, ń, ó, ś, ź, ż) są w osobnym, małym pliku: 2–4 KB zamiast 17–85 KB pełnego zestawu znaków środkowoeuropejskich.
  • Film nie spowalnia strony. Najpierw widać kadr z filmu. Film pobiera się dopiero po wczytaniu strony i nie startuje, gdy telefon oszczędza dane albo ktoś wyłączył animacje. Ma przycisk pauzy.
  • Efekt fali na zdjęciu tylko na komputerze z myszką, uruchamiany po wczytaniu strony.
  • Automatyczne kontrole przy każdej zmianie: dostępność każdej strony z mapy witryny (WCAG 2.2 AA), audyt SEO każdej strony, limit wielkości plików.

Co nie było oczywiste

  1. Na telefonie najważniejszym elementem nie było zdjęcie, tylko wiersz tekstu. Zdjęcie w tle wypełnia cały ekran telefonu, więc przeglądarka traktuje je jak tło i nie bierze pod uwagę. Liczy się wtedy wiersz tekstu nad tytułem. Ten wiersz pojawiał się łagodnie z przezroczystości, a przezroczystego tekstu przeglądarka nie liczy. Do tego test Google, który symuluje wolny internet, dolicza do czasu tego wiersza wszystko, co telefon zaczął pobierać przed nim: duże zdjęcie tła, kadr filmu i czcionki. Wyszło 2,3 s, a na 100 punktów trzeba ok. 1,9 s. Poprawka: tekst wsuwa się bez przezroczystości, zdjęcie tła na telefonie jest mniejsze i nie ma pierwszeństwa, a kadr filmu jest w nowszym, lżejszym formacie i wczytuje się z wyprzedzeniem. Po poprawce najważniejszym elementem na telefonie jest kadr filmu, widoczny po 1,7 s (po dalszych poprawkach tego samego dnia po 1,5 s), a wynik to 100.
  2. Lepszy format zdjęć nie zostawał w pamięci przeglądarki. Zdjęcia WebP serwer oznaczał do przechowywania na rok, zdjęcia AVIF (mniejsze) wcale. Cała pozycja „czas przechowywania w pamięci podręcznej” w raporcie to pliki AVIF. Przyczyna: gotowa konfiguracja serwera nie zna tego formatu. Dopisaliśmy go i ta pozycja zniknęła z raportu.
  3. Bezpieczeństwo ma swoją cenę w raporcie. Strona nie pozwala uruchomić skryptów wpisanych w treść strony (ochrona przed wstrzyknięciem cudzego kodu). Przez to style wczytują się w zwykły sposób, a raport pokazuje je jako „blokujące renderowanie”. Wynik na tym nie traci.
  4. Film to 86% wagi strony głównej i nie obniża wyniku. Ładuje się po stronie, więc test go nie karze. Telefon i tak go pobiera: 1,15 MB.
  5. Telefon pobierał największą wersję zdjęcia w tle. Na wysokim ekranie zdjęcie jest rozciągnięte prawie trzykrotnie, więc przeglądarka brała plik 2400 pikseli (122 KB), choć zdjęcie jest przyciemnionym tłem. Po poprawce: 1280 pikseli (31 KB).
  6. Test na własnym komputerze potrafi zaniżyć wynik. Bez szyfrowanego połączenia i na wersji testowej ukrytej przed Google „Sprawdzone metody” i SEO spadają do ok. 78 i 66 punktów. Mierzymy więc na prawdziwym adresie.
  7. Poprawka dla telefonu dała nowe ostrzeżenie na komputerze. Zdjęcie tła straciło pierwszeństwo na wszystkich urządzeniach, a na komputerze to ono jest najważniejszym elementem. Wynik się nie zmienił (0,4 s, 100 punktów), ale raport z 13:05 pokazał na komputerze podpowiedź „Wykrywanie żądań LCP”. Poprawiliśmy to tego samego dnia: zdjęcie tła dostaje pierwszeństwo tylko na komputerze. Dlatego po każdej zmianie mierzymy oba profile.
  8. Nie każda czerwona podpowiedź oznacza prawdziwy problem. Po kolejnych poprawkach raport z 14:03 pokazał „Wymuszone przeformatowanie” bez wskazania winnego skryptu. Okazało się, że narzędzie Google uznało za wymuszone zwykłe, pierwsze ułożenie strony, bo w tym samym momencie przeglądarka w tle przygotowywała skrypt filmu. Wystarczyło wczytać skrypty filmu i statystyk po wczytaniu strony. Podobnie „Drzewo zależności sieciowych”: raport zgłasza każdy łańcuch „strona → plik → kolejny plik”, chyba że strona z góry zapowie przeglądarce główne pliki. Dopisaliśmy taką zapowiedź i podpowiedź zniknęła.

Efekt: raport Google przed i po

Raport Google, strona głównaRano (03.11.2026, 10:27)Po poprawce telefonu (13:05)Po usunięciu podpowiedzi (14:21)
Komputer: wydajność / dostępność / sprawdzone metody / SEO100 / 100 / 100 / 100100 / 100 / 100 / 100100 / 100 / 100 / 100
Telefon: wydajność / dostępność / sprawdzone metody / SEO99 / 100 / 100 / 100100 / 100 / 100 / 100100 / 100 / 100 / 100
Pierwsza treść widoczna po (telefon / komputer)1,0 s / 0,3 s0,9 s / 0,3 s1,0 s / 0,3 s
Największy element widoczny po (telefon / komputer)2,3 s / 0,4 s1,7 s / 0,4 s1,5 s / 0,4 s
Strona zablokowana0 ms0 ms0 ms
Przeskakiwanie treści000
Połączenia z obcymi serwerami000
Podpowiedzi w raporcie (telefon / komputer)4 / 52 / 51 / 1

Nasze pomiary tym samym silnikiem dały we wszystkich trzech stanach to samo co raport Google, w 3 z 3 przebiegów na telefon i na komputer. Do tego:

Nasze pomiaryRanoPo poprawce telefonuPo usunięciu podpowiedzi
Zdjęcia na stronie głównej na telefonie181 KB66 KB54 KB
Waga strony głównej na telefonie1 455 KB, z tego film 1 152 KB1 340 KB, z tego film 1 152 KB1 328 KB, z tego film 1 152 KB
Podstrony: usługa, kontakt, poradnik, realizacja100 / 100 / 100 / 100 na telefonie i komputerze100 / 100 / 100 / 100 na telefonie i komputerze (kontakt na telefonie raz na trzy pomiary 99)100 / 100 / 100 / 100 na telefonie i komputerze (kontakt 3 z 3 pomiarów)
Podstrona „O nas” (film w tle)telefon 99, komputer 100telefon 99, komputer 100telefon 100 (3 z 3 pomiarów), komputer 100

Telefon rano i po poprawkach

Ten sam adres w PageSpeed Insights na telefonie: u góry raport z 03.11.2026, 10:27 (wydajność 99), niżej raport z 14:21 tego samego dnia, po wszystkich poprawkach (wydajność 100). Pozostałe oceny miały 100 w obu raportach.

Dwa zrzuty raportu PageSpeed Insights na telefonie: o 10:27 wydajność 99, o 14:21 wydajność 100; ułatwienia dostępu, sprawdzone metody i SEO po 100 w obu

Co zostało

Raport z 03.11.2026, 14:21 pokazuje już tylko jedną podpowiedź. Nie odbiera punktów, ale uczciwie ją wymieniamy, razem z tym, czego raport nie sprawdza:

  • Style blokujące renderowanie: świadomy wybór na rzecz ochrony przed cudzym kodem (punkt 3 wyżej). Raport przestałby ją pokazywać dopiero wtedy, gdy style byłyby wpisane w samą stronę; czy to robić, jeszcze rozważamy.
  • Wcześniejsze podpowiedzi z 13:05 usunęliśmy tego samego dnia: zdjęcie tła ma pierwszeństwo tylko na komputerze, kadr filmu ma trzy rozmiary (320, 400 i 640 pikseli) zamiast jednego, skrypty najpierw odczytują położenie elementów, a dopiero potem je zmieniają, a strona zapowiada przeglądarce swoje główne pliki (punkt 8 wyżej).
  • Filmy: strona główna 1,15 MB, które telefon pobiera po wczytaniu strony. Na „O nas” kadr filmu w tle miał 150 KB i zabierał tam ostatni punkt na telefonie (99). Po tej samej poprawce co na stronie głównej kadr ma na telefonie 10 KB, a „O nas” ma 100. Filmy na telefonach nadal startują same: to nasza świadoma decyzja.
  • Kompresja: serwer kompresuje gzipem. Nowszy Brotli zmniejszyłby HTML i style strony głównej o 3–6 KB (nasze przeliczenie tych samych plików); raport tego nie wymaga.
  • Dane od prawdziwych użytkowników: pojawią się po kilku tygodniach ruchu. Wtedy sprawdzimy, czy wyniki z laboratorium potwierdzają się u odwiedzających.

Wnioski dla właściciela strony

Wynik 100 nie jest efektem jednej sztuczki. Daje go suma decyzji podjętych na początku: brak gotowego motywu, mało kodu, własne czcionki, zdjęcia w kilku rozmiarach, zero cudzych skryptów.

  • Ostatni punkt zależy od szczegółów, których nie widać gołym okiem: tu od tego, który element Google uznaje za najważniejszy na telefonie, i od animacji jednego wiersza.
  • Poprawka dla jednego urządzenia może zmienić coś na drugim. Po każdej zmianie mierzymy telefon i komputer.
  • Podpowiedzi raportu warto sprawdzić, zanim się je „naprawi”: część to skutek sposobu liczenia, nie wolnej strony.
  • Wynik z laboratorium to prognoza. Sprawdzą go dane od odwiedzających, które Google pokaże po kilku tygodniach ruchu.
  • Ścisłe bezpieczeństwo i 100 punktów da się połączyć, ale wymaga to świadomych kompromisów.

Jak to wyglądało na stronach klientów: przyspieszenie sklepu WooCommerce i przebudowa 1:1 starych stron WordPress. Chcesz szybką stronę od początku? Zobacz, jak robimy strony internetowe dla firm, albo opisz swoją w formularzu.

Opis techniczny: LCP na telefonie, obrazy, czcionki, CSP i cache

Dla administratorów: pełny przebieg z dokładnymi liczbami, poleceniami i konfiguracją. Wersje: stan na listopad 2026.

W skrócie

ElementSzczegóły
ŚrodowiskoCraft CMS
CelPSI 100 w czterech kategoriach na /, komputer i telefon; nasz budżet: wszystkie kategorie ≥ 95, LCP < 2,0 s, INP < 200 ms, CLS < 0,05
Stan wyjściowyPSI 03.11.2026: komputer 100/100/100/100 (FCP 0,3 s, LCP 0,4 s, TBT 0 ms, CLS 0, SI 0,6 s); telefon 99/100/100/100 (FCP 1,0 s, LCP 2,3 s, TBT 0 ms, CLS 0, SI 1,8 s)
Przyczyna 99element LCP na telefonie to <p class="reveal"> nad H1 (zdjęcie tła zakrywa cały viewport i nie jest kandydatem LCP), wchodzący z opacity: 0; symulacja Lantern dolicza do niego zdjęcie tła 2400w (122 KiB, fetchpriority="high"), plakat JPEG (49 KiB) i czcionki: LCP 2,25 s = wynik metryki 0,94
Rozwiązanierewizja r740 (03.11.2026, na produkcji przed 13:05): @keyframes reveal bez opacity: 0; tło na telefonie sizes 160vw (1280w, 31 KiB) i bez fetchpriority; plakat filmu w AVIF (26 049 B zamiast 50 130 B) z preload tylko na telefonach; reguła nginx z Cache-Control dla .avif. Potem r743, r744, r747 (na produkcji przed 14:21): kadr filmu jako <img srcset> zamiast poster, preload tła tylko na komputerze, bez wymuszonych przeformatowań, chunki filmu i statystyk po load, modulepreload/preload as=style dla pliku wejściowego, kadr AVIF na „O nas”
EfektPSI 03.11.2026 13:05: komputer i telefon 100/100/100/100 (telefon: FCP 0,9 s, LCP 1,7 s, SI 1,4 s). Lighthouse 13.6.0 na produkcji 13:09–13:15: telefon 100 ×3 (LCP 1,65–1,66 s, wynik metryki 0,99; element LCP: plakat filmu), komputer 100 ×3; podstrony bez filmu 100/100 na obu profilach, /o-nas na telefonie nadal 99; efekt uboczny: na komputerze nowa diagnostyka „Wykrywanie żądań LCP”. PSI 14:21 (po r747): 100/100/100/100 na obu profilach, telefon LCP 1,5 s, jedyna podpowiedź „Żądania blokujące renderowanie”. Lighthouse 14:23–14:28: strona główna 100 ×3 na obu profilach (LCP telefon 1,50–1,51 s), wszystkie pięć podstron 100/100 na obu profilach, /o-nas telefon 100 ×3 (LCP 1,46–1,47 s)

Kontekst

Wymagania właściciela, które z punktu widzenia wydajności są obciążeniem:

ElementKoszt
Licencjonowany film z drona w nagłówku strony głównej (640 × 360, MP4 1 178 474 B)79% bajtów strony (po r740 86%)
Zdjęcie tła nagłówka z krzywą tonalną (filtr SVG) i efektem fali w WebGLobraz 1. ekranu + chunk 4,15 kB gz
Trzy kroje: Anton (H1), Inter Tight 600 (H2/H3), Inter zmienny 400–600 (tekst)6 plików WOFF2, na stronie 5
Animacje: wejście tekstów nagłówka, składanie karty przy przewijaniu (od 1200 px)JS w pliku wejściowym
Analityka bez cookies (wtyczka Insights na naszym serwerze), opcjonalnie GA4 z banerem1 skrypt + 1 żądanie track
Ścisła CSP bez unsafe-inlinebrak asynchronicznego CSS przez onload

Diagnoza

1. Raport właściciela (PSI, 03.11.2026 10:27:30). Diagnostyki komputer: „Wymuszone przeformatowanie”, „Drzewo zależności sieciowych”, „Efektywny czas przechowywania w pamięci podręcznej” (szac. 77 KiB), „Dostarczanie obrazów” (41 KiB), „Żądania blokujące renderowanie”. Telefon: pamięć podręczna 132 KiB, obrazy 11 KiB, blokowanie renderowania 80 ms, drzewo zależności.

2. Odtworzenie tym samym silnikiem. API PSI bez klucza zwróciło:

HTTP 429: Quota exceeded for quota metric 'Queries' and limit 'Queries per day' of service
'pagespeedonline.googleapis.com' for consumer 'project_number:583797351490'.

Mierzyliśmy więc lokalnie Lighthouse 13.6.0 na produkcji (HTTPS), 3 × telefon i 3 × komputer, na przemian, z domyślnym profilem telefonu i profilem komputera, z czterema kategoriami raportu i zapisem pełnego wyniku do analizy.

03.11.2026, przed poprawkąTelefon (3 przebiegi)Komputer (3 przebiegi)
Wydajność / Dostępność / Dobre praktyki / SEO99 / 100 / 100 / 100 (×3)100 / 100 / 100 / 100 (×3)
FCP0,97–1,05 s0,27–0,29 s
LCP2,25–2,26 s (wynik metryki 0,94)0,40 s
TBT4–29 ms0 ms
CLS00,0001
Speed Index1,33–1,53 s0,52–0,55 s
Odpowiedź serwera (dokument)334–429 ms337–405 ms
Element LCP<p class="reveal …"> (wiersz nad H1)<img> zdjęcia tła, AVIF 1600w
Waga / żądania1 455 KiB / 181 400 KiB / 20
Obce domeny00

Diagnostyki i ich zasoby (z JSON, ten sam zestaw co u właściciela):

DiagnostykaTelefonKomputerZasoby
Pamięć podręczna132 KiB77 KiBtylko pliki AVIF z uploads/: hero 2400w (124 831 B) i karta 400w na telefonie; hero 1600w (48 842 B) i 3 karty po ok. 10 KB na komputerze; cacheLifetimeMs: 0
Dostarczanie obrazów11 KiB41 KiBplakat filmu /videos/hero-rzeszow.jpg (JPEG 50 130 B): „nowoczesny format” 11 730 B; na komputerze też „640×360 wyświetlany jako 293×165” 39 633 B
Blokowanie renderowaniataktakapp-BLqXUjcx.css (13 087 B przesłane), metricSavings FCP 0, LCP 0
Wymuszone przeformatowaniebrak30,7 msapp-BMWsm8eR.js (choreografia przewijania, od 1200 px)
Drzewo zależności561 ms585 msHTML → app.js → chunki loader, stats, hero-video; HTML → CSS → Inter Tight latin/pl i Inter pl (bez preload)

Waga strony głównej na telefonie według typu (przesłane bajty):

TypŻądaniaKiB
Wideo (MP4, priorytet Low, po load)11 152,4
Obrazy3180,9
Czcionki581,5
HTML (gzip)118,3
CSS (gzip)112,8
JS (gzip)58,1
Inne (favicon, track)21,2

3. Kto jest elementem LCP na telefonie. Przeglądarka z obserwatorem PerformanceObserver typu largest-contentful-paint na produkcji (412 × 823, DPR 1,75, jak profil Lighthouse):

TelefonKomputer (1350 × 940)
Prostokąt zdjęcia tła412 × 872 px od góry: cały viewport1350 × 800 px
Kandydaci LCPtekst przycisku na pasku telefonu (568 ms, 2 780 px²), potem <p class="reveal"> (616 ms, 17 296 px²)<img> hero-bg 1600w AVIF (496 ms, 1 080 000 px²)
Plik zdjęcia tła2400w AVIF (122 KiB)1600w AVIF (48 KiB)

Chrome pomija przy LCP elementy niewidoczne (opacity: 0) i takie, które zakrywają cały viewport (traktuje je jak tło). Na telefonie zdjęcie tła odpada, a wiersz nad H1 zaczyna od przezroczystości.

4. Czy 100 trzyma się poza stroną główną. Pięć podstron różnych typów, po jednym przebiegu na profil, 03.11.2026 10:54–10:57 (przed poprawką):

PodstronaTelefonLCP telefonElement LCP na telefonieKomputerWaga (telefon)
Usługa: strony internetowe dla firm100 / 100 / 100 / 1000,99 slink w pasku telefonu100 / 100 / 100 / 100159 KiB
Kontakt (z formularzem)100 / 100 / 100 / 1001,00 slink w pasku telefonu100 / 100 / 100 / 100158 KiB
Poradnik (przyspieszenie sklepu)100 / 100 / 100 / 1001,50 sokruszek (aria-current)100 / 100 / 100 / 100166 KiB
Realizacja (karta projektu)100 / 100 / 100 / 1000,91 slink w pasku telefonu100 / 100 / 100 / 100193 KiB
O nas (film w tle nagłówka)99 / 100 / 100 / 1002,18 s<video>: plakat JPEG 1280 × 720, 149,9 KiB100 / 100 / 100 / 1003 948 KiB

Na podstronach bez filmu waga to 158–193 KiB, a elementem LCP telefonu był mały element, bo teksty nagłówka też wchodziły z przezroczystości. Strona „O nas” ma na telefonie ten sam problem co strona główna, w innej postaci: elementem LCP jest plakat filmu w tle (JPEG 150 KiB bez wskazówki priorytetu; Lighthouse szacuje 104 KiB oszczędności i 450 ms LCP).

5. Ile brakowało. Wagi wyniku wydajności w Lighthouse 13.6.0: FCP 10, LCP 25, TBT 30, CLS 25, SI 10. LCP na telefonie liczony jest z punktami kontrolnymi p10 = 2 500 ms i mediana = 4 000 ms. Przy 2 250 ms wynik metryki to 0,94, więc 0,75 + 0,25 × 0,94 = 0,985 i po zaokrągleniu 99. Na 100 (≥ 0,995) LCP musi mieć wynik ≥ 0,98, czyli zejść poniżej ok. 1,9 s (1 800 ms daje 0,985, 1 500 ms 0,996). Po r740: LCP 1 650 ms, wynik metryki 0,99, kategoria 100.

Przyczyna

Lighthouse nie mierzy LCP na wolnym łączu, tylko go symuluje (Lantern): bierze z prawdziwego, szybkiego wczytania obserwowany moment LCP i zasoby, których pobieranie zaczęło się przed nim, a potem przelicza ich czas dla 150 ms RTT, 1,6 Mb/s i CPU ×4. W naszych przebiegach na telefonie:

Przebieg 1Przebieg 2Przebieg 3
Obserwowane FCP / LCP / load524 / 608 / 531 ms618 / 665 / 653 ms486 / 517 / 515 ms
Symulowane FCP / LCP1 050 / 2 257 ms998 / 2 253 ms975 / 2 253 ms

Obserwowany LCP (wiersz nad H1, który wchodził z opacity: 0) wypadał 31–84 ms po FCP, czyli już po zdarzeniu load. Przed nim przeglądarka zdążyła zażądać prawie wszystkiego: zdjęcia tła w wersji 2400w (122 KiB, fetchpriority="high"), plakatu filmu (49 KiB, JPEG), pięciu czcionek (81,5 KiB), stylów i skryptów. Symulacja dolicza te bajty do czasu tekstu i na 1,6 Mb/s wychodzi 2,25 s. Zdjęcie tła nie jest przy tym elementem LCP (zakrywa cały ekran), więc jego 122 KiB spowalniało wynik, nic nie dając. Na komputerze LCP to samo zdjęcie (nie zakrywa całego ekranu), 1600w, 48 KiB, pobrane w 33–50 ms przy 10 Mb/s.

Co nie było oczywiste

  1. Na telefonie LCP to wiersz tekstu, nie zdjęcie, a liczą się bajty pobrane przed nim. Zdjęcie tła ma na telefonie 412 × 872 px przy ekranie 412 × 823 px, więc Chrome uznaje je za tło i nie zgłasza jako kandydata LCP. Na komputerze (1350 × 800 px na 940 px wysokości) to samo zdjęcie jest LCP. Kandydatem na telefonie zostaje <p class="reveal">, a @keyframes reveal zaczynał od opacity: 0. fetchpriority="high" na zdjęciu tła na telefonie nie pomagał LCP, tylko zabierał pasmo, a symulacja Lighthouse doliczała jego 122 KiB do czasu tekstu. Poprawka (r740) usuwa opacity: 0 z wejścia; od razu widoczny tekst przestaje być największym elementem i LCP telefonu przejmuje plakat filmu (<video> 640 × 360 w nagłówku), więc to on dostał preload. Po wdrożeniu (13:09–13:11) Lighthouse pokazuje na telefonie jako element LCP <video> z plakatem AVIF, „Wykrywanie żądań LCP” spełnione we wszystkich trzech punktach (fetchpriority, odkrywalny w HTML, bez lazy), LCP 1,65 s. Od r743 kadr jest osobnym <img srcset>, a po r747 to on jest elementem LCP telefonu (LCP 1,50–1,51 s). Na podstronach elementem LCP telefonu jest teraz akapit wstępu albo zdjęcie projektu zamiast linku w pasku telefonu: tekst nagłówka liczy się od pierwszej klatki.
  2. AVIF bez nagłówka cache, WebP z rocznym. Obraz bazowy ma w server-opts.d/performance.conf regułę cache dla css|js|jpe?g|png|gif|…|webp|…|mp4|…|svgz?, bez avif. AVIF trafia do domyślnej lokalizacji z nagłówkami bezpieczeństwa i bez Cache-Control (w nginx add_header nie dziedziczy się do location z własnym add_header). Przeglądarka dostaje AVIF, bo jest pierwszym <source>, więc właśnie lepszy format nie zostaje w pamięci podręcznej. Dowód: curl -sI z 03.11.2026 10:38 (AVIF: bez Cache-Control, z x-frame-options; WebP tego samego zdjęcia: public, max-age=31536000, immutable). Poprawka w r740: własna reguła location ~* \.avif$ w obrazie (niżej). Po przebudowie obrazu (curl -sI 03.11.2026 13:08) AVIF z uploads/ i plakat AVIF mają public, max-age=31536000, immutable, a pozycja „pamięć podręczna” zniknęła z raportu na obu profilach.
  3. CSS zostaje blokujący, bo asynchroniczny CSS łamie CSP. W trybie asynchronicznym wtyczka Vite dla Crafta wypisuje <link rel="stylesheet" media="print" onload="this.media='all'">. CSP script-src 'self' bez unsafe-inline blokuje atrybuty on*, więc arkusz zostałby przy media="print", a strona bez stylów. Szablon używa craft.vite.script('src/js/app.js', false): zwykły <link rel="stylesheet"> (12,52 kB gz). PSI pokazuje „Żądania blokujące renderowanie” (u właściciela szac. 80–130 ms na telefonie), ale metricSavings dla FCP i LCP w JSON to 0. Po r747 to jedyna podpowiedź w raporcie (PSI 14:21: czerwona na telefonie, pomarańczowa na komputerze). preload as=style jej nie usuwa: zostaje przy każdym zewnętrznym arkuszu, a znika dopiero przy CSS wpisanym w HTML. Przy style-src 'self' wymagałoby to skrótu (hash) każdego bloku <style> w CSP; decyzja jest otwarta.
  4. Craft dopisuje do HTML skrypt inline, którego CSP nie przepuszcza. Gdy podczas żądania powstaje zadanie kolejki (pierwsza transformacja obrazu), Craft dokleja inline skrypt uruchamiający kolejkę. CSP go blokuje: błąd w konsoli (w Dobrych praktykach audyt errors-in-console), zadania czekają, a każda odsłona dokłada zadania kolejnych wersji srcset (w innym naszym projekcie kolejka urosła do 2 441 zadań). Rozwiązanie: stały worker queue/listen jako usługa s6 w obrazie i runQueueAutomatically(false). Obraz pierwszego ekranu ma wersje generowane od razu (Pictures::build(…, $immediately)), więc jego adres to plik, a nie adres generatora z przekierowaniem.
  5. Film to 79% wagi strony (po r740 86%) i nie wpływa na wynik. 1 152 KiB z 1 455 KiB na telefonie (po r740 z 1 340 KiB). preload="none", start dopiero po load (hero-video.js), priorytet Low: Lighthouse go pobiera, ale żadna metryka na tym nie traci. Nasz budżet „strona główna < 0,5 MB” bez filmu jest spełniony (303 KiB na telefonie, po r740 188 KiB), z filmem nie. Plakat JPEG 640 × 360 wyświetlany w ramce 293 × 165 px to cała pozycja „Dostarczanie obrazów”; po r740 plakat AVIF (26 049 B) w tej samej ramce na komputerze nadal daje 20 KiB, bo atrybut poster nie przyjmuje srcset. r743 zastępuje go zwykłym <img srcset> (AVIF 320w, 400w, 640w) nad filmem; po r747 pozycja zniknęła z raportu.
  6. sizes liczony uczciwie dał telefonowi największy plik. Pas nagłówka na telefonie jest wyższy niż szeroki, zdjęcie 16:9 z object-cover jest rysowane na ok. 2,8 szerokości ekranu, więc preset miał sizes="(max-width: 767px) 280vw, …". Przy 412 px i DPR 1,75 to ok. 2 000 px fizycznych: przeglądarka bierze 2400w (122 KiB). Dla przyciemnionego tła, które na telefonie nie jest nawet elementem LCP, to za dużo. r740 świadomie zaniża sizes do 160vw: wersja 1280w, 31 KiB.
  7. Lokalny Lighthouse przez HTTP myli, a API PSI bez klucza ma limit. Na lokalnym stosie przez HTTP i z noindex Dobre praktyki spadają do ok. 78 (brak HTTPS), SEO do ok. 66 (is-crawlable); na stagingu przez HTTPS ta sama strona miała 98/100/100/69. Wynik ma sens tylko na HTTPS i bez noindex. API PSI bez klucza 03.11.2026 zwracało 429 (limit dzienny, rano i o 13:16); Lighthouse 13.6.0 uruchomiony lokalnie na produkcji dał te same diagnostyki co oba raporty PSI. Wynik waha się też między przebiegami: podstrona kontaktu na telefonie dała raz 99 (TBT 124 ms), w dwóch kolejnych przebiegach 100 (TBT 45–47 ms); po r747 3 z 3 przebiegów 100. Dlatego podajemy rozrzut, a nie jeden najlepszy pomiar.
  8. Poprawka dla telefonu przesunęła diagnostykę na komputer. r740 zamienia na zdjęciu tła priority (loading="eager" i fetchpriority="high") na nową opcję eager (bez fetchpriority) na wszystkich szerokościach, bo na telefonie zdjęcie nie jest elementem LCP. Na komputerze jest: w 3 z 3 przebiegów po wdrożeniu „Wykrywanie żądań LCP” ma priorityHinted: false (wynik audytu 0), tak samo w raporcie PSI z 13:05. Metryka na tym nie traci (LCP 0,36–0,40 s, wynik 1), ale raport ma czerwoną pozycję, której rano nie było. fetchpriority na <img> nie zależy od zapytania o media, więc priorytet tylko na komputerze wymaga osobnej drogi. r744 dodaje <link rel="preload" as="image" type="image/avif" imagesrcset=… imagesizes=… fetchpriority="high" media="(min-width: 768px)"> dla zdjęcia tła; po r747 w 3 z 3 przebiegów na komputerze „Wykrywanie żądań LCP” ma wszystkie trzy punkty spełnione.
  9. „Wymuszone przeformatowanie” bez winnego skryptu było fałszywym alarmem. Po r743 (kod najpierw czyta wymiary, potem pisze; pierwszy pomiar w raporcie ResizeObserver) raporty właściciela z 14:03/14:04 nadal pokazywały wymuszone przeformatowanie, tym razem „[nieprzypisane]”: 63 ms na telefonie, 139 ms na komputerze. Ślad Lighthouse pokazał, że to pierwsze zwykłe rozmieszczenie strony (849 obiektów, ok. 30 ms), które silnik śladu uznał za wymuszone, bo w tym samym czasie na wątku w tle parsował się chunk hero-video (v8.parseOnBackground); silnik nie rozróżnia wątków. r747 ładuje chunki filmu i statystyk dopiero po load (film i tak startuje dopiero wtedy). Po r747: audyt zaliczony w 6 z 6 przebiegów strony głównej.
  10. „Drzewo zależności sieciowych” zgłasza każdy łańcuch krytycznych żądań, a preload go przerywa. Audyt ma stan fail przy każdym łańcuchu o długości co najmniej 2 z żądań krytycznych (HTML → CSS → czcionki, HTML → app.js → chunki). Żądania z preload/modulepreload traktuje jako niekrytyczne. Skaner wstępny przeglądarki i tak znajduje oba pliki od razu, więc wskazówki nie zmieniają kolejności pobierania, tylko sposób liczenia. r747 dodaje w szablonie modulepreload dla pliku wejściowego i preload as=style dla arkusza; po r747 audyt zaliczony w 6 z 6 przebiegów.

Rozwiązanie

Obrazy: jeden komponent, nazwane presety (config/sitekit.php → images.presets, _components/picture.twig, sitekit\Craft\Pictures):

'heroBg' => [
    'ratio' => [16, 9],
    'widths' => [960, 1280, 1600, 1920, 2400],
    'sizes' => '(max-width: 767px) 160vw, (max-width: 1279px) 160vw, 100vw',   // do r740: 280vw na telefonie
    'quality' => ['avif' => 55, 'webp' => 70],
],
'card' => ['ratio' => [4, 3], 'widths' => [320, 480, 720, 960],
           'sizes' => '(min-width: 1280px) 400px, (min-width: 768px) 45vw, 100vw',
           'quality' => ['avif' => 60, 'webp' => 72]],
<picture>
  <source type="image/avif" srcset="… 960w, … 1280w, … 1600w, … 1920w, … 2400w" sizes="…">
  <img src="…_1600x900_…/hero-bg.webp" srcset="… (WebP)" sizes="…" width="2400" height="1350"
       alt="" decoding="async" loading="eager" fetchpriority="high">   {# do r740; od r740 tło bez fetchpriority #}
</picture>

Poniżej pierwszego ekranu loading="lazy"; zawsze width/height (CLS 0); AVIF tylko, gdy sterownik obrazów go zapisze.

Czcionki (src/css/app.css): własny serwer, WOFF2, font-display: swap, osobny plik z polskimi znakami przez unicode-range; preload tylko dwóch plików pierwszego ekranu (Anton do H1, Inter do tekstu):

@font-face {
  font-family: Inter; font-weight: 400 600; font-display: swap;
  src: url('../fonts/inter-pl-var.woff2') format('woff2');
  unicode-range: U+0104-0107, U+0118-0119, U+0141-0144, U+015A-015B, U+0179-017C;
}
PlikRozmiarPreload
anton-latin-40018,18 kBtak
inter-latin-var (400–600)34,54 kBtak
inter-tight-latin-60022,13 kBnie
anton-pl / inter-pl / inter-tight-pl4,06 / 3,51 / 1,88 kBnie

CSS i JS (Tailwind 4 z @import 'tailwindcss' source(none) i jawnymi @source, bez domyślnej palety): jeden plik CSS 12,52 kB gz. JS wejściowy 2,19 kB gz (type="module", więc odroczony); reszta to chunki ładowane tylko, gdy w HTML jest ich hak:

const modules = {
  'form[data-inquiry]': () => import('./components/inquiry.js'),
  '[data-hero-video]': () => import('./components/hero-video.js'),
  '[data-consent]': () => import('./components/consent.js'),
  'body[data-stats-src]': () => import('./components/stats.js'),
};
// efekt fali: dopiero po 'load', potem requestIdleCallback; tylko (hover: hover) and (pointer: fine),
// nigdy przy prefers-reduced-motion ani Save-Data

Budżet sprawdzany przy każdej kompilacji (kompilacja z przekroczonym budżetem kończy się błędem): CSS ≤ 25 kB gz, JS wejściowy ≤ 15 kB gz, chunk ≤ 60 kB gz, plik czcionki ≤ 80 kB. Stan z 03.11.2026: 12,52 / 2,19 / 0,17–4,15 / 1,88–34,54 kB.

Film: <video muted loop playsinline preload="none" poster="…" width="640" height="360">, aspect-video, start po load, pauza poza ekranem i w ukrytej karcie, przycisk pauzy (WCAG 2.2.2), nigdy przy prefers-reduced-motion ani navigator.connection.saveData. Ten sam wpis konfiguracji (homeVideo) zasila VideoObject w danych strukturalnych.

Nagłówki (produkcja, 03.11.2026):

HTML:            HTTP/2 200, content-encoding: gzip, bez Cache-Control
                 content-security-policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:;
                   font-src 'self'; connect-src 'self'; media-src 'self'; manifest-src 'self'; worker-src 'self';
                   object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests
                 strict-transport-security: max-age=31536000; includeSubDomains · cross-origin-opener-policy: same-origin
CSS, JS, WOFF2,  cache-control: public, max-age=31536000, immutable   (nazwy z hashem treści z Vite)
WebP, JPG, MP4:
AVIF (uploads/): brak Cache-Control do r740 (10:38); od r740 public, max-age=31536000, immutable (13:08)

Dostępność i SEO (100/100): automatyczny test dostępności (axe, reguły WCAG 2.0–2.2 poziomu A i AA) przechodzi każdy adres z /sitemap.xml, stronę potwierdzenia formularza i stronę 410; czeka na koniec animacji wejścia, inaczej mierzyłby kontrast półprzezroczystego tekstu. Własny audyt SEO (polecenie konsoli Crafta) pobiera każdą stronę z mapy jak robot: status 200, jeden h1, język, canonical, robots, dane strukturalne, osierocone strony. Oba uruchamiamy po każdej zmianie szablonów i treści; ostatni wpis w dzienniku projektu z 03.11.2026: 156 testów dostępności bez naruszeń (12 pominiętych, bo dana funkcja nie występuje na stronie), audyt SEO bez błędów. Strona główna ma Organization+ProfessionalService, WebSite, WebPage, VideoObject, FAQPage; meta robots index, follow, max-image-preview:large, max-snippet:-1; robots.txt z grupami robotów wyszukiwarek i asystentów AI, /llms.txt.

Poprawka ostatniego punktu na telefonie (rewizja r740 z 03.11.2026, na produkcji przed raportem z 13:05). Cztery zmiany:

/* app.css: wejście tekstów nagłówka bez startowej przezroczystości */
@keyframes reveal {
  from {
-   opacity: 0;
    transform: translateY(12px);
  }
}
// config/sitekit.php: tło nagłówka na telefonie w wersji 1280 (31 KB zamiast 124 KB)
-'sizes' => '(max-width: 767px) 280vw, (max-width: 1279px) 160vw, 100vw',
+'sizes' => '(max-width: 767px) 160vw, (max-width: 1279px) 160vw, 100vw',
{# home-hero.twig: tło bez wysokiego priorytetu (nowa opcja eager: od razu, ale zwykły priorytet) #}
-  priority: true,
+  eager: true,
{# plakat filmu jako AVIF (26 049 B zamiast 50 130 B), wczytywany z wyprzedzeniem tylko na telefonach #}
{% do view.registerLinkTag({ rel: 'preload', as: 'image', href: video.pagePoster,
                             fetchpriority: 'high', media: '(max-width: 767px)' }) %}
# Docker/craft/nginx/avif-cache.conf, kopiowany do server-opts.d obrazu
location ~* \.avif$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri /index.php?$query_string;
}

immutable jest tu bezpieczne, bo nazwa pliku zmienia się razem z treścią: transformacje Crafta mają parametry w ścieżce, a importer nie podmienia pliku pod tą samą nazwą.

Usunięcie ostatnich podpowiedzi (rewizje r743, r744 i r747 z 03.11.2026, na produkcji przed raportem z 14:21):

{# r743, home-hero.twig: kadr filmu jako responsywny <img> nad filmem zamiast atrybutu poster (ten nie przyjmuje srcset);
   hero-video.js ukrywa go przy zdarzeniu playing #}
<img class="absolute inset-0 size-full object-cover" src="/videos/hero-rzeszow.avif"
     srcset="/videos/hero-rzeszow-320.avif 320w, /videos/hero-rzeszow-400.avif 400w, /videos/hero-rzeszow.avif 640w"
     sizes="(min-width: 768px) 300px, 50vw" width="640" height="360" alt="" fetchpriority="high" decoding="async"
     data-hero-video-still>

{# r744: zdjęcie tła z priorytetem tylko na komputerze, gdzie jest elementem LCP #}
<link rel="preload" as="image" type="image/avif" media="(min-width: 768px)" fetchpriority="high"
      imagesrcset="…/hero-bg.avif 960w, … 2400w" imagesizes="…">
// r747, app.js: chunki bez pracy przed `load` ładowane po nim; ich parsowanie w tle nie nakłada się już
// na pierwsze rozmieszczenie strony (fałszywe „wymuszone przeformatowanie”, pułapka 9)
const lateModules = {
  '[data-hero-video]': () => import('./components/hero-video.js'),
  'body[data-stats-src]': () => import('./components/stats.js'),
};
start(modules);
afterLoad(() => start(lateModules));
{# r747, base.twig: wskazówki dla pliku wejściowego i arkusza z manifestu Vite (pułapka 10) #}
{% for link in sk_vite_preloads('src/js/app.js') %}{{ tag('link', link) }}{% endfor %}
{# → <link rel="modulepreload" href="…/app-….js" crossorigin> (ten sam tryb CORS co skrypt, inaczej plik pobiera się dwa razy)
     <link rel="preload" as="style" href="…/app-….css"> #}

Do tego r743 usuwa prawdziwe wymuszone przeformatowania: baner zgody najpierw odczytuje wymiary, potem zapisuje style, a składanie karty przy przewijaniu i efekt fali robią pierwszy pomiar w raporcie ResizeObserver, czyli po obliczeniu układu. Strona „O nas” (r744) dostaje kadr filmu w tle jako <img srcset> w AVIF w skali szarości (640w ok. 10 KiB, 1280w ok. 39 KiB zamiast JPEG 150 KiB) z preload na telefonach.

Rezultaty

Produkcja, 03.11.2026; „przed” = PSI 10:27 i Lighthouse 10:36–10:57, „po r740” = PSI 13:05 i Lighthouse 13:09–13:15, „po r747” = PSI 14:21 i Lighthouse 14:23–14:28.

EtykietaPrzed r740Po r740Po r747
PSI właściciela, komputer100 / 100 / 100 / 100, „Przeglądanie agentowe” 3/3100 / 100 / 100 / 100, 3/3100 / 100 / 100 / 100, 3/3
PSI właściciela, telefon99 / 100 / 100 / 100, 3/3100 / 100 / 100 / 100, 3/3100 / 100 / 100 / 100, 3/3
Lighthouse 13.6.0, strona główna, telefon99 / 100 / 100 / 100 w 3 z 3 pomiarów100 / 100 / 100 / 100 w 3 z 3 pomiarów100 / 100 / 100 / 100 w 3 z 3 pomiarów
Lighthouse 13.6.0, strona główna, komputer100 / 100 / 100 / 100 w 3 z 3 pomiarów100 / 100 / 100 / 100 w 3 z 3 pomiarów100 / 100 / 100 / 100 w 3 z 3 pomiarów
LCP telefon / komputer2,25–2,26 s (wynik 0,94) / 0,40 s1,65–1,66 s (wynik 0,99) / 0,36–0,40 s1,50–1,51 s (wynik 1) / 0,36–0,37 s
Element LCP telefonu<p class="reveal"> nad H1<video>, plakat AVIF 26 049 B z preload<img> kadru filmu, AVIF z srcset i preload
FCP telefon / komputer0,97–1,05 s / 0,27–0,29 s0,98–1,02 s / 0,27–0,29 s1,01–1,04 s / 0,27–0,28 s
Speed Index telefon / komputer1,33–1,53 s / 0,52–0,55 s1,20–1,30 s / 0,49–0,55 s1,25–1,35 s / 0,48–0,51 s
TBT / CLS0–29 ms / 0–0,00010–24 ms / 0–0,00010–87 ms / 0–0,0001
Obrazy na telefonie3 pliki, 180,9 KiB (tło 2400w 122 KiB, plakat JPEG 49 KiB)3 pliki, 65,8 KiB (tło 1280w, plakat AVIF)3 pliki, 53,6 KiB
Waga / żądania, telefon1 455 KiB / 181 340 KiB / 181 328 KiB / 18
Diagnostyki, telefonpamięć podręczna 132 KiB, obrazy 11 KiB, blokowanie renderowania, drzewo zależnościblokowanie renderowania (metricSavings 0), drzewo zależnościblokowanie renderowania (metricSavings 0)
Diagnostyki, komputerpamięć podręczna 77 KiB, obrazy 41 KiB, wymuszone przeformatowanie, blokowanie renderowania, drzewo zależnościobrazy 20 KiB, wykrywanie żądań LCP (nowe, pułapka 8), wymuszone przeformatowanie (2 z 3 przebiegów), blokowanie renderowania, drzewo zależnościblokowanie renderowania (metricSavings 0)
Podstrony bez filmu (usługa, kontakt, poradnik, realizacja)100 / 100 / 100 / 100 na obu profilach, LCP telefon 0,91–1,50 s, 158–193 KiB100 / 100 / 100 / 100 na obu profilach (kontakt na telefonie 1 z 3 przebiegów 99), LCP telefon 0,94–1,65 s100 / 100 / 100 / 100 na obu profilach (kontakt na telefonie 3 z 3), LCP telefon 0,95–1,65 s
Podstrona z filmem w tle (/o-nas)telefon 99 (LCP 2,18 s, plakat JPEG 150 KiB), komputer 100telefon 99 w 2 z 2 przebiegów (LCP 2,10 s, ten sam plakat), komputer 100telefon 100 w 3 z 3 (LCP 1,46–1,47 s), komputer 100
JS na stronie głównej5 plików, 8,1 KiB przesłane (wejście 2,19 kB gz)bez zmianbez zmian (chunki filmu i statystyk po load)
CSS1 plik, 12,8 KiB przesłanebez zmianbez zmian
Czcionki5 plików, 81,5 KiBbez zmianbez zmian
Obce domeny000
Agentic Browsing3/3: drzewo dostępności, CLS, llms.txt (WebMCP i manifest ARD nie dotyczą)3/33/3

LCP podstron na telefonie wzrósł po r740 liczbowo (np. realizacja 0,91 → 1,65 s), bo elementem LCP jest teraz właściwa treść (akapit wstępu, zdjęcie projektu), a nie mały link w pasku; wynik metryki zostaje 0,99–1.

Co zostało

Stan po r747 (PSI 03.11.2026 14:21, Lighthouse 14:23–14:28):

Diagnostyka / tematStanDlaczego zostaje albo co dalej
Żądania blokujące renderowanie1 plik CSS, 12,52 kB gz; jedyna podpowiedź na stronie głównejświadomie: asynchroniczny CSS wymaga onload inline, CSP go blokuje; podpowiedź znika tylko przy CSS w HTML, co przy style-src 'self' wymaga skrótów w CSP (pułapka 3; decyzja otwarta); PSI szacuje na telefonie 130 ms, metricSavings w JSON strony głównej to 0 dla FCP i LCP
/o-nas: wykrywanie żądań LCPna obu profilach elementem LCP jest sam <video> filmu w tle (po starcie filmu), nie kadr<video> nie przyjmuje fetchpriority; wynik 100, LCP telefon 1,46–1,47 s; strona pobiera w teście 3,6–3,8 MiB (MP4 HD)
Podstrony: dostarczanie obrazów (telefon)13–43 KiB na stronę (zdjęcia kart i projektów)wynik 100; do przeglądu presetów card przy okazji
Filmystrona główna 1 152 KiB po load, także na telefonieautoodtwarzanie na telefonach zostaje (decyzja właściciela z 03.11.2026)
Kompresjagzip poziom 6 z obrazu bazowego, bez Brotliprzeliczone lokalnie: HTML 18 100 → 15 653 B (Brotli 5) / 13 784 B (Brotli 11), CSS 12 851 → 11 121 B (Brotli 11); nasze zasady przewidują Brotli, PSI (usesCompression) tego nie wymaga
Rezerwowa czcionka z size-adjustbrakCLS 0 bez niej (nasze zasady przewidują dopasowany fallback)
Dane CrUX„Brak danych”sprawdzić w PSI i Search Console po kilku tygodniach ruchu
Naprawione 03.11.2026AVIF bez Cache-Control (r740); wykrywanie żądań LCP na komputerze (r744); dostarczanie obrazów na komputerze, plakat 640 w ramce 293 (r743); wymuszone przeformatowanie (r743 i r747); drzewo zależności sieciowych (r747); /o-nas 99 na telefonie (r744)pozycje zniknęły z raportu i z naszych pomiarów

Wnioski

  • Wynik 100 wynika z naszych ustawień domyślnych: komponent obrazów z presetami, budżet przy kompilacji, ścisła CSP, zero zewnętrznych zasobów. Na stronie z filmem, trzema krojami i WebGL brakowało na telefonie jednego punktu.
  • Element LCP zależy od urządzenia: na komputerze zdjęcie, na telefonie tekst (po poprawce kadr filmu), bo zdjęcie na cały ekran jest tłem. Optymalizacja „pod LCP” wymaga sprawdzenia, kto nim naprawdę jest, na każdym profilu, i to po każdej zmianie: odebranie priorytetu zdjęciu na telefonie dało nową diagnostykę na komputerze.
  • Animacje wejścia z opacity: 0 na elementach pierwszego ekranu przesuwają LCP; ruch bez przezroczystości daje ten sam efekt wizualny bez kosztu.
  • Konfiguracja serwera z obrazu bazowego nie zna każdego formatu: nagłówki cache trzeba sprawdzić curl -I dla każdego typu pliku, który strona wysyła.
  • Część diagnostyk Lighthouse to skutek sposobu liczenia: „wymuszone przeformatowanie” bez źródła może być parsowaniem w tle, a „drzewo zależności” liczy łańcuchy żądań bez preload. Zanim zmieni się kod, warto zajrzeć do śladu.

Szybka strona od początku albo przegląd obecnej

  • Strona firmowa

    Dla firm z kilkoma usługami i realizacjami do pokazania, których klienci przed telefonem porównują oferty w Google.

    Wycena indywidualna

    • osobna podstrona dla każdej usługi, pod frazy wpisywane przez Twoich klientów
    • realizacje ze zdjęciami i krótkim opisem
    • formularz zapytania z wyborem tematu
    • projekt strony głównej do akceptacji przed budową całości
    • podstawy SEO, certyfikat SSL i wersja na telefon

    Co dostajesz

    Bezpłatną wycenę w 24 h: listę podstron, funkcje, termin i cenę netto. Cena zależy od zakresu, dlatego wyceniamy indywidualnie.

  • Bezpłatny przegląd strony

    Gdy masz stronę i nie wiesz, w jakim jest stanie: czy jest bezpieczna, aktualna i czy pomaga zdobywać klientów.

    bezpłatnie

    • certyfikat SSL i ostrzeżenia przeglądarki
    • wersje WordPressa, PHP, wtyczek i motywu
    • kopie zapasowe: czy są i gdzie
    • wygląd i szybkość na telefonie
    • podstawy widoczności w Google

    Co dostajesz

    Krótki raport e-mailem: co działa, co poprawić najpierw i od czego zacząć.

Bezpłatna wycena strony w 24 godziny, bez zobowiązań

Napisz kilka zdań o firmie i o tym, czego potrzebujesz. W ciągu 24 h odpowiemy z zakresem prac i ceną netto. Wolisz rozmowę? Zadzwoń.