DEV Community

Ali Suleyman TOPUZ
Ali Suleyman TOPUZ

Posted on • Originally published at topuzas.Medium on

Accessibility-First Software Engineering: Building Inclusive Systems from the Ground Up

This article explores the architectural and cultural foundations of accessibility-first software engineering. The technical patterns discussed — including accessibility context propagation, multi-modal API design, and accessibility observability — represent practical starting points for teams beginning this work. WCAG 2.2 remains the primary technical reference standard, and hands-on testing with actual assistive technologies should accompany any automated tooling strategy.

What if the way we build software has been wrong this whole time — not morally wrong, but architecturally wrong?

There is a story engineers love to tell about curb cuts. When cities started installing those small concrete ramps at sidewalk corners to help wheelchair users navigate urban streets, something unexpected happened. Everyone started using them — parents pushing strollers, delivery workers hauling hand trucks, travelers dragging rolling luggage, cyclists, skaters, elderly pedestrians with canes. A design decision made for one specific group of people turned out to make life measurably better for nearly everyone.

Software has been ignoring this lesson for decades.

Accessibility in most engineering organizations is treated like a compliance obligation  — a list of legal checkboxes to satisfy after the “real” product work is done. Teams ship features, build architectures, make foundational decisions, and then, somewhere near the end of a sprint cycle or just before a launch deadline, someone says: we should probably make this accessible. At that point, the work becomes exponentially harder, exponentially more expensive, and almost always incomplete.

Accessibility-first software engineering is the argument that this sequence is backwards. It is the practice of treating accessibility not as a feature layer but as an architectural constraint — one that belongs at the very beginning of design, right alongside performance, scalability, and security. And when you actually build software this way, something remarkable happens: you end up with better software, period.

The Scale of the Problem We Are Ignoring

Before getting into architecture and implementation, it is worth sitting with the numbers for a moment, because they have a way of reframing what “edge case” means.

The World Health Organization estimates that approximately 1.3 billion people — roughly 16% of the global population — experience significant disability.

But that figure captures only a fraction of the people affected by inaccessible software. Expand the lens to include temporary disabilities (a broken wrist, post-surgery recovery, an eye infection), situational limitations (using a phone in direct sunlight, operating a laptop while riding a bus, watching a video in a noisy open office), and age-related changes that affect virtually every person who lives long enough, and you are no longer talking about a minority use case. You are talking about every user, at some point in their relationship with your product.

WebAIM publishes an annual analysis of the top one million websites on the internet. In recent years, that analysis has consistently found that over 96% of those homepages have detectable WCAG 2 failures. Nearly every major site on the internet is, to some degree, broken for a significant portion of its users. This is not a niche problem. It is a systemic failure embedded in how the industry thinks about and practices software development.

The business case is real too, though it probably should not be the primary motivation. People with disabilities represent substantial purchasing power — estimates place discretionary income for working-age people with disabilities in the United States alone at around $21 billion annually. The global figure, including older adults and people experiencing temporary limitations, stretches into the trillions. Companies building genuinely accessible products are not just being ethical. They are also accessing a massively underserved market that their competitors are actively excluding.

But if the ethical argument is sufficient — and it should be — let us start there. Millions of people are unable to fully use software that has become essential infrastructure for modern life: job applications, healthcare portals, banking systems, government services, educational platforms. Inaccessibility in software is not a minor inconvenience. For many people, it is a barrier to participation.

Why Retrofitting Never Works (And Why We Keep Trying)

Most accessibility work happens as retrofitting. A product ships. Legal risk appears — or worse, a lawsuit arrives. Engineers are tasked with making the existing system accessible. They work hard, they make improvements, but the result is almost never fully accessible because the foundational decisions have already been made and cannot be easily undone.

The Department of Homeland Security’s Trusted Tester program has done work estimating the cost differential between addressing accessibility issues at different stages of the development lifecycle. Their findings point toward roughly a 10x cost multiplier: problems caught and fixed during the design phase cost about one-tenth of what they cost to fix once a product is in production. When you factor in the potential legal exposure — website accessibility lawsuits have historically settled in ranges from $35,000 to $75,000 before accounting for legal fees and remediation costs — the financial argument for building correctly from the start becomes overwhelming.

But the problem runs deeper than cost. Retrofitting accessibility onto a poorly architected system often produces what might be called “accessibility theater” — the appearance of compliance without the reality of usable experience. You can add ARIA labels to semantically meaningless markup. You can make a keyboard focus indicator visible without making the keyboard navigation logical. You can include alt text on images while the surrounding interactive components remain completely opaque to screen readers. These patches satisfy automated scanning tools without actually serving the people who need accessible software.

The reason retrofitting produces these hollow results is that genuine accessibility requires architectural decisions. It requires that your application expose meaningful state information. It requires that your interaction models support multiple input modalities from the ground up. It requires that your data layer returns everything needed to construct accessible interfaces. These are not features that can be sprinkled on top of an existing system. They have to be designed in.

What Accessibility-First Architecture Actually Means

Shifting to accessibility-first development is not primarily about learning a longer checklist or hiring specialists to review finished work. It is about a set of architectural principles that shape decisions from the very beginning.

Accessibility context must propagate through the system: In traditional layered architectures, user preferences and accessibility metadata get dropped as requests cross service boundaries. A user who depends on reduced motion preferences, or who uses a screen reader that requires different response structures, or who needs extended session timeouts because motor impairments slow their interactions — that context needs to travel through every layer of the system. This is an explicit architectural requirement, not an implementation detail. The overhead is real but minimal, typically a few hundred bytes per request. The impact on users who depend on it is substantial.

Asynchronous patterns are not just a scalability optimization — they are an accessibility requirement: Tightly coupled, synchronous architectures create barriers for users of assistive technologies that operate on different temporal scales than standard input devices. A switch control user navigating a form may take 30 to 60 seconds to complete interactions that a mouse user handles in under five. An architecture that treats this as a timeout scenario rather than a legitimate usage pattern is an architecture that excludes this user entirely. Event-driven designs, CQRS patterns, and saga patterns that accommodate extended interaction timescales are not just engineering elegance — they are what allow real users to complete real tasks.

API contracts need to be designed for multi-modal interfaces from day one: This is a point that backend engineers sometimes resist, feeling that accessibility is a frontend concern. It is not. An image resource endpoint that returns URLs without alt text forces frontend developers to invent accessibility metadata that should live in the data layer. An error response that returns generic 500 status codes with no semantic content makes it impossible to build screen-reader-friendly error messages. An API that lacks hypermedia controls forces assistive technologies to navigate complex workflows without any structural guidance. Backend API design choices have direct accessibility implications, and those choices need to be made deliberately.

Fallback mechanisms are primary paths, not error handling: Accessible systems are resilient systems. If a WebSocket connection fails, keyboard navigation cannot become broken. If a JavaScript error disrupts dynamic content updates, there needs to be a fallback mechanism for content announcements. Progressive enhancement — the practice of building a functional core experience that works without advanced features, then layering enhancements on top — is not just a best practice for low-bandwidth environments. It is an accessibility architectural pattern.

Embedding Accessibility Across the Development Lifecycle

One of the more powerful shifts in accessibility-first engineering is what happens when accessibility requirements are treated as first-class functional requirements from the very beginning of a project, rather than as a quality checklist at the end.

In the requirements phase, this means writing accessibility specifications with the same rigor as performance requirements. What WCAG conformance level is the target? What assistive technologies need to be tested against? What are the performance budgets for accessibility-critical interactions? What error messaging requirements exist for cognitive accessibility? These questions should have answers before a line of code is written.

In the design phase, it means architecture reviews that explicitly evaluate accessibility implications. Decisions about synchronous versus asynchronous processing, caching strategies, API contract design, and state management patterns all have accessibility consequences. Those consequences need to be part of the design conversation.

In the development phase, it means accessibility patterns in coding standards, not accessibility reviews in code review. There is a meaningful difference between a team that checks for accessibility problems after code is written and a team where accessible patterns are the default from which developers start.

In the testing phase, it means automated accessibility testing running in CI/CD pipelines alongside unit and integration tests, and manual testing with actual assistive technologies treated as a standard activity rather than a specialized audit. It also means load testing scenarios that include assistive technology usage patterns, which often produce meaningfully different request profiles than standard interactions.

In the monitoring phase — and this is where accessibility-first thinking often reveals gaps — it means measuring “accessibility uptime” as a distinct metric from general system uptime. A system can be fully operational for mouse users while being completely broken for keyboard-only users because of a JavaScript error that disrupts focus management. Standard uptime monitoring will not catch this. Intentional accessibility observability will.

The Engineering Culture Dimension

Technical practices can be documented in a style guide. Culture is harder.

One of the most common patterns in organizations that struggle with accessibility is that it is owned by a single person or a small team who bear the entire cognitive and organizational load of making inaccessible systems accessible. These people are often talented, passionate, and chronically overwhelmed. They become bottlenecks. They review finished work looking for problems. They write long reports that get triaged against other priorities. And eventually, they burn out.

Accessibility-first engineering requires distributing this ownership. It requires that every engineer building a feature understands enough about accessibility to make good decisions in their day-to-day work. It requires that product managers include accessibility requirements in acceptance criteria. It requires that designers understand the accessibility implications of their patterns. It requires that engineering leadership sets clear expectations and measures results.

This is not a simple transformation. It requires investment in education, in tooling, in processes that make the right choices easy and the wrong choices visible. But it is the only version of accessibility work that actually scales. A single team auditing the output of hundreds of engineers will always be fighting a losing battle. A culture where accessibility is everyone’s responsibility — supported by good tooling and clear standards — is the only thing that produces consistently accessible software.

Staff engineers and technical leads carry particular responsibility here. The architectural decisions made at the senior level — about system design, about API contracts, about component libraries, about testing infrastructure — either make accessibility easy or make it hard for every engineer downstream. Technical leadership that treats accessibility as a first-class concern creates the conditions for accessible software to be the path of least resistance. Technical leadership that does not creates the conditions for accessibility debt to accumulate indefinitely.

Closing: The Standard We Should Hold Ourselves To

There is a version of this conversation that frames accessibility as a nice-to-have, a differentiator, a business opportunity. All of those things are true, and none of them are the right starting point.

The right starting point is this: millions of people cannot fully use software that has become essential to participating in modern society. Healthcare, employment, education, civic participation — all of it increasingly mediated through digital systems that were built without them in mind. That is a failure. It is a failure of craft, of leadership, and of professional ethics.

Accessibility-first software engineering is the practice of taking that failure seriously enough to actually change how we build things. Not by adding an accessibility review at the end of the process, but by designing systems from the ground up that work for everyone. Not by treating disabled users as an edge case, but by recognizing that designing for the full spectrum of human capability produces better software for all users.

The curb cut is still the right metaphor. The features that make software accessible to people with disabilities — keyboard navigability, semantic structure, clear error handling, consistent state exposure, meaningful labels — make software better for everyone. They make it more robust, more maintainable, more testable, and more resilient. Accessibility is not a constraint on good engineering. It is an expression of it.

The question for every engineering team is not whether to take accessibility seriously. It is whether to take it seriously before you ship or after, and whether you want to pay for it once or many times over.

Top comments (0)