Skip to main content
Drupal is a registered trademark of Dries Buytaert
Release: highlight.js Input Filter 2.0.1 Minor update available for module highlightjs_input_filter (2.0.1). Release: Juicer Social Feed 1.4.0 Minor update available for module juicer (1.4.0). Release: Search API Manticore 1.2.1 Minor update available for module search_api_manticore (1.2.1). Release: Opensolr Search 5.0.0 Major update available for module opensolr_search (5.0.0). Release: Burndown 1.0.78 Minor update available for module burndown (1.0.78). Module Revived: Optional End Date 2.0.0 Module optional_end_date updated after 7 months of inactivity (2.0.0). Release: Postmark Webhooks 1.0.0 Initial release available for module postmark_webhooks (1.0.0)! Usage Milestone: Shortcode Module shortcode crossed 1,000 active installs. Release: AI CKEditor 1.5.0-beta2 New beta version released for module ai_ckeditor (1.5.0-beta2). Release: Commerce Unzer 3.0.0-beta3 New beta version released for module commerce_unzer (3.0.0-beta3).

Accessibility Ally

No security coverage Drupal 10–11
View on drupal.org

Accessibility Ally brings accessibility checking directly into the Drupal authoring and administration experience, instead of treating it as a separate, occasional audit. It combines a live client-side scanner, an optional AI assistant, a hard server-side validation gate on save, a site-wide reporting dashboard, and Drush commands for CI — all built around WCAG 2.1 success criteria.

Why use it

Most accessibility tooling lives outside Drupal: a browser extension, a third-party scanner, a spreadsheet of findings someone has to chase down. Accessibility ally puts the same checks where content is actually created and reviewed — in the sidebar while editing, and as a save-time gate that can't be skipped — so accessibility debt doesn't accumulate silently.

Key Features

Live accessibility scanner

A client-side audit engine walks the rendered page and checks for:

  • Missing or empty image alt text
  • Colour contrast failures (WCAG 1.4.3), including gradient and background-image sampling
  • Invalid or missing ARIA attributes
  • Form controls without accessible labels
  • Heading structure problems (skipped levels, wrong starting level)
  • Vague link text ("click here", "read more", etc.)
  • Keyboard navigation issues (missing focus styles, illogical tab order, non-focusable interactive elements)
  • Paragraph length / readability

Each issue is scored by severity (Critical / Serious / Moderate / Minor) and rolled into a 0–100 accessibility health score with a letter grade.

AI-powered assistance (Google Gemini, optional)

A server-side proxy controller calls the Gemini API on the editor's behalf, so no API key is ever exposed to the browser. From the sidebar, editors can ask a free-form accessibility question, get a plain-language page summary, get AI-suggested alt text for images, or get AI-suggested accessible colour replacements for failing contrast pairs.

One-click and guided fixes

"Fix all contrast" nudges failing foreground colours to the nearest passing shade and previews the change before applying it. Keyboard fixes inject focus styles and correct tab order on flagged elements. Applied fixes persist per-user so they're automatically re-applied on the editor's next visit.

Server-side validation gate

On node and comment save, the module re-runs a subset of rules against the submitted HTML using PHP's DOMDocument/DOMXPath — independent of the browser-side scanner. If issues are found, the save is blocked with a clear, numbered list of problems, so accessibility becomes a requirement rather than a suggestion.

Site-wide accessibility dashboard

/admin/reports/accessibility-ally shows every open and resolved issue across the site: summary stat cards, most common issue types, most problematic content, and a filterable, sortable, paginated table linking straight to the offending content's edit form.

Drush / CI integration

drush wcag:scan     # scan all published nodes
drush wcag:report    # show stored issues without re-scanning
drush wcag:clear       # clear stored issues

wcag:scan exits non-zero when errors are found, so it can gate a CI/CD pipeline.

Theme-aware widget

The floating sidebar can render with a fixed neutral theme, or detect and inherit the active theme's colours (tested with Olivero, Bootstrap-based themes, and CSS-custom-property design systems).

Visitor accessibility toolbar

A separate, front-end-facing panel lets site visitors adjust text size, contrast, grayscale, focus highlighting, a dyslexia-friendly font, reduced motion, line height, and letter spacing — stored client-side only, with no data sent to the server.

How it works under the hood

  • A pluggable rule engine (AltTextRule, ColorContrastRule, AriaValidationRule, FormAccessibilityRule, UnclearLinkTextRule) backs both the client-side scanner and the server-side validation gate, so the same logic governs what editors see and what actually blocks a save.
  • Detected issues are persisted to a dedicated accessibility_ally_issues database table and power the reporting dashboard.
  • Three permissions give fine-grained control: Administer Accessibility Ally settings, Access Accessibility Ally widget, and View Accessibility Ally dashboard. The widget is off by default and only shown sitewide once explicitly enabled and granted to a role.
  • Every AI call is proxied server-side through a CSRF-protected route; the Gemini API key lives only in module configuration and is never sent to the browser.

Requirements

  • Drupal 10 or 11
  • PHP 8.1+ (with the dom/libxml extensions, standard on most Drupal hosting)
  • A Google Gemini API key (optional — only required for AI-assisted features)

No other contrib dependencies are required — the module can be installed on a vanilla Drupal site.

Documentation

Full guides are bundled with the module under docs/:

  • USER_GUIDE.md — editors / content authors
  • ADMIN_GUIDE.md — site administrators
  • DEVELOPER_GUIDE.md — architecture, services, rule engine
  • API_GUIDE.md — routes, controllers, and integration details
  • CHANGELOG.md, FAQ_GUIDE.md, TROUBLESHOOTING_GUIDE.md

Installation steps are covered in the top-level INSTALL.md.

Depends on

Dependencies of the latest stable release

No dependencies recorded for this project.

Required by

Tracked projects that depend on this one

No tracked projects depend on this one yet.

Activity

Tracked releases
1
Tracked since
Sep 2026
Latest release
4 hours ago
Releases (12 mo)
1 ▲ from 0
Maintenance
Active

Releases

Version Type Core Release date
1.0.0 Stable 10–11 Sep 7, 2026