priebera / typo3-a11y-quality-gate
TYPO3-native accessibility checker and quality gate: WCAG-related checks for CKEditor content, TYPO3 records, rendered pages and browser scans, with issue management and publishing safeguards.
Package info
github.com/priebera1/typo3-a11y-quality-gate
Type:typo3-cms-extension
pkg:composer/priebera/typo3-a11y-quality-gate
Requires
- php: ^8.2
- mpdf/mpdf: ^8.2
- typo3/cms-backend: ^13.4 || ^14.3
- typo3/cms-core: ^13.4 || ^14.3
- typo3/cms-frontend: ^13.4 || ^14.3
- typo3/cms-rte-ckeditor: ^13.4 || ^14.3
- typo3/cms-scheduler: ^13.4 || ^14.3
Requires (Dev)
- dg/bypass-finals: ^1.8
- friendsofphp/php-cs-fixer: ^3.0
- phpunit/phpunit: ^11.5 || ^12.0
- typo3/testing-framework: ^9.4
Suggests
- ext-sodium: Required for encrypted remote-access passwords and per-site AI provider keys.
Provides
None
Conflicts
None
Replaces
None
README
Accessibility Quality Gate (AQG) is a TYPO3-native accessibility checker and quality gate. It runs WCAG-related checks on editor content, on the rendered page and in a real browser, keeps every finding attached to the TYPO3 record that caused it, and can warn or block publishing while open findings exceed your thresholds.
AQG automates the repeatable part of accessibility testing inside the editorial workflow. It does not replace manual testing and does not certify conformance — see Scope.
Product · Documentation · Pricing · Free Trial · Support · Packagist · TER
Install
composer require priebera/typo3-a11y-quality-gate ./vendor/bin/typo3 extension:setup
Supports TYPO3 13.4 LTS and TYPO3 14.3+.
Features
Free — no licence key required
- CKEditor 5 inline highlighting for accessibility issues
- Backend overview and page detail modules
- Issue tracking with ignore / unignore workflow and expiry dates
- Stable issue fingerprints across rescans
- Batch ignore workflow with required reason confirmation
- Per-rule enable / disable in Settings
- Manual scans via backend module and CLI
- Automated local scans via TYPO3 Scheduler
- Changed-only scan mode for incremental rescans
- Quality gate warning mode on page publish / unhide; editors can continue after reviewing the warning
- Free Remote Preview — a limited daily browser-based frontend scan with axe-core (current limits are shown in the module)
- FREE rendered page check — inspects the server-rendered HTML of a page; runs for backend page and site scans and for single-page CLI/Scheduler runs
- CSV export
- TCA-based field discovery for
tt_contentRTE and file fields - Settings module for enabling and disabling scanned fields
- Built-in rules that help identify common WCAG 2.1 AA-related accessibility issues in RTE content, structured fields and rendered HTML
Trial / PRO / Agency
- Remote browser accessibility scans via Playwright + axe-core
- Remote browser scan results with issue breakdown and screenshot preview
- Remote CSV export
- Per-site quality gate configuration
- Quality gate blocking mode on publish / unhide
- Scan history and comparison of compatible scans (same site, scope, scan type, language and start URL)
The trial runs for 5 days with up to 10 pages per frontend scan and 5 frontend scans per day.
PRO / Agency
- PDF export for overview and page detail reports
- AI-assisted alt text, link text and iframe title suggestions (bring your own OpenAI key; editors review every suggestion)
- Accessibility Statement Draft Assistant based on a completed frontend site scan
- Verify fix — from a frontend finding, scan that page again and see Resolved, Still present or Not verified; a failed or incomplete scan never counts as resolved
- Scheduled monitoring —
a11y:monitorscans a site on a schedule and e-mails only when new or worse issues appear, or when a scan is incomplete or failed - Acceptance evidence — a PDF/CSV comparing a baseline and a current scan (fixed, new, still open, not compared) for clients and stakeholders
Agency
- Several client TYPO3 installations on one licence: each installation is enrolled as its own project on its first validation, up to the licence's project limit, with its own scans and history
- Project slots are managed in the customer portal
- Monitoring several sites in one
a11y:monitorrun
Plan details, trial access and pricing:
- Trial: https://typo3.priebera.sk/trial
- Pricing: https://typo3.priebera.sk/pricing
Requirements
- TYPO3 13.4 LTS or TYPO3 14.3+
- PHP 8.2 or higher
- No additional services required for the Free version
Screenshots
Overview
Page detail
CKEditor inline highlighting
Links
Compatibility
| Version | TYPO3 | PHP | Support |
|---|---|---|---|
| 2.0+ | 13.4 LTS / 14.3+ | 8.2+ | Features and bugfixes |
| 1.4 – 1.9 | 13.4 LTS / 14.3+ | 8.2+ | Superseded by 2.0 (same requirements; see the upgrade notes) |
| 1.3.x | 13.4 LTS | 8.2+ | Security and bugfixes |
Built-in rules
AQG includes rules across three categories. For the full reference with WCAG mappings and fix guidance see the documentation: https://typo3.priebera.sk/docs/rules-reference
RTE rules — CKEditor and RTE HTML content
| Rule ID | Severity | WCAG |
|---|---|---|
rte.img_alt_missing |
Critical | 1.1.1 |
rte.img_alt_is_filename |
Warning | 1.1.1 |
rte.img_alt_too_long |
Warning | 1.1.1 |
rte.img_alt_redundant_phrase |
Warning | 1.1.1 |
rte.empty_heading |
Critical | 1.3.1 |
rte.empty_link |
Critical | 2.4.4 |
rte.button_label_missing |
Critical | 4.1.2 |
rte.form_control_missing_label |
Critical | 4.1.2 / 3.3.2 |
rte.table_missing_header |
Warning | 1.3.1 |
rte.table_th_missing_scope |
Warning | 1.3.1 |
rte.table_missing_caption |
Info | 1.3.1 |
rte.duplicate_id |
Warning | 1.3.1 |
rte.svg_missing_title |
Warning | 1.1.1 |
rte.iframe_missing_title |
Critical | 4.1.2 |
rte.image_in_link_missing_alt |
Critical | 1.1.1 / 2.4.4 |
rte.marquee_or_blink |
Critical | 2.2.2 |
rte.non_descriptive_link |
Warning | 2.4.4 |
rte.heading_hierarchy_jump |
Warning | 1.3.1 |
rte.link_new_window_no_warning |
Warning | 3.2.2 |
rte.link_text_is_url_or_filename |
Warning | 2.4.4 |
rte.link_to_document |
Needs review | 2.4.4 |
rte.link_to_document_missing_notice |
Info | 2.4.4 |
rte.link_text_duplicate_different_targets |
Warning | 2.4.4 |
Structured rules — TCA field values
| Rule ID | Severity | WCAG |
|---|---|---|
structured.file_reference_alt |
Critical | 1.1.1 |
structured.file_reference_alt_quality |
Warning | 1.1.1 |
structured.header_ctype_empty |
Warning | 1.3.1 |
structured.header_link_no_text |
Critical | 2.4.4 / 4.1.2 |
structured.header_level_is_h1 |
Needs review | 1.3.1 |
structured.uploads_file_missing_description |
Warning | 2.4.4 |
structured.table_missing_caption |
Info | 1.3.1 |
structured.form_placeholder_as_label |
Warning | 1.3.1 / 3.3.2 |
structured.form_field_label_missing |
Critical | 1.3.1 / 3.3.2 |
structured.form_autocomplete_missing |
Warning | 1.3.5 |
structured.media_no_transcript_hint |
Needs review | 1.2.1 |
Some structured rules may adjust severity depending on the detected case, for example missing alternative text versus title-only fallback.
Rendered HTML rules — FREE, server-rendered HTML only
Rendered checks run for Scan this page and Scan site in the backend, and
for CLI or Scheduler runs that target a single page (--page-uid / page UID).
Subtree CLI and Scheduler runs apply the local rules only. They are always
skipped in changed-only mode, when the rendered check is disabled in the
ruleset, and for page doktypes that do not deliver a frontend page.
They inspect the final server-rendered HTML returned by TYPO3 and do not execute JavaScript, AJAX or lazy-loaded content.
| Rule ID | Severity | WCAG |
|---|---|---|
rendered.img_missing_alt |
Critical | 1.1.1 |
rendered.empty_link |
Critical | 2.4.4 |
rendered.empty_button |
Critical | 4.1.2 |
rendered.empty_heading |
Critical | 1.3.1 |
rendered.iframe_missing_title |
Critical | 4.1.2 |
rendered.form_control_missing_label |
Critical | 4.1.2 / 3.3.2 |
rendered.duplicate_id |
Warning | 1.3.1 |
rendered.table_missing_header |
Warning | 1.3.1 |
rendered.table_empty_header |
Warning | 1.3.1 |
rendered.svg_missing_accessible_name |
Warning | 1.1.1 |
rendered.html_lang_missing |
Warning | 3.1.1 |
rendered.page_title_missing |
Warning | 2.4.2 |
rendered.main_landmark_missing |
Needs review | 1.3.1 |
rendered.landmark_unique |
Needs review | 1.3.1 |
Installation and setup
composer require priebera/typo3-a11y-quality-gate
Then run TYPO3 extension setup and flush caches:
./vendor/bin/typo3 extension:setup ./vendor/bin/typo3 cache:flush
Next:
- Open the Accessibility Quality Gate module in the TYPO3 backend
- Review the automatically discovered fields in Settings → Scan fields (use Refresh fields after adding TCA fields)
- Configure a Scheduler task or run scans manually via backend module or CLI
For full setup and usage instructions see the documentation: https://typo3.priebera.sk/docs
Configuration
Field settings
In the Settings module you can:
- refresh supported fields from TCA
- enable or disable individual fields and rules
- control which fields are included in future scans
Changes are applied only after clicking Save settings.
Quality Gate
A default ruleset is created automatically on first use.
| Field | Description |
|---|---|
threshold_critical |
Maximum allowed open critical issues |
threshold_warning |
Maximum allowed open warnings (-1 disables the warning threshold) |
publish_mode |
0 = disabled, 1 = warn, 2 = block (PRO) |
For site-specific rulesets set site_identifier to match the TYPO3 site
configuration identifier.
CLI usage
# Scan a subtree ./vendor/bin/typo3 a11y:scan --root-pid=1 # Scan a single page ./vendor/bin/typo3 a11y:scan --page-uid=42 # Scan changed content only ./vendor/bin/typo3 a11y:scan --root-pid=1 --changed-only # Scan a specific language ./vendor/bin/typo3 a11y:scan --root-pid=1 --language=1
Scheduled frontend monitoring (PRO / Agency)
./vendor/bin/typo3 a11y:monitor --site=main --notify=web@example.org --backend-url=https://cms.example.org
In the TYPO3 Scheduler, add the task Accessibility monitoring (AQG PRO/Agency) (daily or weekly): it offers the
configured sites and the languages enabled for the selected site, plus the recipients and limits. Each run scans the site,
compares the result with the previous compatible scan and mails the recipients only when new or worse issues appear,
or when the scan was incomplete or failed. An unchanged result is not mailed again. A run that finds the previous
monitoring scan still running waits for it instead of starting another one. Several --site options (or
--site=all) need an Agency licence.
Backend User TSconfig
options.a11y_quality_gate {
showToolbarItem = 1
showScanAll = 1
showScanNow = 1
}
| Option | Default | Description |
|---|---|---|
showToolbarItem |
1 |
Show the AQG item in the TYPO3 backend toolbar |
showScanAll |
1 |
Allow site scans ("Scan site", content and frontend) |
showScanNow |
1 |
Allow single-page scans ("Scan this page", the Free Remote Preview and Verify fix) |
These options gate the actions server-side as well. In addition, every result follows TYPO3 page permissions: page findings need read access to the page, site-wide results (Overview, site scans, statements) need read access to the site root, and scanning or cancelling needs edit access to the page or site root.
Scope
AQG helps teams identify common accessibility issues early in the TYPO3 editorial workflow. It is not a legal certification tool and cannot guarantee WCAG, EAA, BITV or any other accessibility compliance on its own.
The Free rendered page check analyzes server-rendered HTML only. It does not execute JavaScript, wait for AJAX or lazy-loaded content, interact with cookie banners or take screenshots. Browser-based frontend scans with axe-core run in the AQG remote scanner, either as the limited daily Free Remote Preview or with a Trial, PRO or Agency licence; screenshots need a Trial, PRO or Agency licence.
Accessibility Quality Gate does not replace a full accessibility audit, keyboard testing, assistive technology testing or a professional WCAG review. Some rules reflect best practices and may not always correspond to a hard WCAG 2.1 failure in every context. All findings should be reviewed in context.
License
GPL-2.0-or-later


