How to Validate EPUB3 Accessibility with ACE by DAISY
ACE by DAISY is the reference validator for EPUB3 accessibility and EPUB Accessibility 1.1 conformance. If you’re producing accessible EPUBs — whether for EAA compliance, distributor submission, or internal accessibility audits — ACE is the tool you’ll use to document conformance.
This tutorial covers installing ACE, running a validation check, reading the report, and understanding the key criteria.
What ACE By DAISY Checks
ACE validates EPUB3 files against:
- EPUB Accessibility 1.1 — the W3C/DAISY specification for accessible ebooks
- WCAG 2.1 AA — the international web accessibility standard incorporated by EPUB Accessibility 1.1
- EPUB structural requirements — navigation document, package document, content documents
Key criteria ACE tests (relevant to EAA compliance):
- WCAG 1.4.10 Reflow — can content be read at 400% zoom without horizontal scrolling?
- WCAG 1.3.1 Info and Relationships — is structure properly marked up (headings, lists, tables)?
- WCAG 1.1.1 Non-text Content — do images have alt text?
- WCAG 2.4.2 Page Titled — does the EPUB have a title?
- WCAG 3.1.1 Language of Page — is the document language declared?
- EPUB navigation — is there a valid EPUB3 navigation document (table of contents)?
- EPUB accessibility metadata — is the required EPUB Accessibility metadata present in the OPF?
Installation
ACE requires Node.js (version 14 or later). Install Node.js from nodejs.org if you don’t have it.
Install ACE globally via npm:
npm install -g @daisy/ace
Verify installation:
ace --version
You should see output like @daisy/ace 1.3.x.
Running a Validation Check
Basic usage:
ace --outdir ./ace-report ./your-document.epub
This produces an HTML report in the ./ace-report directory.
Options:
# Specify a custom title in the report
ace --outdir ./report --title "Annual Report 2025" ./annual-report.epub
# Verbose output during processing
ace --verbose --outdir ./report ./document.epub
# Silent mode (no stdout, just write report)
ace --silent --outdir ./report ./document.epub
Batch validation (multiple EPUBs):
# Linux/macOS
for f in *.epub; do ace --outdir "./reports/${f%.epub}" "$f"; done
# Python cross-platform batch processing
import subprocess, pathlib
epub_dir = pathlib.Path("./epubs")
report_dir = pathlib.Path("./ace-reports")
report_dir.mkdir(exist_ok=True)
for epub_path in epub_dir.glob("*.epub"):
out_dir = report_dir / epub_path.stem
result = subprocess.run(
["ace", "--outdir", str(out_dir), str(epub_path)],
capture_output=True, text=True
)
print(f"{epub_path.name}: {'PASS' if result.returncode == 0 else 'FAIL'}")
Reading the ACE Report
ACE generates two output files in the --outdir directory:
report.html— the human-readable report. Open this in a browser.report.json— the machine-readable report. Useful for CI integration.
Report Structure
The HTML report has three sections:
1. Summary
Shows the EPUB metadata, accessibility metadata, and overall pass/fail status. Key fields:
Conformance— whether the EPUB claims EPUB Accessibility 1.1 conformanceAccessibility Features— list of features declared in the OPF metadataViolations— count of WCAG violations by level
2. Violations Table
Lists each WCAG violation with criterion (e.g., “WCAG 1.4.10 Reflow”), impact level (critical, serious, moderate, minor), location in the EPUB (file and element), and a help link.
3. Metadata
Shows the accessibility metadata from the EPUB OPF package document.
Understanding Key Results
WCAG 1.4.10 Reflow — the EAA-critical criterion
If your EPUB passes WCAG 1.4.10, the violations table will have no entries for 1.4.10 Reflow. If it fails, you’ll see entries like:
WCAG 1.4.10 Reflow
IMPACT: critical
LOCATION: EPUB/content/chapter01.xhtml (css-fixed-size)
HELP: https://daisy.github.io/ace/rules/html/wcag/reflow
Why EPUBs fail 1.4.10:
- Fixed-width CSS on content containers:
width: 600pxinstead ofmax-width: 600px - Fixed-layout EPUB declaration in the OPF:
<meta property="rendition:layout">pre-paginated</meta> - Absolutely positioned elements with fixed pixel dimensions
Fix for reflowable EPUBs: Replace fixed width with max-width or percentage widths in CSS. Remove any fixed-layout OPF declarations.
If the EPUB was converted from PDF by toolkit.bot, it will pass WCAG 1.4.10 — toolkit.bot produces reflowable EPUB3.
Missing Alt Text (WCAG 1.1.1)
If images lack alt text:
WCAG 1.1.1 Non-text Content
IMPACT: critical
LOCATION: EPUB/images/figure1.xhtml img[src="figure1.png"]
Fix: Add alt="Description of figure" to the <img> element. For decorative images, use alt="" and role="presentation".
Missing Heading Structure (WCAG 1.3.1)
If the EPUB uses visual styling to create headings rather than <h1>–<h6> elements:
WCAG 1.3.1 Info and Relationships
IMPACT: serious
LOCATION: EPUB/content/intro.xhtml .chapter-title
Fix: Use semantic heading elements. <h1>Chapter Title</h1> not <p class="chapter-title">Chapter Title</p>.
EPUB Accessibility Metadata
ACE checks for required accessibility metadata in the OPF. A passing EPUB should include:
<meta property="schema:accessibilitySummary">
This publication conforms to EPUB Accessibility 1.1 and WCAG 2.1 Level AA.
</meta>
<meta property="schema:accessMode">textual</meta>
<meta property="schema:accessModeSufficient">textual</meta>
<meta property="dcterms:conformsTo">
EPUB Accessibility 1.1 - WCAG 2.1 Level AA
</meta>
Integrating ACE into CI/CD
For publishers automating EPUB production, integrate ACE as a quality gate:
# GitHub Actions example
name: EPUB Accessibility Check
on:
push:
paths:
- '**.epub'
jobs:
ace-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install ACE
run: npm install -g @daisy/ace
- name: Run ACE validation
run: |
for f in dist/*.epub; do
ace --outdir "reports/${f%.epub}" "$f"
done
- name: Upload reports
uses: actions/upload-artifact@v4
with:
name: ace-reports
path: reports/
ACE exits with code 0 on success and non-zero on failures. This allows CI pipelines to block deployment of non-conforming EPUBs.
Using ACE Reports as Compliance Evidence
ACE report HTML files are suitable for regulatory compliance documentation:
For EAA compliance: The report confirms WCAG 2.1 AA conformance including WCAG 1.4.10. National market surveillance authorities accept ACE reports as evidence for EPUB Accessibility 1.1 conformance.
For distributor submission: Ingram, Kobo, and Apple Books are moving toward requiring EPUB Accessibility 1.1 metadata. The ACE report confirms conformance metadata is correctly set.
For accessibility statements: Reference ACE reports in your accessibility statement:
Key publications are available in accessible EPUB3 format conforming to EPUB Accessibility 1.1 (WCAG 2.1 AA). ACE by DAISY validation reports are available on request.
Generate an EPUB3 that passes ACE
toolkit.bot converts PDFs to accessible EPUB3 that passes ACE by DAISY validation — including WCAG 1.4.10 Reflow. Free, no account required.
- Upload at toolkit.bot/pdf2epub
- Download the EPUB3
- Run
ace --outdir ./report ./document.epub - Open
report.html— WCAG 1.4.10 Reflow: pass
Further Reading
- EPUB3 vs PDF: Accessibility Comparison (WCAG 1.4.10, Screen Readers, EAA)
- PDF to accessible EPUB3 for publishers
- How PDF-to-EPUB3 satisfies the European Accessibility Act (2026)
ACE by DAISY is maintained by the DAISY Consortium and is free, open-source, and the reference tool for EPUB accessibility validation.