backstage/laravel-seo-scanner
Laravel SEO Scanner audits your application's pages for common SEO issues, checking meta tags, titles, headings, links, images, and more. It integrates smoothly into Laravel projects and generates clear reports with actionable recommendations to improve search visibility.
Architecture fit. backstage/laravel-seo-scanner is a conventional Laravel package (service provider, publishable config, artisan entry point, likely an optional dashboard route). That makes it a natural fit for the framework's idioms but also constrains where it belongs in your architecture: it is a build-time / pre-deploy inspection tool, not a request-path component. It inspects rendered HTML — titles, meta descriptions, headings, canonicals, alt text, robots directives, sitemap/robots.txt presence, Open Graph — and produces a per-page score. For a product with Blade-rendered marketing, blog, or catalog pages, that coverage maps directly to the pages that carry organic acquisition value. It is a poor fit for API-only services and a partial fit for Inertia/SPA front ends, where the server response is a shell and the scanner will either see nothing or score the shell.
Integration feasibility. Low friction: composer require --dev, auto-discovery, vendor:publish for config, run against a route list. No schema changes expected (verify), no runtime hooks in the request lifecycle. A Laravel developer should reach a first report in under an hour. The real effort is not installation — it is deciding which routes constitute "your SEO surface" and triaging the resulting findings.
Technical risk.
require-dev tool with no runtime dependency, worst case is a failed CI job or a deleted package.Key questions for the maintainer / spike.
noindex routes handled — excluded, followed, or penalized?Stack fit. Strongest for Laravel apps serving server-rendered, indexable content: marketing sites, blogs, docs, e-commerce category and product pages. Weakest for headless/SPA setups, where you should look at a Lighthouse-based or rendered-DOM tool instead. If the app is mixed, scope the scanner to the server-rendered route group only.
Migration path. None required — the integration is purely additive. Install as a dev dependency, publish config, and remove cleanly by deleting the composer entry. There is no data migration, no middleware to unwind, and no production traffic exposure, which keeps the reversal cost near zero and makes this a safe experiment to run in parallel with existing work.
Compatibility. Validate the package's PHP/Laravel constraints against your current and next-upgrade versions before committing. Add a CI matrix job so the package is tested against the framework versions you actually run; an unmaintained dev tool that breaks on your Laravel 12 upgrade is annoying but tolerable, whereas one that breaks silently (returns a clean score because it scanned nothing) is dangerous — assert on expected page count.
Sequencing.
The critical sequencing principle: never make it blocking until you have run it non-blocking long enough to trust the signal. A flapping SEO gate gets disabled by the team within two sprints and never comes back.
Maintenance. Low ongoing cost — a pinned dev dependency with a config file. The obligations you take on are: tracking upstream releases, re-validating on Laravel major upgrades, and owning the rubric config. Budget a few hours per quarter. Because there are no dependents and no commercial backing, add a contingency note: if the project goes dormant and breaks, the fallback is a short internal check suite or a switch to a rendered-DOM crawler — cheap, because nothing in production depends on it.
Support. GitHub issues only; no SLA, no vendor escalation. This is acceptable precisely because the failure mode is a broken dev tool, not a broken product. Assign a named internal owner so triage doesn't fall through.
Scaling. Cost scales linearly with the number of routes scanned, and each page is an HTTP round trip if the crawler model applies. On a large catalog (thousands of URLs) a full run becomes slow and can generate meaningful load against staging. Mitigations: restrict to canonical, non-parameterized routes; sample large route families; run off-peak or against a dedicated environment; chunk the run in CI. Keep it out of the per-commit critical path for anything beyond the curated allowlist.
Failure modes to instrument.
Ramp-up. Half a day for a Laravel developer to install, run, and interpret; the remaining effort is product judgment about which pages matter and which warnings to accept. Communicate to stakeholders that this is a regression guardrail — it catches missing titles, duplicate meta descriptions, and absent alt text before they ship — and explicitly not a ranking improvement tool. Framing it that way prevents the predictable "our SEO score went up, where's the traffic" conversation, and keeps the investment sized to what it actually delivers.
How can I help you explore Laravel packages today?