{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABHklEQVQY00WRvyvGYRTFP6/3tVtkMxmUyWqSP8BmkKQMkvRmNbxJSsmk8xVlU1IU8qMMfhSlDAYDyiSTRUzGe/R8v48Mt+ee7j3nnnsfLPoslix+LD4sVkJ0W+CCugtqZS7aXJRRTzj+cFXrsuhPeQLjIV4triyKELdWRXIBUZRvLTIuQzn+8aHFYsrJytsWNxZrFmMWwyFaFlsWg5k0k/vmLBohmhZnFkOJG2LBYjk1tlvsh7DFXiZfW1xY7FhsWoxmsXWLyzz0IMRUVLXvEE8WA4ncsHi3GLG4CzFpcW/Ra7FhsZrP0ZMHzFocu6BZnkTMW7xZnIaYJn/Kl0VndpbWfrTosDixeLB4Ts5CfFqcWxxZvCTXUYntWkwkQ7/BJu9d4GccFQAAAABJRU5ErkJggg==","width":400,"height":124,"src":"/static/e85f9e27853b1ae2b55ad25e0aa99c71/140ea/knack-logo-orange.png","srcSet":"/static/e85f9e27853b1ae2b55ad25e0aa99c71/140ea/knack-logo-orange.png 1x,\n/static/e85f9e27853b1ae2b55ad25e0aa99c71/26d9e/knack-logo-orange.png 1.5x,\n/static/e85f9e27853b1ae2b55ad25e0aa99c71/a3fa0/knack-logo-orange.png 2x,\n/static/e85f9e27853b1ae2b55ad25e0aa99c71/4cc84/knack-logo-orange.png 3x"}}},"markdownRemark":{"html":"<h2>Intro</h2>\n<p>Clueless, but looking to up your game on accessibility. Starting on a new project and wanting to make sure you keep accessibility in mind from the start? Or working on improving the accessibility on an existing codebase but not sure where to start? Well here’s some tips for you.</p>\n<p>If you’re generally wondering what web accessibility is, or why it is important, here are some great articles to start with:</p>\n<ul>\n<li>W3C’s <a href=\"https://www.w3.org/WAI/fundamentals/accessibility-intro/\">Introduction to Web Accessibility</a></li>\n<li>Monsido’s <a href=\"https://monsido.com/web-accessibility\">Introduction to Web Accessibility</a></li>\n<li>Wikipedia’s page on <a href=\"https://en.wikipedia.org/wiki/Web_accessibility\">Web accessibility</a></li>\n</ul>\n<p>Here are some helpful tips I’ve learned from a few years of work on web accessibility in React.</p>\n<h2>Navigate everything with a screen reader and keyboard</h2>\n<p>Two key user groups that benefit from accessibility work are screen reader and keyboard users. Until you start navigating pages using the keyboard and a screen reader, you will be clueless to many accessibility challenges your site presents. Even without a deep knowledge of WCAG guidelines, you’ll be able to spot many common accessibility issues just by experiencing the frustrations and confusions of navigating an inaccessible page or feature with a screen reader and keyboard. Identify the issue, then delve into the WCAG guidelines to find the solution.</p>\n<h2>Solve accessibility issues once with atomic design</h2>\n<p>The concept of <a href=\"https://bradfrost.com/blog/post/atomic-web-design/\">Atomic design</a> is especially helpful when considering accessibility. Solving accessibility issues as close to the atomic level as possible means that those issues are resolved in one place for all nested instances.</p>\n<h2>Incrementally build your knowledge around patterns and WCAG requirements</h2>\n<p>Every time you work on a UI component, seek out the WCAG guidelines for the kind of pattern you’re working with (is it a group of radio buttons / checkboxes, a list, a modal?). Read up on the guidelines for it, familiarize yourself with the specific requirements and implement them.</p>\n<h2>Use Accessible UI Frameworks</h2>\n<p>If you’re starting a totally fresh project and want it to be as accessible as possible, utilize a third party design system. The UI frameworks below not only supply beautifully styled primitives, but they also have their accessibility needs abstracted and accounted for.</p>\n<ul>\n<li><a href=\"https://chakra-ui.com/\">Chakra UI</a> (my personal favorite)</li>\n<li><a href=\"https://mui.com/\">Material UI</a> (backed by Google)</li>\n<li><a href=\"https://www.radix-ui.com/\">Radix UI</a></li>\n<li><a href=\"https://headlessui.com/\">Headless UI</a> (built with/by Tailwind)</li>\n</ul>\n<h2>Use Accessibility Tools</h2>\n<p>If you’re invested in an in-house design system, consider utilizing packages like <a href=\"https://react-spectrum.adobe.com/react-aria/\"><code class=\"language-text\">react-aria</code></a> or <a href=\"https://react-native-aria.geekyants.com/\"><code class=\"language-text\">react-native-aria</code></a> which can supply the accessibility minded HTML attributes and behaviors you need in your custom components.</p>\n<h2>Use Semantic HTML</h2>\n<p>Maybe you learned plain old HTML at your bootcamp or in some intro course in computer science. Or maybe (like me), you learned it editing your GeoCities blog and MySpace page. Maybe you’ve moved away from using all those plain old HTML tags like <code class=\"language-text\">button</code>, <code class=\"language-text\">a</code>, <code class=\"language-text\">li</code>, etc. when your wizardry with CSS-in-JS and synthetic events can make a <code class=\"language-text\">div</code> look and behave like <em>anything</em>. Plus you have to purge all that the ugly, outdated user-agent styling of plain HTML anyways…</p>\n<p>Well, screen readers have no idea what those complicated <code class=\"language-text\">divs</code> your React components are actually rendering down to. A tremendous amount of helpful information is provided “for free” just by using semantic HTML.</p>\n<p>MDN has <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML\">a great article</a> that talks more about this.</p>\n<h2>Test for accessibility</h2>\n<p>Seek out an accessibility test library for your test solutions. For us, currently unit testing with React Testing Library and Jest, we found <a href=\"https://www.npmjs.com/package/jest-axe\"><code class=\"language-text\">jest-axe</code></a> perfect for our use case.</p>\n<p>It is said only 30% of accessibility issues can be caught with unit testing. But even catching 30% of issues, either newly introduced or regressions, with unit tests has been extremely helpful.</p>\n<p>Some quick sub-tips from our experience working with <code class=\"language-text\">jest-axe</code>:</p>\n<ul>\n<li>\n<p>wrap your test call in a helper function to allow more centralized, repeatable control over it, like:</p>\n<ul>\n<li>waiting to test the accessibility of a component until it has finished “loading” (received a response from a mocked Apollo GraphQL query).</li>\n<li><code class=\"language-text\">expect</code> not to be testing the accessibility of an error screen</li>\n<li>allow for individual tests to pass down <a href=\"https://github.com/nickcolley/jest-axe#axe-configuration\">options for ignoring particular rules</a>. When unit testing atomic components, we found ourselves needing to systematically ignore some axe rules that didn’t always make sense, like <a href=\"https://dequeuniversity.com/rules/axe/4.1/region\">“region”</a></li>\n</ul>\n</li>\n<li>test a component before and after accessibility work. Whatever <code class=\"language-text\">jest-axe</code> doesn’t catch, like adding an <code class=\"language-text\">aria-*</code> attribute, write a test for to find that attribute to ensure that work never disappears!</li>\n</ul>\n<h2>Communicate the before and after experience</h2>\n<p>When you identify accessibility issues, capture screenshots or gifs of the sub-optimal screen reader / keyboard experience. Then after you fix it, capture the improved “after” experience. It’s really helpful to communicating to other product stakeholders who may not be as familiar with assistive technologies the benefits of accessibility work to see these two experiences side-by-side.</p>\n<h2>Get experts involved</h2>\n<p>Accessibility and WCAG requirements are indeed labyrinth, complicated topics affecting a wide range of users and technologies. Ensuring that a sizeable codebase is accessible to the highest level is not a task suited to someone just entering the subject area. Operating a business with an inaccessible website is not just an ethical issue either, but a legal one in <a href=\"https://www.w3.org/WAI/policies/\">many countries</a>.</p>\n<p>Many organizations offer auditing, subject area expertise, and legal services with regard to web accessibility. Here at Knack, we have paired with <a href=\"https://allyant.com/\">Allyant</a> to help get our product to the highest level of accessibility possible. Their highly trained experts in the accessibility field have helped us identify and remediate challenges to our users. Their knowledge articles on common patterns, issues and guidelines have also been invaluable resources to us on this journey.</p>\n<h2>Further reading</h2>\n<ul>\n<li>Chakra UI’s <a href=\"https://chakra-ui.com/blog/the-beginners-guide-to-building-an-accessible-web\">The beginners guide to building an accessible web</a></li>\n<li>Smashing Magazine’s <a href=\"https://www.smashingmagazine.com/category/accessibility/\">articles on accessibility</a></li>\n</ul>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Intro"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Clueless, but looking to up your game on accessibility. Starting on a new project and wanting to make sure you keep accessibility in mind from the start? Or working on improving the accessibility on an existing codebase but not sure where to start? Well here’s some tips for you."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If you’re generally wondering what web accessibility is, or why it is important, here are some great articles to start with:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"W3C’s "},{"type":"element","tagName":"a","properties":{"href":"https://www.w3.org/WAI/fundamentals/accessibility-intro/"},"children":[{"type":"text","value":"Introduction to Web Accessibility"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Monsido’s "},{"type":"element","tagName":"a","properties":{"href":"https://monsido.com/web-accessibility"},"children":[{"type":"text","value":"Introduction to Web Accessibility"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Wikipedia’s page on "},{"type":"element","tagName":"a","properties":{"href":"https://en.wikipedia.org/wiki/Web_accessibility"},"children":[{"type":"text","value":"Web accessibility"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Here are some helpful tips I’ve learned from a few years of work on web accessibility in React."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Navigate everything with a screen reader and keyboard"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Two key user groups that benefit from accessibility work are screen reader and keyboard users. Until you start navigating pages using the keyboard and a screen reader, you will be clueless to many accessibility challenges your site presents. Even without a deep knowledge of WCAG guidelines, you’ll be able to spot many common accessibility issues just by experiencing the frustrations and confusions of navigating an inaccessible page or feature with a screen reader and keyboard. Identify the issue, then delve into the WCAG guidelines to find the solution."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Solve accessibility issues once with atomic design"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The concept of "},{"type":"element","tagName":"a","properties":{"href":"https://bradfrost.com/blog/post/atomic-web-design/"},"children":[{"type":"text","value":"Atomic design"}]},{"type":"text","value":" is especially helpful when considering accessibility. Solving accessibility issues as close to the atomic level as possible means that those issues are resolved in one place for all nested instances."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Incrementally build your knowledge around patterns and WCAG requirements"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Every time you work on a UI component, seek out the WCAG guidelines for the kind of pattern you’re working with (is it a group of radio buttons / checkboxes, a list, a modal?). Read up on the guidelines for it, familiarize yourself with the specific requirements and implement them."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Use Accessible UI Frameworks"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If you’re starting a totally fresh project and want it to be as accessible as possible, utilize a third party design system. The UI frameworks below not only supply beautifully styled primitives, but they also have their accessibility needs abstracted and accounted for."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://chakra-ui.com/"},"children":[{"type":"text","value":"Chakra UI"}]},{"type":"text","value":" (my personal favorite)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://mui.com/"},"children":[{"type":"text","value":"Material UI"}]},{"type":"text","value":" (backed by Google)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://www.radix-ui.com/"},"children":[{"type":"text","value":"Radix UI"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://headlessui.com/"},"children":[{"type":"text","value":"Headless UI"}]},{"type":"text","value":" (built with/by Tailwind)"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Use Accessibility Tools"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If you’re invested in an in-house design system, consider utilizing packages like "},{"type":"element","tagName":"a","properties":{"href":"https://react-spectrum.adobe.com/react-aria/"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"react-aria"}]}]},{"type":"text","value":" or "},{"type":"element","tagName":"a","properties":{"href":"https://react-native-aria.geekyants.com/"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"react-native-aria"}]}]},{"type":"text","value":" which can supply the accessibility minded HTML attributes and behaviors you need in your custom components."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Use Semantic HTML"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maybe you learned plain old HTML at your bootcamp or in some intro course in computer science. Or maybe (like me), you learned it editing your GeoCities blog and MySpace page. Maybe you’ve moved away from using all those plain old HTML tags like "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"button"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"li"}]},{"type":"text","value":", etc. when your wizardry with CSS-in-JS and synthetic events can make a "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"div"}]},{"type":"text","value":" look and behave like "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"anything"}]},{"type":"text","value":". Plus you have to purge all that the ugly, outdated user-agent styling of plain HTML anyways…"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Well, screen readers have no idea what those complicated "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"divs"}]},{"type":"text","value":" your React components are actually rendering down to. A tremendous amount of helpful information is provided “for free” just by using semantic HTML."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"MDN has "},{"type":"element","tagName":"a","properties":{"href":"https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML"},"children":[{"type":"text","value":"a great article"}]},{"type":"text","value":" that talks more about this."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Test for accessibility"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seek out an accessibility test library for your test solutions. For us, currently unit testing with React Testing Library and Jest, we found "},{"type":"element","tagName":"a","properties":{"href":"https://www.npmjs.com/package/jest-axe"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jest-axe"}]}]},{"type":"text","value":" perfect for our use case."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It is said only 30% of accessibility issues can be caught with unit testing. But even catching 30% of issues, either newly introduced or regressions, with unit tests has been extremely helpful."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some quick sub-tips from our experience working with "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jest-axe"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"wrap your test call in a helper function to allow more centralized, repeatable control over it, like:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"waiting to test the accessibility of a component until it has finished “loading” (received a response from a mocked Apollo GraphQL query)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"expect"}]},{"type":"text","value":" not to be testing the accessibility of an error screen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"allow for individual tests to pass down "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/nickcolley/jest-axe#axe-configuration"},"children":[{"type":"text","value":"options for ignoring particular rules"}]},{"type":"text","value":". When unit testing atomic components, we found ourselves needing to systematically ignore some axe rules that didn’t always make sense, like "},{"type":"element","tagName":"a","properties":{"href":"https://dequeuniversity.com/rules/axe/4.1/region"},"children":[{"type":"text","value":"“region”"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"test a component before and after accessibility work. Whatever "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jest-axe"}]},{"type":"text","value":" doesn’t catch, like adding an "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aria-*"}]},{"type":"text","value":" attribute, write a test for to find that attribute to ensure that work never disappears!"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Communicate the before and after experience"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When you identify accessibility issues, capture screenshots or gifs of the sub-optimal screen reader / keyboard experience. Then after you fix it, capture the improved “after” experience. It’s really helpful to communicating to other product stakeholders who may not be as familiar with assistive technologies the benefits of accessibility work to see these two experiences side-by-side."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Get experts involved"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Accessibility and WCAG requirements are indeed labyrinth, complicated topics affecting a wide range of users and technologies. Ensuring that a sizeable codebase is accessible to the highest level is not a task suited to someone just entering the subject area. Operating a business with an inaccessible website is not just an ethical issue either, but a legal one in "},{"type":"element","tagName":"a","properties":{"href":"https://www.w3.org/WAI/policies/"},"children":[{"type":"text","value":"many countries"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Many organizations offer auditing, subject area expertise, and legal services with regard to web accessibility. Here at Knack, we have paired with "},{"type":"element","tagName":"a","properties":{"href":"https://allyant.com/"},"children":[{"type":"text","value":"Allyant"}]},{"type":"text","value":" to help get our product to the highest level of accessibility possible. Their highly trained experts in the accessibility field have helped us identify and remediate challenges to our users. Their knowledge articles on common patterns, issues and guidelines have also been invaluable resources to us on this journey."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Further reading"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Chakra UI’s "},{"type":"element","tagName":"a","properties":{"href":"https://chakra-ui.com/blog/the-beginners-guide-to-building-an-accessible-web"},"children":[{"type":"text","value":"The beginners guide to building an accessible web"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Smashing Magazine’s "},{"type":"element","tagName":"a","properties":{"href":"https://www.smashingmagazine.com/category/accessibility/"},"children":[{"type":"text","value":"articles on accessibility"}]}]},{"type":"text","value":"\n"}]}],"data":{"quirksMode":false}},"excerpt":"IntroClueless, but looking to up your game on accessibility. Starting on a new project and wanting to make sure you keep accessibility in…","timeToRead":5,"frontmatter":{"title":"Beginners Tips for Web Accessibility in React","userDate":"February 3 2023","date":"2023-02-03T15:24:00.0Z","tags":["Engineering"],"image":null,"author":{"id":"Keith Potempa","bio":"Software Engineer","avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/webp;base64,UklGRrAAAABXRUJQVlA4IKQAAADQBACdASoUABQAPtFepU6oJSMiKAqpABoJYwDImBD1NefG4Sa98fHm94Rf89c6AAD+8qoKOSNnfsJ8vhTjttpAXRb+uXkYQBolgcZvAQ2LqTk+u0XpYnHeT3aGIUyrGYQkdgngW1RJFx6D6XmZDlv5b+zkeOO+cRlr6bIze3tSpO3++vAfz61sRGA73v/NFlVrfOzvzxX+xutAdrjxvj1t3wwAAA==","width":400,"height":400,"src":"/static/d2bf68563297faf59bb3d4e587671576/bb49b/keith-potempa.webp","srcSet":"/static/d2bf68563297faf59bb3d4e587671576/bb49b/keith-potempa.webp 1x,\n/static/d2bf68563297faf59bb3d4e587671576/3c423/keith-potempa.webp 1.5x"}}]}}}},"relatedPosts":{"totalCount":20,"edges":[{"node":{"id":"e7b92535-950b-59c7-95f5-8ab80af08338","timeToRead":5,"excerpt":"IntroClueless, but looking to up your game on accessibility. Starting on a new project and wanting to make sure you keep accessibility in…","frontmatter":{"title":"Beginners Tips for Web Accessibility in React"},"fields":{"slug":"/a11y/"}}},{"node":{"id":"6c69d8f0-7998-5387-93e4-6547e3940c0d","timeToRead":9,"excerpt":"Pull Requests (PRs) are an essential part of the software development workflow, allowing developers to propose changes, contribute new…","frontmatter":{"title":"The Art (and Science) of Reviewable PRs"},"fields":{"slug":"/art-and-science-of-reviewable-prs/"}}},{"node":{"id":"2ababe59-b3e5-5fc9-9863-6d51c8356a00","timeToRead":10,"excerpt":"Late last year, we started looking into embedded analytical dashboard solutions. We concluded that embedding pre-built dashboards would…","frontmatter":{"title":"Unlocking the Power of Data with Cube on AWS: A Comprehensive Guide"},"fields":{"slug":"/aws-cube-js-deployment/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/a11y/","prev":{"excerpt":"WebSockets are a ubiquitous tool for building real-time experiences for users. They provide a persistent, bidirectional connection between a…","timeToRead":13,"frontmatter":{"title":"Setting up a WebSocket server for your Laravel app","tags":["Engineering"],"date":"2023-01-30T15:00:00.0Z","draft":false,"image":null,"author":{"id":"Misha Hawthorn","bio":"Senior Software Engineer","avatar":{"children":[{"fixed":{"src":"/static/07417efdedf83537485b65256cece4bf/c32cc/misha-hawthorn.jpg"}}]}}},"fields":{"layout":"post","slug":"/laravel-websocket-server-guide/"}},"next":{"excerpt":"When starting Knack in 2015, an early decision we made was to use AWS as our primary cloud provider. We started with a single AWS account…","timeToRead":2,"frontmatter":{"title":"AWS Multi-account access with Granted","tags":["Engineering","AWS"],"date":"2023-02-24T18:00:00.0Z","draft":false,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.7777777777777777,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABa0lEQVQoz6VSTU/CQBTsb1GBttt2t2AgUVFqEEQw4SNgIHhRwa8mBuWAEERjiCHc1P87ZhfadDd68jCZ2dnuvL6Xp1mUgTgUhFLB/CzgsFCLe0e+V3Vw1lSDEApirbRpO7CZK4H7gZbeSYF0bfIgz4W158IwbbDUNmK6gbhhYjOeEJoX4bwRi0thSiALA92XDHSfol5t4mOxwGW/j4urHm7vffSubzCZTnHn+8IfPY+R2dmFbtlh+1o4B5PCLrhgwzT0mo3TSg2L5RKDpyGmsxk+v77xMHjEaDzB+3wuis1e35BKZ2CogSSYAWOwdhmsnAvTdER7WwkdOrEE81YTJhHMR8Dvf59h1LRXrdNkCtV6A+1uF41WC2ftDurNJtrdc3TWKJUr0t/JgdE1oRSOm0Q256FwXIKXPxKcLxSx7x2ieFIWOnuQk1ctOkMV/ENenbfIW+bMEXiBVndSiy6tir+KqYWj0NTF/S9+AMP8aQvKVRDAAAAAAElFTkSuQmCC","sizes":"(max-width: 1280px) 100vw, 1280px","src":"/static/94884cefe83f548341a32010238fad1c/91f24/granted-banner.png","srcSet":"/static/94884cefe83f548341a32010238fad1c/4c9af/granted-banner.png 930w,\n/static/94884cefe83f548341a32010238fad1c/91f24/granted-banner.png 1280w"}}},"author":{"id":"David Stoker","bio":"Co-founder and CTO","avatar":{"children":[{"fixed":{"src":"/static/6c26e23b066ba32dc1aa27a735b634f2/c32cc/david-stoker.jpg"}}]}}},"fields":{"layout":"post","slug":"/aws-granted/"}},"primaryTag":"Engineering"}}