Accessibility

This page documents the accessibility system built into fork-sync-all and propagated to all infra-core and upstream-sync consumer repos.


What the system does

Every repo in the OSP stack is audited for accessibility on every push to main and weekly via check-accessibility.yml. The audit covers five layers:

LayerToolWhat it checks
CODEOWNERSgithub-codeownersOwnership coverage %, unowned files, CODEOWNERS validation
README scanBuilt-inMissing alt text, non-descriptive links, table headers, reading level, bare URLs
WCAG 2.1 AApa11y + axe-coreHTML accessibility violations in generated docs
Audio overviewespeak-ngREADME → MP3 audio for visually impaired users
Braille outputliblouisREADME → Grade 2 English Braille (.brl file)

Accessibility artifacts

Each repo that has run check-accessibility.yml will have these files committed to its default branch:

FileFormatAudience
README.audio.mp3MP3 audioScreen reader users, visually impaired developers
README.brlBraille Grade 2Braille display users
accessibility-report.jsonJSONCI systems, dashboards, automation

Running the audit

On push: automatically triggered when README.md or CODEOWNERS changes.

Weekly: runs every Monday at 04:17 UTC.

Manually:

# Via GitHub CLI
gh workflow run check-accessibility.yml

# With options
gh workflow run check-accessibility.yml \
  -f repo=my-repo \
  -f fail_on_error=true

Locally (requires espeak-ng, python3-louis, pa11y):

sudo apt-get install espeak-ng ffmpeg python3-louis liblouis-data
npm install -g pa11y github-codeowners

REPO_DIR=. OWNER=my-org REPO=my-repo \
  AUDIO_ENABLED=true BRAILLE_ENABLED=true WCAG_ENABLED=true \
  bash scripts/check-accessibility.sh

Installing the runner dependencies

The check-accessibility.yml workflow installs these automatically on the GitHub Actions runner. For local use:

# Ubuntu / Debian
sudo apt-get install espeak-ng ffmpeg python3-louis liblouis-data

# macOS (Homebrew)
brew install espeak liblouis ffmpeg
pip3 install louis

# Node tools
npm install -g pa11y github-codeowners

CODEOWNERS coverage

Ownership coverage is measured by github-codeowners audit. Thresholds:

CoverageStatus
≥ 80%✅ Pass
50–79%⚠️ Warning
< 50%❌ Error

To see unowned files:

cd <repo>
github-codeowners audit -u

To validate your CODEOWNERS file:

github-codeowners validate

README accessibility standards

The README scan checks for:

  • Missing alt text — every ![]() image must have descriptive alt text
  • Non-descriptive links — avoid [click here], [here], [link], [read more]
  • Table headers — every markdown table must have a |---|---| separator row
  • Bare URLs — wrap URLs in descriptive link text: [description](url)
  • Reading level — avg sentence length ≤ 20 words is accessible; > 30 is flagged
  • H1 heading — every README must start with a # Title

WCAG 2.1 AA compliance

HTML docs in DOCS/generated/ are scanned with pa11y against the WCAG 2.1 AA standard. Common issues:

IssueFix
Missing alt on <img>Add descriptive alt text
Low colour contrastEnsure 4.5:1 ratio for normal text, 3:1 for large text
Missing form labelsAssociate <label> with every <input>
Missing landmark regionsWrap content in <main>, <nav>, <header>
Empty linksAdd descriptive text inside <a> tags

Audio overview

README.audio.mp3 is generated by espeak-ng, a lightweight open source TTS engine. The README is stripped of markdown syntax before synthesis for cleaner output.

Playback:

# Any media player
mpv README.audio.mp3
vlc README.audio.mp3

# Command line
ffplay README.audio.mp3

Braille output

README.brl is generated by liblouis, the standard open source Braille translation library used by NVDA, JAWS, and VoiceOver. Output is Unified English Braille (UEB) Grade 2.

To display on a Braille terminal:

# Most Braille displays accept .brl files directly via their driver software
# On Linux with brltty:
brltty -f README.brl

Upstream tools tracked

All accessibility tools are forked into Interested-Deving-1896 and mirrored to the accessibility_deving GitLab subgroup:

ToolPurposeUpstream
nvdaScreen reader for Windowsnvaccess/nvda
osaraREAPER accessibility (audio production)jcsteh/osara
liblouisBraille translation libraryliblouis/liblouis
espeak-ngText-to-speech engineespeak-ng/espeak-ng
axe-coreWCAG rules enginedequelabs/axe-core
pa11yCLI WCAG auditingpa11y/pa11y
github-codeownersCODEOWNERS auditingkohofinancial/github-codeowners
target-size-highlighterWCAG 2.5.5 pointer target visualiseraccessibility-tools/target-size-highlighter
z-index-focus-overrideWCAG 2.4.11 focus indicator bookmarkletaccessibility-tools/z-index-focus-override
READMEAccessible HTML doc generator (no-JS)canalplus/README

Further reading