georgringer / linkvalidator2
LinkValidator (rewrite) - Checks links in records and reports broken ones.
Package info
github.com/georgringer/linkvalidator2
Type:typo3-cms-extension
pkg:composer/georgringer/linkvalidator2
Fund package maintenance!
Requires
- php: >= 8.4 < 8.6
- typo3/cms-backend: ^14.3 || 15.0.*@dev
- typo3/cms-core: ^14.3 || 15.0.*@dev
- typo3/cms-frontend: ^14.3 || 15.0.*@dev
Requires (Dev)
- typo3/cms-dashboard: ^14.3 || 15.0.*@dev
- typo3/testing-framework: dev-main
Suggests
- typo3/cms-dashboard: Widget with the pages with the most broken links
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-21 19:39:19 UTC
README
A rewrite of the TYPO3 system extension linkvalidator, developed as a local extension
first. Once complete it replaces typo3/sysext/linkvalidator under the extension key
linkvalidator. Status: work in progress. It can be tested on TYPO3 14.3 LTS next to the
core linkvalidator.
composer require georgringer/linkvalidator2:dev-main vendor/bin/typo3 extension:setup
Requires TYPO3 14.3 or main, PHP 8.4 or 8.5. Documentation: Documentation/
(editors, integrators, developers). Design decisions: Notes/ (German).
Flow diagrams: claude.ai (German).
What it does
- Finds links in records from the TCA schema: link fields, rich text, plain URLs, shortcut pages.
- Resolves each link with the core
LinkServiceand checks it with a checker per link type. - Stores one result per target, the places with a problem and a status per record (which is also the work queue).
- Shows the result in the module Link Management > Check Links (new), the rich text editor, the page module, a dashboard widget and a mail report.
Usage
# check one record, print every link and its result bin/typo3 linkvalidator2:check --record=tt_content:471 # check a page and its subpages right away bin/typo3 linkvalidator2:check --page=1287 --depth=99 # message queue: queue a page tree, a worker checks it bin/typo3 linkvalidator2:fillqueue 1287 bin/typo3 messenger:consume linkvalidator2_priority doctrine --time-limit=240 # mail broken links of an area, here only those broken for a week bin/typo3 linkvalidator2:report 1287 --depth=99 --to=editor@example.org --min-age="7 days"
In the backend: select a page, choose the levels and press Check links. Settings are in the
extension configuration (ext_conf_template.txt).
Tests
Standalone in containers, independent of the surrounding core checkout:
Build/Scripts/runTests.sh -s composerInstall
Build/Scripts/runTests.sh -s unit
Build/Scripts/runTests.sh -s functional # sqlite, or -d mariadb|mysql|postgres
Test data for a local instance: Notes/seed-testdata.php (every kind of broken link below
page 1287) and Notes/seed-bigtree.php (about 5,000 content elements for load tests).
Feature comparison
โ yes ยท ๐ก partly ยท โ no ยท โ not on purpose ยท โ not verified ยท ๐ planned
The linkvalidator column names the Forge issue where the core has a known problem.
Details and explanations: Notes/2026-10-21-feature-comparison-full.md.
| Feature | linkvalidator | brofix | linkvalidator2 |
|---|---|---|---|
| Finding links | |||
| Fields derived from TCA | โ list in TSconfig #96447 | โ | โ |
| Opt-out of tables / fields | ๐ก | โ | โ |
| FlexForms | โ | ๐ก | ๐ |
| Shortcut pages | โ #92542 | โ | โ |
| Plain-text URLs | ๐ก #97937 |
โ | โ |
| Custom link types | ๐ก #94086 | โ | โ |
| Hidden source records | ๐ก option | ๐ก option | โ |
| Source hidden by its page | โ #96447 | โ | ๐ |
| Translation of a hidden original | โ #94195 | โ | ๐ |
| Workspaces | โ | ๐ก live only | ๐ required |
| Checking | |||
| Pages, records, files, folders | โ | โ | โ |
Page hidden via parent (extendToSubpages) |
๐ก #101367 fix in review (96918), #106675 | โ | โ |
| Restricted or scheduled target as notice | โ | โ | โ |
| Shortcut / link page without reachable target | โ #92542 | โ | โ |
| Empty or unresolvable links | โ | โ | โ |
Anchors (#c123) |
๐ก #100933 | โ | โ |
| External URLs | ๐ก off by default | โ | โ |
| Result cache across runs | โ #92700 | โ | โ |
| 401/403/429/5xx/TLS/timeout as "unknown" | โ #96525 #85006 | โ | โ |
| Full error message | ๐ก #101935 | โ | โ |
| Escalate "unknown" to broken | โ | โ | ๐ |
Polite crawling (delay, Retry-After) |
๐ก user agent #89287 | โ | ๐ก user agent |
| Exclusions | |||
| Exclude URLs, domains, pages | โ #85127 | โ | โ |
| "Ignore" from the report | โ #92822 | โ | โ |
| Running checks | |||
| Scheduler / command | โ task | โ command | โ command |
| Message queue, parallel workers | โ | โ | โ |
| Checking large trees in the browser | โ timeouts #89266 | โ | โ |
| Recheck on save | ๐ก | ๐ก | โ |
| Results of hidden records removed | โ #105911 | โ | โ |
| Cleanup on delete / move | โ #89426 | โ delete | โ |
| Parallel runs locked | โ #89266 | โ | ๐ก |
| Backend | |||
| Filter, sort, paginate | ๐ก #89454 | โ | โ |
| Editors see only what they may fix | ๐ก #105413 #104004 | โ | โ |
| Recheck a single link | โ | โ | โ |
| Markers in the rich text editor | ๐ก | ๐ก | โ |
| Page module callout | โ | โ | โ |
| Dashboard widget | โ | โ | โ |
| Mail report | โ #106487 #106677 | โ | โ |
| Configuration and extending | |||
| Configuration | Page TSconfig | TSconfig + ext. conf. | ext. conf., ๐ site settings |
| PSR-14 events | โ 2 | ๐ก | ๐ |
Sources: core typo3/sysext/linkvalidator on main and brofix backup/brofix. Cells marked
๐ก or โ differ in detail or are not verified, check the code before relying on them.
Open Forge issues: Resources/Private/Issues/.