Case [04]2025
Bringing a certification platform to WCAG 2.1 AA without dropping performance.
A full-stack accessibility pass on CertyFast — React on the surface, .NET / C# and SQLite underneath — that lifted user retention 12% along the way.
- Role
- Software Engineer, MAQ Software
- Stack
- React.NET / C#SQLiteWCAG 2.1 AA
- Timeline
- 2025
- Status
- Shipped
- Ownership
- Accessible full-stack workflows
- Outcome
- WCAG 2.1 AA with 12% higher retention
Context
CertyFast is an internal certification platform. It worked — for people who could see it, use a mouse, and follow visual cues. For everyone else, it didn't: unlabelled controls, focus lost inside modals, colour-only status. Compliance was overdue; real users were locked out of a tool their peers used daily.
Constraint
- No performance regression for existing users.
- No rewrite — modernisation was mid-flight.
- The team had to maintain it after me — new patterns would only stick if they were the easier path in the codebase.
Move
- Semantic-first React components. Buttons are buttons, headings are headings. Landmarks everywhere; ARIA only where semantic HTML couldn't reach.
- Focus management as a first-class concern. Focus traps on modals, restore-on-close, visible rings, keyboard shortcuts documented on-page.
- Backend cleaned up in the same pass. .NET / C# services rewired for predictable data shapes so the front end could trust them; SQLite persistence for offline-tolerant flows.
- Real users, not just audits. Tested with a screen-reader user — two of the biggest fixes weren't on any audit report.
- WCAG 2.1 AA contrast across the whole palette, no colour-only status,
prefers-reduced-motionrespected on every animation.
Result
- Platform meets WCAG 2.1 AA / ADA across the workflows I owned.
- Shipped alongside a 12% lift in user retention — larger than the a11y work alone explains; reliability improvements from the rewrite came free.
- Team now reaches for the accessible primitives by default because they're the fastest path — not the disciplined one.
What I'd change
- axe-core in CI from day one. Regressions are easier to prevent than to find.
- Document the why, not just the what. Would have saved a few "why is this like this?" conversations later.
- More automated keyboard-navigation tests — they're slow to write but catch a class of bugs nothing else does.