PHPackages                             fell-mere/craft-brokenlinks - 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. fell-mere/craft-brokenlinks

ActiveCraft-plugin[Utility &amp; Helpers](/categories/utility)

fell-mere/craft-brokenlinks
===========================

Scans your Craft CMS site for broken links and displays results in the Control Panel.

1.2.1(2w ago)001proprietaryPHPPHP &gt;=8.2CI passing

Since Jun 27Pushed 2w ago1 watchersCompare

[ Source](https://github.com/fell-mere/broken-link-checker)[ Packagist](https://packagist.org/packages/fell-mere/craft-brokenlinks)[ Docs](https://github.com/fell-mere/broken-link-checker)[ RSS](/packages/fell-mere-craft-brokenlinks/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (4)Dependencies (6)Versions (10)Used By (0)

Broken Links
============

[](#broken-links)

A Craft CMS plugin that scans your site for broken links by crawling each entry's rendered page and checking every outbound link with a HEAD request. Results are stored in the database and viewable in the Control Panel.

Requirements
------------

[](#requirements)

- Craft CMS 5.5.0 or later
- PHP 8.2 or later

Features
--------

[](#features)

- **Background scanning** — scans run as Craft queue jobs, so large sites won't time out
- **Incremental scans** — by default only re-scans entries updated since the last completed scan; force a full scan when needed
- **Configurable batch size** — control how many entries are processed per queue job
- **Dashboard widget** — shows a summary of broken links on the Craft dashboard
- **Export** — download results as a CSV
- **Console command** — trigger scans from the CLI (useful for cron jobs)

Screenshots
-----------

[](#screenshots)

The Broken Links page in the Control Panel — start an incremental scan, force a full scan, open advanced options, or clear stored data:

[![Broken Links control panel](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/overview.png)](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/overview.png)

Every broken link in the Control Panel, with its status, link text, page, and entry:

[![Broken links results in the Control Panel](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/results.png)](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/results.png)

The dashboard widget surfaces a count and the most recent broken links:

[![Broken Links dashboard widget](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/widget.png)](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/widget.png)

Advanced options let you tune the batch size per queue job:

[![Advanced scan options](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/advanced.png)](https://raw.githubusercontent.com/fell-mere/broken-link-checker/main/resources/screenshots/advanced.png)

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

[](#installation)

#### With Composer

[](#with-composer)

```
cd /path/to/my-project

composer require fell-mere/craft-brokenlinks

./craft plugin/install brokenlinks
```

Usage
-----

[](#usage)

### Control Panel

[](#control-panel)

Navigate to **Broken Links** in the CP sidebar. Access requires the **Manage broken links** permission, which can be granted per user group under **Settings → Users → Permissions** (admins have it automatically).

ButtonDescriptionStart New ScanScans only entries updated since the last completed scanForce Full ScanScans all entries regardless of last updated dateAdvanced OptionsSet a custom batch size (default: 100 entries per job)View QueueOpens the Craft queue manager to monitor progressClear All DataDeletes all stored broken link records and scan historyResults can be exported as a **CSV** from the results table.

### Ignore List

[](#ignore-list)

Some domains block automated requests (for example with a Cloudflare 403) and show up as noise on every scan. To silence them, click **Ignore** next to a result — the domain is added to the ignore list and its existing records are removed — or manage patterns manually via the **Ignore List** button. One pattern per line; any link URL containing a pattern is skipped during scans. Patterns are stored in the database, so the list works in production regardless of the `allowAdminChanges` setting.

### Console

[](#console)

```
# Run an incremental scan (only updated entries)
./craft broken-links/scan

# Force a full scan of all entries
./craft broken-links/scan --force-full-scan

# Set a custom batch size
./craft broken-links/scan --batch-size=50

# Wait for the scan to complete before exiting (useful in CI)
./craft broken-links/scan --wait

# Check the status of the latest scan
./craft broken-links/status

# Check the status of a specific scan by ID
./craft broken-links/status 42

# Clear all stored data
./craft broken-links/clear-data
```

### Scheduling (cron)

[](#scheduling-cron)

`broken-links/scan` only *queues* the work — a queue runner must process it. Either run a persistent worker (`./craft queue/listen`) or pair the scan with `./craft queue/run`:

```
# Nightly incremental scan
0 2 * * *   cd /path/to/project && ./craft broken-links/scan
# Process the queue (omit if you run a persistent worker)
*/5 * * * * cd /path/to/project && ./craft queue/run
```

> `--wait` polls the scan's status but does **not** run the queue, so it's only useful when a worker is already running.

### Dashboard Widget

[](#dashboard-widget)

Add the **Broken Links** widget to your Craft dashboard. It shows the count of broken links found in the last scan and links directly to the full results. Configure the number of links shown via the widget settings.

How It Works
------------

[](#how-it-works)

1. A **GenerateSitemapJob** fetches all matching entry IDs and splits them into batches.
2. Each batch becomes a **CheckBrokenLinksJob** that:
    - Fetches the rendered HTML of each entry's public URL
    - Extracts all `` links
    - Sends a HEAD request to each link
    - Saves any link returning HTTP 400+ or that is unreachable
3. Results accumulate in the database across batches; the scan is marked complete once **every** batch has finished. Completion is tracked with an atomic per-scan counter, so it stays correct even with multiple concurrent queue workers.

Notes
-----

[](#notes)

- Scans cover enabled entries on the **primary site**.
- Only `http://` and `https://` links are checked; `mailto:`, `tel:`, anchor, and relative links are skipped.
- Each HTTP request has a 5-second timeout. Unreachable hosts (connection refused, DNS failure, etc.) are recorded separately from HTTP error responses.
- **SSRF protection:** links that resolve to private, loopback, or otherwise reserved IP addresses are skipped, *except* links pointing at your own site's hostname — so internal links are still checked while requests to internal infrastructure are blocked.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance97

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 95.8% 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 ~9 days

Total

4

Last Release

17d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3994671?v=4)[Fellmere](/maintainers/Fellmere)[@fellmere](https://github.com/fellmere)

---

Top Contributors

[![CraigClem](https://avatars.githubusercontent.com/u/81166917?v=4)](https://github.com/CraigClem "CraigClem (23 commits)")[![john-henry](https://avatars.githubusercontent.com/u/44709?v=4)](https://github.com/john-henry "john-henry (1 commits)")

---

Tags

cmsCraftcraftcmscraft-pluginseolink-checkerbroken-links

### Embed Badge

![Health badge](/badges/fell-mere-craft-brokenlinks/health.svg)

```
[![Health](https://phpackages.com/badges/fell-mere-craft-brokenlinks/health.svg)](https://phpackages.com/packages/fell-mere-craft-brokenlinks)
```

###  Alternatives

[nystudio107/craft-seomatic

SEOmatic facilitates modern SEO best practices &amp; implementation for Craft CMS 5. It is a turnkey SEO system that is comprehensive, powerful, and flexible.

1741.5M73](/packages/nystudio107-craft-seomatic)[verbb/formie

The most user-friendly forms plugin for Craft.

101400.6k78](/packages/verbb-formie)[verbb/hyper

A user-friendly links field for Craft.

24153.5k14](/packages/verbb-hyper)[verbb/vizy

A flexible visual editor field for Craft.

4251.5k1](/packages/verbb-vizy)[verbb/comments

Add comments to your site.

13754.0k1](/packages/verbb-comments)[vaersaagod/seomate

SEO, mate! It's important.

4443.4k3](/packages/vaersaagod-seomate)

PHPackages © 2026

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