Skip to content
Aaron Gustafson

Advancing inclusion with progressive enhancement

Aaron’s journey towards progressive enhancement and inclusive design.

Aaron Gustafson // @aarongustafson

Hey there, I’m Aaron. I’m a Principal Accessibility Innovation Strategist at Microsoft, where I identify and fund projects that chart the future of accessible technologies. Prior to this role, I wore about every hat you can in the “making things for the web” world—strategist, information architect, UX designer, front-end engineer, back-end engineer, performance engineer, database architect… you name it, I’ve probably done it. I’m also a former manager of the Web Standards Project, the current editor-in-chief of A List Apart, and I write and speak often about building a more resilient and equitable web. I also wrote Adaptive Web Design: Crafting Rich Experiences with Progressive Enhancement, which has led a number of top web design book lists.

The ReadME Project amplifies the voices of the open source community: the maintainers, developers, and teams whose contributions move the world forward every day.

I first encountered the internet during college while looking up my favorite bands’ upcoming albums and tours heading to my town. My dorm lacked an ethernet connection, so I used dial-up to search through documents on Gopher. This early internet experience, slow and distinctly non-immersive, felt like a far cry from the sense of community and inclusivity I found in music. I found myself longing for a way to bridge the gap between these two experiences and access information without being burdened by technical limitations. Little did I know then, these frustrations would become the impetus for my career devising solutions to digital exclusion.

Turned to the side and smiling into the distance, Aaron holds a laptop covered in stickers.

Having witnessed the evolution of the internet since its early days—from agonizingly slow dial-up connections to the seemingly instantaneous fiber we enjoy today—I’ve seen firsthand a wide range of potential user experiences, spanning from frustratingly arduous to remarkably seamless and intuitive. Watching how different people interact with changing form factors showed me how user experiences are shaped not only by our devices and connectivity, but also by our individual lived experiences. These realities are not universally shared and can be quite complex and diverse. As each person's interaction with the web is unique, a flawless experience for one might be inadequate for another.

As I moved from a passive internet user to an active contributor, I began contemplating the trajectory of the web, its potential future, and the role I wanted to play in that journey. Despite the internet's endless possibilities and incredible potential, it also held the risk of excluding individuals—both intentionally and unintentionally—a reality I had already faced during my early experiences with its technical limitations and frustrations. I began to appreciate the importance of ensuring that the core experience of everything we develop is accessible to all, irrespective of any permanent, temporary, or situational barriers.

This involves designing interfaces that are functional even under less-than-ideal circumstances, for example, a slow network connection, limited JavaScript support, or an absence of specific device features. I realized that our inherent limitations in anticipating and designing for the unknown needs of others inadvertently lead to accessibility issues. This insight helped me see disability not as a personal condition but as an unintentional outcome of design choices.

It's crucial to understand that usability concerns are not limited to individuals with permanent disabilities. They encompass a wide range of users, making an inclusive approach all the more essential in our design efforts. Our approach to accessibility must encompass a broader perspective, going beyond color contrast or button sizes, to considering the needs of every potential user. We need to cater to situations we might often overlook—such as a user with perfect vision struggling to read their screen in bright sunlight. This understanding has formed the basis for my work shaping a more inclusive, accessible, and user-friendly internet.

Aaron stands smiling in front of flowering bushes.

The power of progressive enhancement

My early upbringing greatly influenced my approach to web development. My grandmother taught me to treat others as I wished to be treated. I've come to appreciate how this principle aligns with a thought experiment by philosopher John Rawls. He challenged individuals to design their ideal society without knowing their role in it, as though behind a Veil of Ignorance, which forced participants to place themselves in the shoes of each member of society. They designed more egalitarian societies, where outcomes for the least advantaged were still positive. This parallels the progressive enhancement design philosophy, which prioritizes universal access to essential tasks, ensuring every user can navigate and interact with the internet effectively, regardless of their unique circumstances.

Progressive enhancement begins with constructing a robust and universally accessible foundation, designed to cater to all users, regardless of individual or technological circumstances. From here, advanced features can be strategically layered to enhance the user experience wherever feasible. Even as these enhancements roll out, guided by the capacities of different devices, the quality of network connections, or the availability of specific APIs, the core functionalities should remain steadfast and accessible to all.

We want to hear from you! Join us on GitHub Discussions.

With this ideal in mind, let's imagine you're tasked with recreating a platform like AOL Instant Messenger, but you're in a world without the benefit of Ajax or single-threaded real-time communication—essentially, a world where you need to refresh the browser to load new content. How would you approach overcoming this barrier? In such a scenario, you'd likely have users submit a form to send messages. Upon submission, the browser would post the message and refresh the page to display it. You might also set a refresh timer that updates the page every 30 seconds or so to display any new messages from friends. That’s a low-tech approach and a less-than-ideal user experience, but it works.

As technology evolves, progressive enhancement allows us to integrate new capabilities. For example, form submissions and refreshing iframes progresses to XMLHTTPRequest (XHR), which progresses to web sockets and so on. Each such enhancement contributes to an increasingly sophisticated user experience for addressing chat, without hindering that core functionality.

The core of a progressive enhancement design starts with a text-based layer suitable for text-only browsers, or instances where dependencies like CSS and JavaScript don’t load, apply, or run as we’d hope in an "ideal" environment. It then layers on HTML semantics to form a document outline, enhancing the experience for screen readers and providing basic visual structure through browser default styles. Next come forms for interactivity and cascading style sheets (CSS) for advanced layout, color, and stylistic options. Even within CSS, constructs like @supports allow granular testing for property or selector support, enabling further enhancements.

A fundamental principle of progressive enhancement is the concept of fault-tolerance, which can be seen in CSS's ability to allow us to define the same property multiple times. In instances like the use of newer features such as P3 colors, older browsers that don't recognize these will revert to a value they comprehend. Thus, even within a single language like CSS, we're progressively enhancing the user experience. This layered approach is critical to building a more inclusive, fair, and adaptable digital landscape.

Aaron enjoys a walk near the water's edge as logs float nearby.

Designing with everyone

It's a common misconception that as developers, product owners, or creators, we are representative of our customers. Designing for users like ourselves can unintentionally exclude those who don't share our experiences.

I've become increasingly aware of the significant gaps in my own understanding, so I aim to collaborate with individuals whose experiences and insights can fill these voids and shed light on the 'unknown unknowns'—the gaps that I wasn't even aware existed. We are not our users. To craft exceptional experiences, we need team members whose personal experiences resonate with the diversity of our customers. That overlap can then help us to anticipate potential obstacles, harms, and opportunities for empowerment.

When we shift our perspective to view accessibility not as a burden, but as a creative constraint that fosters innovation, it becomes a source of excitement. In the absence of constraints, we risk drifting aimlessly or pursuing tangents that lead nowhere. On the other hand, barriers can spur us towards innovative thinking, challenging us to venture beyond conventional solutions. Accessibility, therefore, is not merely an essential element of inclusivity; it's also a potent stimulus for creativity and innovation, pushing us to design in ways that cater to a broader audience.

About The
ReadME Project

Coding is usually seen as a solitary activity, but it’s actually the world’s largest community effort led by open source maintainers, contributors, and teams. These unsung heroes put in long hours to build software, fix issues, field questions, and manage communities.

The ReadME Project is part of GitHub’s ongoing effort to amplify the voices of the developer community. It’s an evolving space to engage with the community and explore the stories, challenges, technology, and culture that surround the world of open source.

Follow us:

Nominate a developer

Nominate inspiring developers and projects you think we should feature in The ReadME Project.

Support the community

Recognize developers working behind the scenes and help open source projects get the resources they need.