PHPackages                             aryaazadeh/laravel-seo-audit - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. aryaazadeh/laravel-seo-audit

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

aryaazadeh/laravel-seo-audit
============================

This is my package laravel-seo-audit

v1.0.10(2mo ago)013↓75%MITPHPPHP ^8.3CI passing

Since Feb 24Pushed 2mo agoCompare

[ Source](https://github.com/AryanpAzadeh/laravel-seo-audit)[ Packagist](https://packagist.org/packages/aryaazadeh/laravel-seo-audit)[ Docs](https://github.com/aryaazadeh/laravel-seo-audit)[ GitHub Sponsors](https://github.com/AryaAzadeh)[ RSS](/packages/aryaazadeh-laravel-seo-audit/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (16)Versions (13)Used By (0)

Laravel SEO Audit
=================

[](#laravel-seo-audit)

[![Latest Version on Packagist](https://camo.githubusercontent.com/2b7a8c836c4356b2e03d8382c04baa3f27f939d7477b9f8c649ea39f40757b83/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f61727961617a616465682f6c61726176656c2d73656f2d61756469742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/aryaazadeh/laravel-seo-audit)[![GitHub Tests Action Status](https://camo.githubusercontent.com/053a973878af6d0ec17c8604bb06796505e04b437a55aa22482792c268e0ba0f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f61727961617a616465682f6c61726176656c2d73656f2d61756469742f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/aryaazadeh/laravel-seo-audit/actions?query=workflow%3Arun-tests+branch%3Amain)

Developer-first SEO auditing for Laravel apps with deterministic checks, report persistence, and a protected dashboard.

Installation
------------

[](#installation)

```
composer require aryaazadeh/laravel-seo-audit
```

Publish migrations and config:

```
php artisan vendor:publish --tag="seo-audit-migrations"
php artisan vendor:publish --tag="seo-audit-config"
php artisan migrate
```

CLI Usage
---------

[](#cli-usage)

Primary command:

```
php artisan seo:audit
```

Legacy alias (kept for backwards compatibility):

```
php artisan laravel-seo-audit
```

Useful options:

```
php artisan seo:audit --format=json --fail-on=error --output=storage/app/seo-report.json --max-pages=100
```

- `--format=table|json|html`
- `--fail-on=error|critical`
- `--output=path`
- `--max-pages=int`

Exit codes:

- `0`: pass
- `2`: error threshold reached
- `3`: critical threshold reached

Dashboard
---------

[](#dashboard)

Route: `/seo-audit/dashboard`

Default protection:

- middleware: `web`, `auth`
- ability: `viewSeoAudit`

You can configure both in `config/seo-audit.php`.

Dashboard capabilities:

- Select any recent run from the run switcher.
- Track score trend across recent runs.
- Inspect high-risk pages and rule-level issue share.
- Filter issues by `severity`, `rule`, and text query (`q`/`search`) with pagination.
- Apply text search to high-risk pages as well (URL and title matching).
- View separate `technical_score` and `content_score` beside the overall score.

Content SEO (Yoast-like)
------------------------

[](#content-seo-yoast-like)

The package can run deterministic content checks and suggestions in addition to technical checks.

Content checks include:

- Title length quality
- Meta description length quality
- Thin content detection (word count)
- Missing H2 subheadings on long pages
- Missing image alt coverage
- Low internal linking on long pages
- Focus keyword presence in title/meta/H1/opening paragraph

Enable/adjust in `config/seo-audit.php`:

```
'content' => [
    'enabled' => true,
    'site_name' => 'MYSITE',
    'title' => ['min' => 30, 'max' => 60],
    'meta_description' => ['min' => 120, 'max' => 160],
    'min_word_count' => 300,
    'focus_keywords' => [
        '/fa/products/*' => 'محصولات',
        '/en/products/*' => 'products',
        // 'regex:/^\\/fa\\/blog\\/.+/' => 'وبلاگ',
    ],
],
```

Suggestions are attached to each issue in `context`, for example:

- `suggested_title`
- `suggested_meta_description`
- `recommendation`
- `missing_in` (for focus keyword placements)

Route Crawl Controls
--------------------

[](#route-crawl-controls)

For multilingual apps and dynamic endpoints, these options help keep reports clean:

- `crawl.exclude_parameterized_routes` (default: `true`) skips routes like `/products/{slug}`.
- `crawl.deduplicate_localized_routes` (default: `true`) deduplicates locale-prefixed duplicates (for example `/fa/about-us` and `/about-us`).
- Internal route redirects are followed before SEO rules are evaluated (for example `/products` -&gt; `/fa/products`).
- `crawl.route_http_fallback_on_error` (default: `true`) retries route-based targets via real HTTP when internal CLI kernel matching returns `4xx/5xx` unexpectedly.
- `crawl.link_discovery.enabled` (default: `false`) discovers extra internal links from crawled HTML pages (useful for dynamic slug pages and old content archives).
- `crawl.link_discovery.seed_paths` controls where discovery starts (default: `['/']`).
- `crawl.link_discovery.max_pages` limits discovery fetches (default: `120`).
- `crawl.sitemap_discovery.enabled` (default: `false`) imports URLs from sitemap files (`urlset` and `sitemapindex`) for broad historical coverage.
- `crawl.sitemap_discovery.seed_paths` controls which sitemap files are loaded first (default: `['/sitemap.xml', '/sitemap_index.xml']`).
- `crawl.sitemap_discovery.max_urls` caps the number of sitemap URLs added to the crawl queue (default: `1000`).

AI Layer (v1 Boundary)
----------------------

[](#ai-layer-v1-boundary)

The package exposes an AI provider contract but ships with a safe null provider by default.

- interface: `AryaAzadeh\LaravelSeoAudit\Contracts\LlmProviderInterface`
- default binding: `NullLlmProvider`
- feature flag: `seo-audit.ai.enabled`

Testing
-------

[](#testing)

```
composer test
```

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance84

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

12

Last Release

81d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/7ab22cb5cf44f19ef1caeb30ad907c2a314223584e0a799b976fa49192a451b9?d=identicon)[AryanpAzadeh](/maintainers/AryanpAzadeh)

---

Top Contributors

[![AryanpAzadeh](https://avatars.githubusercontent.com/u/56971831?v=4)](https://github.com/AryanpAzadeh "AryanpAzadeh (31 commits)")

---

Tags

laravelAryaAzadehlaravel-seo-audit

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/aryaazadeh-laravel-seo-audit/health.svg)

```
[![Health](https://phpackages.com/badges/aryaazadeh-laravel-seo-audit/health.svg)](https://phpackages.com/packages/aryaazadeh-laravel-seo-audit)
```

###  Alternatives

[spatie/laravel-data

Create unified resources and data transfer objects

1.8k28.9M627](/packages/spatie-laravel-data)[spatie/laravel-livewire-wizard

Build wizards using Livewire

4061.0M4](/packages/spatie-laravel-livewire-wizard)[hirethunk/verbs

An event sourcing package that feels nice.

513162.9k6](/packages/hirethunk-verbs)[worksome/exchange

Check Exchange Rates for any currency in Laravel.

123544.7k](/packages/worksome-exchange)[ralphjsmit/livewire-urls

Get the previous and current url in Livewire.

82270.3k4](/packages/ralphjsmit-livewire-urls)[hydrat/filament-table-layout-toggle

Filament plugin adding a toggle button to tables, allowing user to switch between Grid and Table layouts.

6292.3k1](/packages/hydrat-filament-table-layout-toggle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
