* Drop EOL PHP and Laravel versions
Drops support for PHP 8.1 (EOL Dec 2025) and Laravel 9/10/11 (Laravel 11
EOL March 2026). The supported matrix is now PHP 8.2-8.5 and Laravel
12 + 13 (Laravel 13 support is added in the same pass, as it was missing
from the constraints).
- composer.json: php ^8.2-^8.5, illuminate/contracts ^12|^13,
symfony ^7|^8, testbench ^10|^11, pest ^3|^4, phpunit ^11|^12,
collision ^8, and switch abandoned nunomaduro/larastan to
larastan/larastan
- run-tests.yml: matrix PHP 8.2-8.5 x Laravel 12/13 (L13 requires
PHP >= 8.3, so 8.2 is excluded there)
- README: minimum requirements updated
- phpunit.xml.dist: migrated off the deprecated PHPUnit 9 schema
- Fix three tests that relied on scheme-less URLs slipping through
Http::fake() as real requests (rejected by current Guzzle)
- JavascriptSizeCheck: explicit attr() return in each() closure
(PHPStan level 5 with symfony/dom-crawler 8)
Verified green on both matrix corners: Laravel 13.15/PHPUnit 12/Pest 4
(prefer-stable) and Laravel 12/PHPUnit 11/Pest 3 (prefer-lowest), plus
PHPStan.
* Add CanonicalCheck
Checks for a canonical URL (<link rel="canonical">) and verifies it is
not a broken link. Includes translations (en, nl, de, fr, pt_BR), tests
and README entry.
* Add ViewportCheck
Checks for a viewport meta tag containing width=device-width, which is
important for mobile-first indexing. Includes translations (en, nl, de,
fr, pt_BR), tests and README entry.
* Add CharsetCheck
Checks that the page declares a character encoding via <meta charset>
or an http-equiv Content-Type header. Includes translations (en, nl,
de, fr, pt_BR), tests and README entry.
* Add FaviconCheck
Checks that the page references a favicon (<link rel="icon">) and that
it is not a broken link. Includes translations (en, nl, de, fr, pt_BR),
tests and README entry.
* Add StructuredDataCheck
Checks that the page contains at least one valid JSON-LD structured data
block, which helps search engines understand the content and can enable
rich results. Includes translations (en, nl, de, fr, pt_BR), tests and
README entry.
* Add OpenGraphCompletenessCheck
Checks that the core Open Graph tags (og:title, og:description, og:url,
og:type) are present, complementing the existing Open Graph image check.
Includes translations (en, nl, de, fr, pt_BR), tests and README entry.
* Add TwitterCardCheck
Checks that the page defines a twitter:card meta tag so it renders as a
rich card when shared on X (Twitter). Includes translations (en, nl, de,
fr, pt_BR), tests and README entry.
* Add HeadingStructureCheck
Checks that headings do not skip levels (e.g. an h2 followed by an h4),
which keeps the document outline logical for search engines and assistive
technologies. Includes translations (en, nl, de, fr, pt_BR), tests and
README entry.
* Add ImageDimensionsCheck
Checks that images declare explicit width and height attributes, which
reserves layout space during loading and prevents cumulative layout
shift (CLS). Includes translations (en, nl, de, fr, pt_BR), tests and
README entry.
* Add LazyLoadingCheck
Checks that below-the-fold images use loading="lazy" (the first image
may load eagerly), deferring offscreen image loading to improve initial
page load. Includes translations (en, nl, de, fr, pt_BR), tests and
README entry.
* Add HreflangCheck
Validates hreflang annotations on multilingual pages: pages without
hreflang are not penalised, but invalid language codes are flagged.
Includes translations (en, nl, de, fr, pt_BR), tests and README entry.
* Add ModernImageFormatCheck
Flags images served in legacy formats (JPEG, PNG, GIF) without a modern
alternative; images in WebP/AVIF, with a modern srcset, or inside a
<picture> element pass. Includes translations (en, nl, de, fr, pt_BR),
tests and README entry.