<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Forrest Goyer</title>
    <description>The latest articles on DEV Community by Forrest Goyer (@fgoyer).</description>
    <link>https://dev.to/fgoyer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F290247%2Fb23c279d-62fe-410a-880b-12305d8e67e9.jpeg</url>
      <title>DEV Community: Forrest Goyer</title>
      <link>https://dev.to/fgoyer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fgoyer"/>
    <language>en</language>
    <item>
      <title>Designing With Everyone in Mind: Color &amp; Accessibility</title>
      <dc:creator>Forrest Goyer</dc:creator>
      <pubDate>Thu, 05 Feb 2026 20:52:27 +0000</pubDate>
      <link>https://dev.to/fgoyer/designing-with-everyone-in-mind-color-accessibility-5dpo</link>
      <guid>https://dev.to/fgoyer/designing-with-everyone-in-mind-color-accessibility-5dpo</guid>
      <description>&lt;p&gt;This blog was initially feature on the &lt;a href="https://keyholesoftware.com/color-accessibility-beyond-color-in-web-design/" rel="noopener noreferrer"&gt;Keyhole Dev Blog&lt;/a&gt; on February 2nd, 2026.&lt;/p&gt;

&lt;p&gt;Of all the design choices we make when building a web application, color is one of the most impactful. It sets the tone, defines the brand, and guides the user’s eye. That influence is exactly why color accessibility in web design matters—when color choices aren’t inclusive, they can unintentionally create barriers for users with visual impairments, including color blindness or color vision deficiency (CVD). It is estimated that 1 in 12 males (8%) and 1 in 200 females (0.5%) experience the most common form of color blindness, red-green. It’s important to take this into consideration to avoid leaving any users behind.&lt;/p&gt;

&lt;p&gt;Designing with color accessibility isn’t about limiting your creativity; it’s about making smart, inclusive choices that result in a better product for everyone. By focusing on contrast, redundancy, and collaboration, we can build applications that are both beautiful and usable for all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Contrast to Meet WCAG Color Accessibility Guidelines
&lt;/h2&gt;

&lt;p&gt;The foundation of color accessibility in web design is simple: &lt;em&gt;text and other important visual elements should be clearly distinguishable from their background&lt;/em&gt;. The key metric to know here is the &lt;strong&gt;contrast ratio&lt;/strong&gt;. The Web Content Accessibility Guidelines (WCAG) 2.2 provide the industry-standard framework for it.&lt;/p&gt;

&lt;p&gt;A contrast ratio measures the difference in perceived luminance (or brightness) between two colors. &lt;a href="https://www.w3.org/WAI/WCAG22/quickref/" rel="noopener noreferrer"&gt;WCAG 2.2&lt;/a&gt; sets minimum thresholds for this ratio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AA Level (Minimum Compliance):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A contrast ratio of at least 4.5:1 for normal-sized text,
and 3:1 for large text (18pt/24px or 14pt/18.5px bold).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;AAA Level (Enhanced Compliance):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A contrast ratio of at least 7:1 for normal-sized text,
and 4.5:1 for large text.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This might seem like an obvious guideline. Most people can intuit that something like black text on a white background is clearly distinguishable. The challenge comes when text and background colors aren’t so basic. After all, we’re not just building newspapers! A pop of color goes a long way toward giving users a more engaging, visually interesting experience.&lt;/p&gt;

&lt;p&gt;That being said, it pays to confirm your contrast ratios instead of relying solely on your own vision. Don’t worry, you don’t need to calculate this by hand! Sites like &lt;a href="https://webaim.org/resources/contrastchecker/" rel="noopener noreferrer"&gt;WebAIM: Contrast Checker&lt;/a&gt; and browser developer tools (in Chrome, Firefox, and Edge) have features that let you check contrast ratios directly on the page. I’d suggest making a habit of checking these ratios as part of your development workflow. Hitting at least the AA standard should be pretty easy to achieve when creating a usable interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7jvv5egkb1n4brfi4ul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7jvv5egkb1n4brfi4ul.png" alt="Screenshot from Chrome Development Tools" width="233" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feti53pfdfy9imqaqug6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feti53pfdfy9imqaqug6z.png" alt="Screenshot from WebAIM: Contrast Checker" width="723" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t Rely on Color Alone to Convey Information
&lt;/h2&gt;

&lt;p&gt;Relying solely on color to convey information is one of the most common accessibility pitfalls in color accessibility in web design. For the roughly 1 in 12 men and 1 in 200 women with some form of CVD, telling the difference between a red error message and a green success message might be impossible. One solution is to provide redundant clues.&lt;/p&gt;

&lt;p&gt;This means using other visual indicators, in addition to color, to communicate meaning. Here are simple, real-world examples of accessibility beyond color that improve usability for all users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Form Validation:&lt;/strong&gt; Instead of just a red border on an invalid input field, add a descriptive error message below the field and an alert icon (like an exclamation mark).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links:&lt;/strong&gt; Don’t just colorize link text. The standard, time-tested convention is to also underline it. This makes links easy to identify without relying on color perception.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buttons:&lt;/strong&gt; It’s common to use colors to help lead users through the flow of an app. Red for “delete,” green for “save,” etc. Adding an icon to a button can quickly and easily convey meaning to support the color of the background and even the text on the input.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By providing multiple ways to interpret information, you create a more robust and intuitive interface for everyone, not just those with CVD.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw3dl7njg531sw6tjm6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw3dl7njg531sw6tjm6b.png" alt="Example of color accessibility in form validation" width="578" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53v2akj5zlizsjx3hwbr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53v2akj5zlizsjx3hwbr.png" alt="Using icons and text in addition to color on buttons to improve accessibility" width="315" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch Your Tone: Adjust for Color Vision Deficiency
&lt;/h2&gt;

&lt;p&gt;As much as you may try to plan for it, there will always be a time when you are backed into a corner and need to use a color combination that is among the most common color vision deficiency types. Like the red-green example given above, there are colors that present an intuitive meaning to many users but can become virtually indistinguishable for others. Where total avoidance of these colors is not practical, one technique to consider is to operate on the tone or temperature of the impacting colors.&lt;/p&gt;

&lt;p&gt;Each color has many shades, some lighter and some darker, that can be considered as replacements to give a greater degree of contrast. Think about our red-green example. If using a warmer or darker red, try to match that with a cooler or lighter green. If possible, an even better replacement for red would be magenta. As a reference, take a look at the &lt;a href="https://www.ibm.com/design/language/color/" rel="noopener noreferrer"&gt;IBM Design Language&lt;/a&gt; specifications. By separating each basic color into a gradient of darker and lighter shades or hues, you have more options to pick from.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblf29c94xryqrwg83icd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblf29c94xryqrwg83icd.png" alt="Color Gradient from IBM's Design Language color specs" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When in doubt, it may be helpful to test run your palette against color vision deficiency simulations. Tools like &lt;a href="https://www.whocanuse.com/" rel="noopener noreferrer"&gt;WhoCanUse&lt;/a&gt;, &lt;a href="https://davidmathlogic.com/colorblind/#%23D81B60-%231E88E5-%23FFC107-%23004D40" rel="noopener noreferrer"&gt;Coloring for Colorblindness&lt;/a&gt;, and &lt;a href="https://www.color-blindness.com/coblis-color-blindness-simulator/" rel="noopener noreferrer"&gt;Coblis Colorblind Simulator&lt;/a&gt;, among others, give you a look into how your colors may be perceived by users who experience CVD. These tools are not a full replacement for hands-on testers, but they can help you to hone your palette in the earlier stages of development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pfqmulx2te4ewgkxz5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pfqmulx2te4ewgkxz5d.png" alt="Screenshot from the Coloring for Colorblindness tool" width="800" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaborate on Color
&lt;/h2&gt;

&lt;p&gt;Often, a project’s color palette is heavily influenced by branding guidelines or stakeholder preferences. What happens when the primary brand color fails to meet contrast requirements against a white background? Instead of just saying “no,” you should engage stakeholders in a collaborative process. From my own personal experience, here are some tips for starting the conversation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Educate: Start by explaining the &lt;em&gt;why&lt;/em&gt;. Show them the WCAG guidelines and explain the importance of creating an inclusive product that’s usable by the widest possible audience.&lt;/li&gt;
&lt;li&gt;Demonstrate: Use color blindness simulators to show them how users with different types of CVD would perceive their chosen color palette. Seeing the brand’s message become muddled or unreadable is a powerful motivator.&lt;/li&gt;
&lt;li&gt;Find Solutions Together: The goal isn’t to throw out the brand identity but to build an accessible palette around it. Work with them to find slightly darker or lighter shades of the brand colors that do meet contrast requirements. A brand’s “official blue” might be reserved for logos and non-essential decoration, while a new, accessible “web action blue” is created for all interactive elements like buttons and links.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By framing the conversation around creating a better, more effective product, you can turn stakeholders into accessibility advocates and arrive at a color palette that is both brand-aligned and accessible.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;Color accessibility in web design isn’t just about compliance. It’s about building clearer, more inclusive experiences that work for everyone, and building accessible applications is a hallmark of high-quality software. When it comes to color, the path to accessibility is clear: adhere to the contrast ratios defined in WCAG 2.2, provide redundant cues so that color isn’t the only method of communication, and work collaboratively with your team and stakeholders to create a palette that works for everyone.&lt;/p&gt;

&lt;p&gt;These practices don’t just help a fraction of your users; they lead to clearer, more logical designs that improve the user experience across the board. Breaking down barriers to entry means that many more people are invited to find enjoyment in our hard work.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ux</category>
      <category>a11y</category>
      <category>ui</category>
    </item>
    <item>
      <title>Tips Learned From Years of Automated End-to-End Testing</title>
      <dc:creator>Forrest Goyer</dc:creator>
      <pubDate>Tue, 15 Nov 2022 19:37:33 +0000</pubDate>
      <link>https://dev.to/fgoyer/tips-learned-from-years-of-automated-end-to-end-testing-1l28</link>
      <guid>https://dev.to/fgoyer/tips-learned-from-years-of-automated-end-to-end-testing-1l28</guid>
      <description>&lt;p&gt;This blog post was initially featured on the &lt;a href="https://keyholesoftware.com/2022/11/14/tips-learned-from-years-of-automated-end-to-end-testing/"&gt;Keyhole Dev Blog&lt;/a&gt; on Nov 14, 2022.&lt;/p&gt;

&lt;p&gt;Imagine for a moment that we’re getting ready to publish a new app or feature. Following the principles of Test Driven Development (like we always do), we have created a full suite of unit tests. We’re never pressed for time, so we’ve also built out full coverage integration and functional tests.&lt;/p&gt;

&lt;p&gt;In order to ensure our front-end is behaving as expected, we’ll need to either manually step through the application or just push our commit to the main branch and let our continuous integration pipeline do the building and testing for us. But, if we wrote our end-to-end (E2E) tests without automation in mind, we might find the results lacking in usefulness…&lt;/p&gt;

&lt;p&gt;This post isn’t a discussion on what E2E testing is nor a tutorial on how to get started. For that, resources like &lt;a href="https://smartbear.com/solutions/end-to-end-testing/"&gt;Smartbear&lt;/a&gt;, &lt;a href="https://circleci.com/blog/what-is-end-to-end-testing/"&gt;CircleCI&lt;/a&gt;, and &lt;a href="https://playwright.dev/"&gt;Playwright&lt;/a&gt; have already published articles and tutorials that do a great job of covering that ground. In this post, we’ll talk through a few tips I’ve picked up over 5 years of championing fully automated end-to-end testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early and Often
&lt;/h2&gt;

&lt;p&gt;A major perk of automated testing is the ability to run whenever we want. Unlike manual E2E testing, there is no concern with tying up any developers to execute or monitor the runs. With that in mind, the first tip is to run our end-to-end tests early and often. A suite of E2E tests can be utilized as soon as our app is ready to build and then frequently throughout every promotion into downstream environments.&lt;/p&gt;

&lt;p&gt;Running them this early and frequently will help verify that with every build the expected behaviors still exist. The earlier we catch unexpected behavior, the lighter the effort will be to correct it. When a team first begins to build out their E2E testing, the main workflows can be validated first almost as a way of smoke testing, and then adapted from there to cover more of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured to Self-Certify
&lt;/h2&gt;

&lt;p&gt;Now that we’ve established our testing rhythm, how will we write our tests so that they are effective and efficient? We could add steps after every action that ensure the action is executed correctly, but I would argue that in most cases this adds unnecessary bloat.&lt;/p&gt;

&lt;p&gt;That’s why the second tip is that tests should be structured so they are self-certifying. To give an example, an app with a button that triggers a modal would have a testing step that clicks the button, followed by a step that interacts with the modal. If the modal exists, the test continues, and we can be reasonably assured that the button is working.&lt;/p&gt;

&lt;p&gt;Instead of adding steps that only affirm behavior, our test is written such that the affirmation is baked into the next interaction. If the modal didn’t pop up, our interaction step would rightfully fail. What we’re left with is a streamlined and readable test structure that is primarily interacting with the application under test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data = Complexity
&lt;/h2&gt;

&lt;p&gt;Finally, to a tip that was learned the hard way, data adds complexity. In a modern development pipeline with multiple environments, having a dependence on data means that we will need an infrastructure set up to maintain consistent data throughout all of our environments. This can be a massive effort by itself. Instead, writing tests that are data-independent or, at the very least, clean up after themselves will save us a lot of frustration.&lt;/p&gt;

&lt;p&gt;With a CRUD app in mind, at a high level, this may look like writing steps to create a new record. Then, use that record to step through the read, update, and delete operations. The data would then live with the test and could be written in such a way that it can be utilized in any environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing It Together
&lt;/h2&gt;

&lt;p&gt;Bringing it all together, we now have a suite of end-to-end tests that are data-independent, self-certifying, and set up to run automatically after every build. The time that our team was previously spending manually verifying that our app meets behavior expectations and requirements is now passed on to an automated pipeline. This should give us much more time to do something more productive, like creating new features or ignoring the bugs that we totally meant to squash last week.&lt;/p&gt;

&lt;p&gt;Thanks for reading! Let me know what you think in the comments below, and if you liked this post, there are many more on the &lt;a href="https://keyholesoftware.com/blog/"&gt;Keyhole Dev Blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
