Building a WCAG 2.1 AA Dashboard That 50K Users Actually Rely On
Accessibility on a data-heavy analytics dashboard isn't a checklist you bolt on at the end. Here are the patterns that made real-time charts usable for everyone.
Analytics dashboards are where accessibility usually goes to die. Dense charts, color-coded everything, live-updating numbers — all of it hostile to screen readers and low-vision users. On a real-time energy dashboard serving 50K+ monthly users, WCAG 2.1 AA wasn't optional. Here's what actually moved the needle.
Color is not information
The fastest way to fail WCAG is to encode meaning in color alone. A red/green status that looks identical to a colorblind user is a defect, not a style choice.
- Pair every color with a shape, icon, or label.
- Verify contrast: 4.5:1 for text, 3:1 for large text and UI components.
- Never rely on hue alone in a chart legend — add patterns or direct labels.
Charts need a text alternative
A canvas or SVG chart is invisible to a screen reader. The fix isn't to describe every pixel — it's to expose the underlying data as an accessible table.
<figure role="group" aria-labelledby="chart-title">
<h3 id="chart-title">Energy usage, last 24h</h3>
<Chart data={data} aria-hidden="true" />
<VisuallyHidden>
<table>{/* same data, tabular */}</table>
</VisuallyHidden>
</figure>
Live regions, used sparingly
Real-time updates are a trap: announce every tick and you flood the screen reader. Use aria-live="polite" only on a summary element that changes meaningfully, not on every streaming value.
Keyboard is the real test
If you can't operate the entire dashboard with a keyboard — filters, tooltips, drill-downs — it isn't done. Tab order, visible focus rings, and Esc to close overlays caught more real bugs than any automated scan.
The takeaway
Automated tools (axe, Lighthouse) catch maybe 30% of issues. The other 70% is keyboard testing and actually thinking about how a non-visual user builds a mental model of your data. Budget for it from day one — retrofitting accessibility costs far more.