<?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>Forem: Ashlee (she/her)</title>
    <description>The latest articles on Forem by Ashlee (she/her) (@ashleemboyer).</description>
    <link>https://forem.com/ashleemboyer</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%2F156486%2F36dfc2ab-7625-4dc8-ad22-a269201ef821.jpeg</url>
      <title>Forem: Ashlee (she/her)</title>
      <link>https://forem.com/ashleemboyer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashleemboyer"/>
    <language>en</language>
    <item>
      <title>Nevertheless, Ashlee Coded in 2022</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Thu, 10 Mar 2022 02:40:18 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/nevertheless-ashlee-coded-in-2022-398a</link>
      <guid>https://forem.com/ashleemboyer/nevertheless-ashlee-coded-in-2022-398a</guid>
      <description>&lt;p&gt;So much has happened since &lt;a href="https://dev.to/ashleemboyer/nevertheless-ashlee-coded-3g1n"&gt;the last #shecoded post I published&lt;/a&gt;. I dealt with pay discrimination and sexual harassment for 10 months. I dealt very difficult mental health issues after leaving that environment. I wrote about &lt;a href="https://ashleemboyer.com/blog/speaking-my-truth"&gt;my experience&lt;/a&gt; as part of my healing process. I have also since written about &lt;a href="https://dev.to/ashleemboyer/what-a-jar-of-buttons-is-teaching-me-about-trust-jof"&gt;my experience of re-building trust in the workplace&lt;/a&gt;. I found a supportive and collaborative team I'm so grateful to be a member of, and I have come such a long way in my healing process.&lt;/p&gt;

&lt;p&gt;Very recently, I was officially diagnosed with ADHD am now on the path to finding a treatment that works for me. This has been going really well so far, and I'm back to doing things I haven't done in years. This year, some of what I'm looking forward to is writing more, reading more, creating video content, and some community building. Despite the things I've been through in the last several years, I'm still here and I'm still coding. Thanks for being here with me along the journey. 💖&lt;/p&gt;

</description>
      <category>wecoded</category>
    </item>
    <item>
      <title>What a Jar of Buttons Is Teaching Me About Trust</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Fri, 21 Jan 2022 03:58:52 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/what-a-jar-of-buttons-is-teaching-me-about-trust-jof</link>
      <guid>https://forem.com/ashleemboyer/what-a-jar-of-buttons-is-teaching-me-about-trust-jof</guid>
      <description>&lt;p&gt;For most of 2021, I felt defeated as a disabled woman in tech. Sexism and ableism were in every part of my life at a level I'd not experienced before. I'm very used to seeing both on the internet, but even that became too much. &lt;a href="https://ashleemboyer.com/blog/speaking-my-truth"&gt;In a job I held for most of the year, I suffered pay discrimination, biased treatment, and sexual harassment&lt;/a&gt;. When I escaped that situation, I knew I'd have a lot of healing ahead of me but I had no idea how much.&lt;/p&gt;

&lt;p&gt;One thing I've learned about what I went through is that far more people than I thought have a similar experience. What we went through may not have been very similar, but the effect of the trauma was. I think it has something to do with being in a survival mode, where all you can really think about and focus on is making it through. I think this is also a reason it can take so long to fully realize we're in traumatic situations.&lt;/p&gt;

&lt;p&gt;As soon as we're out of immediate danger, the full gravity of a the situation can set in. We can slow down and think about what happened because we're in a place that is safer than before. In the first several weeks of my job I currently hold, I was anxious &lt;em&gt;all of the time&lt;/em&gt;. The list of things contributing to that is long, but here are a few things that are top of mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pressure to do well in a new job at a well-known company in the industry I work in.&lt;/strong&gt; I would consider this a normal pressure of being a working person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiting for the other shoe to drop, because it always has.&lt;/strong&gt; If you don't know what this phrase means, I think &lt;a href="https://gothamist.com/arts-entertainment/the-phrase-waiting-for-the-other-shoe-to-drop-was-born-in-nyc"&gt;the explanation on gothamist.com&lt;/a&gt; is good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expecting toxic behavior and having a guard up ready to protect myself.&lt;/strong&gt; In the past, I've been called names, gaslit about facts clearly backed by documentation and timestamps, bullied into changing my mind (or caving into pressure, rather), severely under-leveled and underpaid, held to different and unexplained standards than men on my team, not taken seriously when reporting issues, ignored in team channels whether asking for help or proposing a discussion, and more. These things didn't just happen at my previous job, they've happened in many places. But the level of toxicity in that environment is the highest I've experienced.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I've seen the same therapist since right before the pandemic started. We have talked &lt;em&gt;&lt;strong&gt;endlessly&lt;/strong&gt;&lt;/em&gt; about the occupational dimension of wellness. We've talked about it so much, we also talk about overwhelming that dimension has been for me over the years.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Skipping ahead in my story a tiny bit, we joked last time we spoke that we have nothing to talk about now since my work stress is very low now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I told my therapist about the struggles I was having, where I felt anxious immediately after sending messages in team channels, was spending a lot of time figuring out how to word messages in what should be easy conversations, she asked me if I'd heard of Brené Brown's marble jar metaphor. You can see her explain the metaphor &lt;a href="https://brenebrown.com/videos/anatomy-trust-video/"&gt;in a talk on her website&lt;/a&gt;, but the gist is this: when people do even the smallest thing that improves your trust in them, it counts as a marble towards the marble jar. The more the jar fills up with marbles, the more you trust them.&lt;/p&gt;

&lt;p&gt;The lesson is that trust is built over time with seemingly small and insignificant moments. After taking some time to think and process the metaphor, I decided I wanted to make rebuilding trust a prioritized and visual experience. So I decided to get a jar but fill it with buttons instead of marbles. Dropping a marble in the jar would've been too noisy of an experience, and this endeavor could double as a cute and fun button-collecting journey. I picked up some regular-sized colorful buttons and some much larger diamond-looking buttons. I designated the extra special buttons for trust-building moments that made me feel incredibly valued and grateful.&lt;/p&gt;




&lt;p&gt;So far, this experience has been exactly what I need. Looking for all the good in my days had a similar effect to gratitude journals, I assume. I am looking more towards the good things than the bad, but not in a way that subscribes to toxic positivity. I'm still keenly aware that some bad things might happen, but I'm not expecting them to. I'm retraining my brain to look at situations in a more balanced and healthy way.&lt;/p&gt;

&lt;p&gt;Examples of moments that are button jar worthy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Getting thanked for vulnerability from multiple managers on my team.&lt;/strong&gt; Many of my previous experiences involve being told that I'm too emotional. Vulnerability has been the main thing that's brought me closer to the majority of people I know, so it's a relief to know that vulnerability is so valued.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teammates engaging in discussions I start, and doing so in genuine and authentic ways.&lt;/strong&gt; In previous experiences, I've often gotten silence or dismissive responses. When teammates engage kindly and with interest, it shows we have a mutual goal to learn together and teach one another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Getting asked questions about accessibility.&lt;/strong&gt; This is the first time I've been asked about accessibility regularly at work. It is so refreshing to be asked questions about my area of focus that is so deeply personal to me as a disabled person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Having normal conversations in code review.&lt;/strong&gt; Code review is one area that I have a hard time in because in my experience, they either weren't a part of the development process or they weren't done in healthy ways with the right intentions. Seeing teammates regularly give each other compliments, share resources, discuss pros and cons, and being treated with all of that same kindness... it's hard to describe how valued it makes me feel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add to the very last point, I even found myself putting buttons in the jar for things that had nothing to do with me directly. Seeing teammates treat each other with kindness and respect showed me how they would likely treat me as well.&lt;/p&gt;




&lt;p&gt;In the new year, I plan to keep doing what I'm doing. I don't really subscribe to annual resolutions. I'll do this until it's not valuable for me anymore, which I hope is far off because I'm excited to see the jar fill up with buttons and become a really beautiful item on my desk. I want it to be a constant visual reminder of how far I've come on this journey to healing.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>trust</category>
      <category>vulnerability</category>
      <category>workplacetrauma</category>
    </item>
    <item>
      <title>How I Added an RSS Feed to My Next.js Site</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Tue, 13 Jul 2021 11:39:14 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/how-i-added-an-rss-feed-to-my-next-js-site-4en9</link>
      <guid>https://forem.com/ashleemboyer/how-i-added-an-rss-feed-to-my-next-js-site-4en9</guid>
      <description>&lt;p&gt;I recently came across &lt;a href="https://twitter.com/SaraSoueidan/status/1390598514774847496"&gt;a tweet from Sara Soueidan&lt;/a&gt; applauding folks who provide an RSS feed on their site. Sara is someone I highly admire in frontend web development and accessibility, but I had so little knowledge of RSS feeds and so many questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the heck are they?&lt;/li&gt;
&lt;li&gt;What are they for?&lt;/li&gt;
&lt;li&gt;I thought people didn't use them anymore?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you also have questions like this, I recommend reading &lt;a href="https://rss.com/blog/how-do-rss-feeds-work/"&gt;How Do RSS Feeds Work?&lt;/a&gt; right from RSS.com. The first few words really sum it up:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine being able to log into one dashboard and getting the latest news and events from all of your favorite websites, blogs, or podcasts? With RSS feeds, it’s possible!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To better understand how RSS feeds are consumed, I created my own RSS reader app and I also &lt;a href="https://ashleemboyer.com/create-your-own-nextjs-rss-reader-app"&gt;wrote about it&lt;/a&gt; so you can create one too if you like. The app I created also served as a great way for me to test my RSS feed as I built it!&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Added an RSS Feed to my Next.js Site
&lt;/h2&gt;

&lt;p&gt;There were two main problems I ran into while trying to build an RSS feed for my articles. Firstly, I didn't know that neither the &lt;code&gt;&amp;lt;description&amp;gt;&lt;/code&gt; nor &lt;code&gt;content&lt;/code&gt; of each &lt;code&gt;&amp;lt;item&amp;gt;&lt;/code&gt; in the channel can't have regular HTML in it. &lt;a href="https://cyber.harvard.edu/rss/encodingDescriptions.html"&gt;The HTML tags must be encoded&lt;/a&gt;. Secondly, I found out it's really difficult to try to parse the HTML content in a Node.js environment on my own before putting it into the feed.&lt;/p&gt;

&lt;p&gt;After struggling for hours and trying several different approaches, I &lt;a href="https://twitter.com/AshleeMBoyer/status/1391568723581054978"&gt;went to Twitter for help&lt;/a&gt;. There were a lot of helpful replies! I found exactly what I ended up using thanks to &lt;a href="https://github.com/sweeneyapps/html2rssfeed"&gt;an example project&lt;/a&gt; from &lt;a href="https://twitter.com/vphreak/status/1391853784666501121"&gt;@vphreak&lt;/a&gt;. So, what did it take?&lt;/p&gt;

&lt;p&gt;First, I installed &lt;a href="https://github.com/jpmonette/feed"&gt;the &lt;code&gt;feed&lt;/code&gt; package&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add feed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, I added a &lt;code&gt;generateRSSFeed&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generateRSSFeed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://ashleemboyer.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ashlee Boyer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello@ashleemboyer.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://twitter.com/ashleemboyer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Construct a new Feed object&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Feed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Articles by Ashlee M Boyer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You can find me talking about issues surrounding Disability, Accessibility, and Mental Health on Twitter, or you can find me regularly live-knitting or live-coding on Twitch. I'm @AshleeMBoyer on all the platforms I use.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;feedLinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;rss2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rss.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Add each article to the feed&lt;/span&gt;
  &lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Write the RSS output to a public file, making it&lt;/span&gt;
  &lt;span class="c1"&gt;// accessible at ashleemboyer.com/rss.xml&lt;/span&gt;
  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/rss.xml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rss2&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I updated the &lt;code&gt;getStaticProps&lt;/code&gt; function exported from &lt;code&gt;src/pages/index.jsx&lt;/code&gt; to call the new &lt;code&gt;generateRSSFeed&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getStaticProps&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getAllArticles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;generateRSSFeed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because my site is set up to build only when my main git branch is updated, &lt;code&gt;getStaticProps&lt;/code&gt; will be called at that time and so will &lt;code&gt;generateRSSFeed&lt;/code&gt;. This means the feed is always up to date when I push a new Markdown file for each post or whenever existing files are updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://validator.w3.org/feed/docs/rss2.html"&gt;RSS 2.0 Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jpmonette/feed#readme"&gt;&lt;code&gt;feed&lt;/code&gt; GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/xml/xml_rss.asp"&gt;W3Schools XML RSS page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rss</category>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What the heck is "web a11y"?</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Tue, 06 Jul 2021 15:14:08 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/what-the-heck-is-web-a11y-blp</link>
      <guid>https://forem.com/ashleemboyer/what-the-heck-is-web-a11y-blp</guid>
      <description>&lt;p&gt;If you've seen "a11y" floating around the web development space and you're not sure what it means or how to say it, you're absolutely not alone. Don't feel bad! Almost no one knows what it is until someone else tells them. I didn't know for a long time. I even created a tool that relies on the mispronunciation of it!&lt;/p&gt;

&lt;h2&gt;
  
  
  The What
&lt;/h2&gt;

&lt;p&gt;"A11y" is a numeronym or number-based word. It is composed of three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"a"&lt;/code&gt; - the first letter of the word "accessibility"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"11"&lt;/code&gt; - the number of letters between the first and last letters of the word "accessibility"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"y"&lt;/code&gt; - the last letter of the word "accessibility"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Numeronyms are very common in web development! Think of "K8s" (Kubernetes), "i18n" (internationalization), and "o11y" (observability) as a few of examples. Some of them have different pronunciations depending on how the number in the middle is pronounced in combination with the letters before and after it.&lt;/p&gt;

&lt;p&gt;The way we pronounce "K8s" is different than the way we pronounce "a11y" because of how the numbers flow with the other letters. We &lt;em&gt;could&lt;/em&gt; pronounce "K8s" as "kay-eight-ess", but "keights" (see the word eight in the middle?) is a single syllable and a little easier to say.&lt;/p&gt;

&lt;h2&gt;
  
  
  The How
&lt;/h2&gt;

&lt;p&gt;So how to do we pronounce "a11y"? We say "aye-eleven-why". Pronunciations like "al-ee" or "al-eye" don't quite fit like most other pronunciations of numeronyms because they're not saying the number in the middle at all. This isn't to say that all numeronyms are said the same way, but most that use this format follow this idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Why
&lt;/h2&gt;

&lt;p&gt;Numeronyms are often used when their original word is a lot of characters or difficult to pronounce. &lt;a href="https://en.wikipedia.org/wiki/Numeronym"&gt;According to Wikipedia&lt;/a&gt;, the first numeronym was created in the 1980s for a software account owner's surname because it was too long for the system to handle. "Accessibility" is 6 syllables whereas its numeronym is 1 less. That's not a huge amount of savings, but the phonetics of "a11y" are easier for many people to verbalize than "accessibility" because the there are less "harsh" syllables in comparison.&lt;/p&gt;

&lt;p&gt;Numeronyms are also helpful where brevity is important, such as in tweets because Twitter enforces a character maximum. Since there are less characters to type, it can also be more efficient once you get used to using it. For me personally, it's also easier to remember how to spell!&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I have to use it?
&lt;/h2&gt;

&lt;p&gt;Nope! If you like using the word "accessibility" more than you like using the "a11y" numeronym, please continue to do so. It's definitely a matter of preference and using one or the other does not make you more or less knowledgeable. If someone tells you otherwise, they are unfairly gatekeeping the topic of web accessibility. What truly matters is that you know what "a11y" means so you're not thrown off when you read it in other people's content.&lt;/p&gt;

&lt;p&gt;Remember: everyone has different accessibility needs. Some people use "a11y" because it's more accessible to them. If "accessibility" is more accessible to you, that's totally acceptable!&lt;/p&gt;




&lt;p&gt;If you liked this article and found it useful, please consider sharing it! If you want to get notified when I publish more content like this, consider &lt;a href="https://ashleemboyer.com/newsletter"&gt;subscribing to my email newsletter&lt;/a&gt;. Otherwise, feel free to &lt;a href="//mailto:hello@ashleemboyer.com"&gt;send me an email&lt;/a&gt; if you have any questions or feedback! I'll be happy to hear from you.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>numeronym</category>
    </item>
    <item>
      <title>How to Create Your Own Next.js RSS Reader App</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Wed, 26 May 2021 12:45:34 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/how-to-create-your-own-next-js-rss-reader-app-2bco</link>
      <guid>https://forem.com/ashleemboyer/how-to-create-your-own-next-js-rss-reader-app-2bco</guid>
      <description>&lt;p&gt;I recently came across &lt;a href="https://twitter.com/SaraSoueidan/status/1390598514774847496"&gt;a tweet from Sara Soueidan&lt;/a&gt; applauding folks who provide an RSS feed on their site. Sara is someone I highly admire in frontend web development and accessibility, but I had so little knowledge of RSS feeds and so many questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the heck are they?&lt;/li&gt;
&lt;li&gt;What are they for?&lt;/li&gt;
&lt;li&gt;I thought people didn't use them anymore?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you also have questions like this, I recommend reading &lt;a href="https://rss.com/blog/how-do-rss-feeds-work/"&gt;How Do RSS Feeds Work?&lt;/a&gt; right from RSS.com. The first few words really sum it up:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine being able to log into one dashboard and getting the latest news and events from all of your favorite websites, blogs, or podcasts? With RSS feeds, it’s possible!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;RSS feeds mean I can read all of my favorite blogs in one place?? And I don't &lt;em&gt;have&lt;/em&gt; to subscribe to newsletters to know when a new post has been published?? That sounds so lovely! I knew then that I definitely needed to figure out how to provide an RSS feed for my own site.&lt;/p&gt;

&lt;p&gt;In order to better understand how to create an RSS feed for my site, I needed to better understand how they are used. This is where I got the idea to create my own RSS reader app! Once I had the app finished, it also doubled as a way for me to test my RSS feed as I developed it.&lt;/p&gt;

&lt;p&gt;I had a ton of fun with it so I decided to share my findings with y'all in case you also want to make your own RSS reader app. I hope you find the instructions below helpful and as always, let me know on Twitter if you have any questions!&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Create Your Own Next.js RSS Reader App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fork and clone the repo
&lt;/h3&gt;

&lt;p&gt;First, you need to create a fork of the starter code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/ashleemboyer/nextjs-rss-reader-starter"&gt;the GitHub repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click the "Fork" button at the top right of the page&lt;/li&gt;
&lt;li&gt;Follow the steps provided by GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Second, clone the fork you've created onto your machine and install the dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;your fork&amp;gt;    &lt;span class="c"&gt;# Clones the fork&lt;/span&gt;
yarn                     &lt;span class="c"&gt;# Installs the dependencies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set up Firebase Authentication
&lt;/h3&gt;

&lt;p&gt;Third, you need to create a Firebase project since it'll handle authentication. You want this app to have authentication so that other people aren't driving up your API requests that will be made to RSS to JSON (we'll set that up next).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://console.firebase.google.com"&gt;console.firebase.google.com&lt;/a&gt; and make sure you're logged in with the Google account you want to use.&lt;/li&gt;
&lt;li&gt;Click the card that says "Add project". It should be the first one listed.&lt;/li&gt;
&lt;li&gt;Enter a project name. I'm going to use &lt;code&gt;nextjs-rss-reader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Toggle "Enable Google Analytics for this project" to off.&lt;/li&gt;
&lt;li&gt;Click "Create project".&lt;/li&gt;
&lt;li&gt;Click "Continue" when your new project is ready.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a video showing these steps (the project name is different):&lt;/p&gt;

&lt;p&gt;Firebase makes it easy for us to set up email/password authentication in our app. It's also easy to add a user for ourselves right from the console. Make sure you use a real email address and a secure password for your user. This is how you're protecting your feed!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="//console.firebase.google.com"&gt;the Firebase console&lt;/a&gt; for your project.&lt;/li&gt;
&lt;li&gt;Go to the "Authentication" page under "Build".&lt;/li&gt;
&lt;li&gt;Click "Get Started".&lt;/li&gt;
&lt;li&gt;You should be on the "Sign-in method" tab.&lt;/li&gt;
&lt;li&gt;Click "Email/Password".&lt;/li&gt;
&lt;li&gt;Enable the first toggle.&lt;/li&gt;
&lt;li&gt;Click "Save".&lt;/li&gt;
&lt;li&gt;Switch to the "Users" tab.&lt;/li&gt;
&lt;li&gt;Click "Add user".&lt;/li&gt;
&lt;li&gt;Enter a secure email and password.&lt;/li&gt;
&lt;li&gt;Click "Add user".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a video showing these steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Create an RSS to JSON account
&lt;/h3&gt;

&lt;p&gt;Next, let's set up an &lt;a href="//rss2json.com"&gt;RSS to JSON&lt;/a&gt; account so we can get an API key for making API requests. I personally have a paid plan because of the number of feeds I subscribe to, but the free plan is pretty nice! At the time of this writing, the free plan updates a feed once an hour, allows 10,000 requests per day, and supports 25 feeds. The starter code is currently set up to generate your site no more than once per day, so at the very most, you'll be making 1 request per feed per day.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for an RSS to JSON account at &lt;a href="https://rss2json.com/sign-up"&gt;this link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get your API key from &lt;a href="https://rss2json.com/me/api_key"&gt;the My Account page&lt;/a&gt; and have it ready for the next step.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Create a .env file
&lt;/h3&gt;

&lt;p&gt;In the root of your forked project, create a file called &lt;code&gt;.env&lt;/code&gt;. It will have four items in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RSS_2_JSON_API_KEY=&amp;lt;your RSS to JSON api key&amp;gt;
NEXT_PUBLIC_FIREBASE_API_KEY=&amp;lt;your Firebase project's API key&amp;gt;
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=&amp;lt;your Firebase project's auth domain&amp;gt;
NEXT_PUBLIC_FIREBASE_PROJECT_ID=&amp;lt;your Firebase project ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put your RSS to JSON API key from the previous step with the &lt;code&gt;RSS_2_JSON_API_KEY&lt;/code&gt; item. You can get the other items from Firebase after registering your app. Here are the steps for that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="//console.firebase.google.com"&gt;the Firebase console&lt;/a&gt; for your project.&lt;/li&gt;
&lt;li&gt;Go to the project settings.&lt;/li&gt;
&lt;li&gt;Scroll to the bottom of the page where it says "Your apps."&lt;/li&gt;
&lt;li&gt;Click the "&amp;lt;/&amp;gt;" button to register your app for web.&lt;/li&gt;
&lt;li&gt;For "App nickname", enter &lt;code&gt;nextjs-rss-reader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click the "Register app" button.&lt;/li&gt;
&lt;li&gt;Copy and paste the &lt;code&gt;apiKey&lt;/code&gt;, &lt;code&gt;authDomain&lt;/code&gt;, and &lt;code&gt;projectId&lt;/code&gt; values with the last three items in your &lt;code&gt;.env&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Start the app
&lt;/h3&gt;

&lt;p&gt;We're ready to go! Start the app with &lt;code&gt;yarn dev&lt;/code&gt; and go to &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt; in your browser. You should be redirected to the login page where you can enter your email and password for the user you created in the second part of the Set up Firebase Authentication section above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8aJYYI3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F05%252Fcreate-your-own-nextjs-rss-reader-app%252Flogin-page.png%3Falt%3Dmedia%26token%3D0ec4c0d0-6939-4858-a76d-31bd7d2f5010" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8aJYYI3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F05%252Fcreate-your-own-nextjs-rss-reader-app%252Flogin-page.png%3Falt%3Dmedia%26token%3D0ec4c0d0-6939-4858-a76d-31bd7d2f5010" alt='Browser window screenshot with a background of large, dark green leaves. The window shows a white webpage showing "Log In" text at the top. There is an input for email and password and a gray "Sign In" button.' width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After logging in, you should see a list of articles. You can click the "Read here" links to read the article within your app, or you can click the "Read at source" link to read the original version of the article!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5WMxloe5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F05%252Fcreate-your-own-nextjs-rss-reader-app%252Farticles-page.png%3Falt%3Dmedia%26token%3D81e422b0-addc-47fe-ae3d-539477222d39" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5WMxloe5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F05%252Fcreate-your-own-nextjs-rss-reader-app%252Farticles-page.png%3Falt%3Dmedia%26token%3D81e422b0-addc-47fe-ae3d-539477222d39" alt="Browser window screenshot with a background of large, dark green leaves. The window shows a white webpage with black text. The title is &amp;quot;My RSS Reader&amp;quot; and there is a vertical list of articles with thin black borders. Each article first shows the title in large bold text, then the name of the feed, author, and publish date on the next line, then a horizontal rule, and lastly the article's description as HTML." width="800" height="805"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Customize your feed
&lt;/h3&gt;

&lt;p&gt;The app knows what feeds to fetch by the &lt;code&gt;feed.txt&lt;/code&gt; file in the root of the project. If you open the file, you'll see three listed with each one on its own line in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.a11yproject.com/feed/feed.xml
https://webaim.org/blog/feed/
http://www.webaxe.org/feed/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to remove a feed, just delete the line. If you want to add a feed, make sure it's on its own line. That's it! Happy reading. :)&lt;/p&gt;

</description>
      <category>rss</category>
      <category>nextjs</category>
      <category>firebase</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Nevertheless, Ashlee Coded</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Tue, 09 Mar 2021 02:38:49 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/nevertheless-ashlee-coded-3g1n</link>
      <guid>https://forem.com/ashleemboyer/nevertheless-ashlee-coded-3g1n</guid>
      <description>&lt;p&gt;2020 was both the best and worst year. I challenged myself more than ever and I was also given challenges I have never faced.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In January of 2020, I started physical therapy to learn how to walk again after having foot surgery a few weeks before. I dealt with inaccessibility in ways I’d never had to before and it was hurtful in a lot of ways. I didn’t quite feel invisible. It was more like people didn’t want to see me and chose not to. They chose to be exclusive and inaccessible.&lt;/li&gt;
&lt;li&gt;In April of 2020, I started &lt;a href="https://twitch.tv/ashleemboyer"&gt;a Twitch channel&lt;/a&gt;. I’ve met absolutely incredible people through Twitch and I’ve enjoyed every minute of live knitting and live coding. 🥰&lt;/li&gt;
&lt;li&gt;At the end of July 2020, I spoke on &lt;a href="https://twitter.com/twitterdesign/status/1293238566567387136"&gt;Twitter’s Disability in UX panel&lt;/a&gt; in front of hundreds of people. It was my largest speaking experience by far and it was fascinating for that moment to be completely remote. The linked broadcast has over 3,000 views. I have no doubt people heard us and are changing how they approach accessibility.&lt;/li&gt;
&lt;li&gt;Also in July of 2020, I quit my job without having another one lined up. I drained my savings and was searching for months for a job. Job hunting was an incredibly demeaning process that I feel like I’ve only just regained my confidence from. I also had a ton of financial support when I asked for it. I don’t know what would have happened without that assistance from the community. 💜&lt;/li&gt;
&lt;li&gt;In November of 2020, I started my 4th job. I’ve had several new and fun technical challenges there and am building my skills faster than I ever have. It’s also in an industry I’ve never worked in and I’m always learning things from people outside of my department.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aside from these notable dates, I’ve also learned a great deal about myself while exploring a potential ADHD diagnosis. I know myself better than I ever have and also accept myself more than I ever have. And with more time to gaze on the internet, I’ve found a ton of disabled and/or fat and/or BIPOC and/or neurodivergent creators on TikTok where I’ve learned more about our world and myself than I could’ve imagined.&lt;/p&gt;

&lt;p&gt;Overall, I feel lucky to say that I came out of 2020 a better person than I went in. It is certainly a privilege to say that. I didn’t get through the year completely healthy, but I didn’t covid and I didn’t lose anyone to covid. I feel very lucky to have survived the year. I’m still here and working hard to speak and write about accessibility. 💜&lt;/p&gt;

</description>
      <category>wecoded</category>
    </item>
    <item>
      <title>Zoom Live Transcription Update 🚨</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Thu, 25 Feb 2021 15:19:50 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/zoom-live-transcription-update-3gmn</link>
      <guid>https://forem.com/ashleemboyer/zoom-live-transcription-update-3gmn</guid>
      <description>&lt;p&gt;Zoom is offering live transcriptions to free users upon request and all free users will have access by autumn 2021.&lt;/p&gt;

&lt;p&gt;Link to announcement: &lt;a href="https://blog.zoom.us/update-on-live-transcription-for-free-accounts/"&gt;https://blog.zoom.us/update-on-live-transcription-for-free-accounts/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link to request form: &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSccQQ2W-K8naaltkBIbuv6BfJvisy0NZS2qWIKd0gSMUWGGpQ/viewform"&gt;https://docs.google.com/forms/d/e/1FAIpQLSccQQ2W-K8naaltkBIbuv6BfJvisy0NZS2qWIKd0gSMUWGGpQ/viewform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>zoom</category>
      <category>news</category>
    </item>
    <item>
      <title>My Writing and Planning Process</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Thu, 18 Feb 2021 02:52:13 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/my-writing-and-planning-process-4flc</link>
      <guid>https://forem.com/ashleemboyer/my-writing-and-planning-process-4flc</guid>
      <description>&lt;p&gt;When I first started seriously writing in early 2019, it was because I committed to a 30-day blogging challenge. My main goal of this challenge was to see if I even liked blogging and sharing my ideas so publicly. I'm still here and telling you about my process, so hopefully it's clear that I like it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Needed Something Different
&lt;/h2&gt;

&lt;p&gt;What I discovered is that publishing a post a day wasn't sustainable for me. I think it takes a special kind of person and a special kind of content to publish daily and I applaud anyone who does that. I personally can't keep up with a schedule like that because I have chronic issues that make my spoon levels unpredictable. As I write this, I'm pretty low on spoons but I've been looking forward to this post for several weeks, so that's what's motivating me. :)&lt;/p&gt;

&lt;p&gt;Not only was I looking for a schedule so that I can get back to writing at a regular cadence, but I'm also launching a support site soon where folks can do monthly subscriptions to support my work and get some fun benefits in return. One of the membership tiers includes 2-week early access to blog posts I write for my website. That means I need to have posts written and scheduled ahead of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Came up with a New Process
&lt;/h2&gt;

&lt;p&gt;Once I figured out I needed something different, I started thinking about all the things I love doing. I love writing about accessibility. I also love sharing the little things I learn every once in a while, such as &lt;a href="https://ashleemboyer.com/set-up-a-react-app-for-testing-with-jest-and-enzyme"&gt;setting up a React App for testing with Jest and Enzyme&lt;/a&gt; or &lt;a href="https://ashleemboyer.com/how-to-dynamically-create-many-similar-css-classes-with-sass"&gt;how to dynamically create many similar CSS classes with Sass&lt;/a&gt;. I knew for sure that I wanted to write more technical content this year than I have in the past.&lt;/p&gt;

&lt;p&gt;Then I thought about live streaming on Twitch. I love it too! I have my &lt;a href="https://ashleemboyer.com/series/build-an-accessible-react-component"&gt;Build an Accessible React Component&lt;/a&gt; live series that I plan to continue and knitting on stream is a nice change of pace. I knew I wanted to be able to publish posts regularly and also be able to stream on Twitch a couple of times a week.&lt;/p&gt;

&lt;p&gt;In November 2020, &lt;a href="https://twitter.com/AshleeMBoyer/status/1331636783768096770"&gt;I wrote a tweet asking if anyone batched blog posts&lt;/a&gt;. It's more common than I thought! This thread is also where I was connected with &lt;a href="https://twitter.com/radiomorillo"&gt;Stephanie Morillo&lt;/a&gt; (pronounced moh-REE-yoh) and signed up to have a 1:1 content coaching session with her. It went very well and she gave me a lot of great ideas! She also checked in with me afterwards to see how I was doing. I highly recommend following her and reading her content! She's the same person that inspired me to &lt;a href="https://twitter.com/AshleeMBoyer/status/1345569348652568576"&gt;create a /links page and share it on social media&lt;/a&gt;. (My /links page is &lt;a href="https://ashleemboyer.com/links"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Doing Now
&lt;/h2&gt;

&lt;p&gt;I use 3 tools to stay organized: Google Calendar, Trello, and GitHub. It might sound like a lot to some, but I promise I keep the work for each to a minimum. Gotta save spoons everywhere I can! Let me tell you how I use each one. You can click on any of the screenshots to see them full-size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Calendar
&lt;/h3&gt;

&lt;p&gt;I'm a very visual person. When I plan an appointment or video call, I always have to look at my calendar. My brain works in calendar weeks. So for a high-level view of what I'm streaming on Twitch and when I stream it, I use Google Calendar. I stream twice a week. On Tuesdays, I code. On Thursdays, I knit. I make sure to distinguish between those two. For Twitch streams that are planned ahead of time, such as the ones where I build an accessible React component, I make sure that goes in the title as well. Those have not been scripted in the past, but they will be for future streams to save me some time and energy. That means I have to plan them ahead of time and to do that, I have to know exactly when they're happening. I've also been numbering the streams but I'm not sure why. I guess that part is just for fun! :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%2F2021%2F02%2Fmy-writing-and-planning-process%2FCleanShot%202021-02-11%20at%2023.50.42.png?alt=media&amp;amp;token=a564af5c-987e-4f23-a640-9690c862e3e1"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---TzCRNqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F02%252Fmy-writing-and-planning-process%252FCleanShot%25202021-02-11%2520at%252023.50.42.png%3Falt%3Dmedia%26token%3Da564af5c-987e-4f23-a640-9690c862e3e1" alt="A window with Ashlee's calendar for February." width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Trello
&lt;/h3&gt;

&lt;p&gt;I keep track of all of my writing ideas, plans, and newsletter dates with a "Writing" board in Trello. It has 6 columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ideas:&lt;/strong&gt; This is like a backlog of ideas for posts. They're not guaranteed to be written, but getting them out of my brain ensures I won't forget them and also makes room for other things I want to think about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To Do:&lt;/strong&gt; These are planned posts and newsletters. They have due dates and titles and will definitely be written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outlining:&lt;/strong&gt; This is the first step in my writing process. Some posts almost skip this step because they can be written in one sitting. Longer posts are on a feature branch for my repository and they have a draft PR in GitHub. We'll get into that more in the next section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing:&lt;/strong&gt; Posts in this column are ones I've started filling in the outline on. This column is also for posts that are being reviewed. I'm a pretty interactive reviewer/editor and still consider editing to be writing because I might re-word whole sections after a post is written out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ready &amp;amp; Scheduled:&lt;/strong&gt; This column holds cards for newsletters that have been scheduled for delivery and posts that have PRs that just need me to press "Merge".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; Things in this column have been sent or published. The whole world can see them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The columns are laid out so that a task moves through each step from left to right. And as I mentioned in the last section, I'm a very visual person. I use my one free power-up for the Calendar that lets me view all of my tasks by week or month. I use these views to ensure that I've spaced out my topics appropriately and so I can group ideas if I feel like writing a series about a broader topic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%2F2021%2F02%2Fmy-writing-and-planning-process%2FCleanShot%202021-02-08%20at%2022.23.46.png?alt=media&amp;amp;token=73366deb-df54-475c-b391-3f0bb59e4e2b"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dg2KEbAC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F02%252Fmy-writing-and-planning-process%252FCleanShot%25202021-02-08%2520at%252022.23.46.png%3Falt%3Dmedia%26token%3D73366deb-df54-475c-b391-3f0bb59e4e2b" alt='Trello board showing 5 columns: To Do, Outlining, Writing, Ready &amp;amp; Scheduled, and Live. The background of the board is a desk in a dark room with a computer screen that reads "Do what is great."' width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub (and Vercel)
&lt;/h3&gt;

&lt;p&gt;The code for this website is stored in a GitHub repository. Each post is a markdown file and it's treated just like any other file in a pull request. When I want to create a new post, I first create a branch called &lt;code&gt;post/&amp;lt;blog-post-slug&amp;gt;&lt;/code&gt;. The &lt;code&gt;post&lt;/code&gt; prefix is only there to help me keep things organized. I don't do anything special for CI/CD. Second, I create a new file for the post and put it in the appropriate directory. My directory structure for posts looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;posts/
  2019/
    01/
    02/
    ...
  2020/
    01/
    02/
    ...
  2021/
    01/
    02/
      my-writing-and-planning-process.md
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After I've outlined a post, I commit and push the changes and open a draft PR on GitHub. This enables me to see all the in progress posts I have at once and also allows me to work on many posts at once. When I was writing my &lt;a href="https://ashleemboyer.com/series/nextjs-firebase-blog"&gt;Build a Blog Site with Next.js and Firebase series&lt;/a&gt;, all 5 parts of the series where in their own pull requests at the same time.&lt;/p&gt;

&lt;p&gt;I use Next.js for this site and deploy it to &lt;a href="https://vercel.com"&gt;Vercel&lt;/a&gt;. Vercel automatically builds previews for every PR and I use them when reviewing posts to make sure all links work correctly and that the post looks nice on my site. When I'm ready to publish a post, all I have to do is hit the "Merge" button on the PR and Vercel automatically builds the updated version of my site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%2F2021%2F02%2Fmy-writing-and-planning-process%2FCleanShot%202021-01-03%20at%2019.13.14.png?alt=media&amp;amp;token=325f2884-65c0-4128-afbc-8c3eba7385cd"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PD1kHhQ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/ashleemboyer-2018.appspot.com/o/images%252F2021%252F02%252Fmy-writing-and-planning-process%252FCleanShot%25202021-01-03%2520at%252019.13.14.png%3Falt%3Dmedia%26token%3D325f2884-65c0-4128-afbc-8c3eba7385cd" alt="A list of pull requests in Ashlee's website GitHub repository. It's showing one pull request for each part in her Build a Blog Site with Next.js and Firebase series." width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;I love my new process. The tools I use can easily have redudant overlaps in their uses, but I feel confident that the setup I have keeps everything organized for very intentional usage. I schedule my streams in Google Calendar. I schedule my posts and newsletters in Trello. I manage reviewing, testing, and publishing in GitHub. I can write as many or as few posts as I want at the same time.&lt;/p&gt;

&lt;p&gt;If this post sparked any ideas for you or if you already do something that's just slightly different, I'd love to hear about it. &lt;a href="https://twitter.com/ashleemboyer"&gt;Send me a tweet&lt;/a&gt; or &lt;a href="//mailto:hello@ashleemboyer.com"&gt;send me an email&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;Did you know I have a newsletter? 📬&lt;/p&gt;

&lt;p&gt;If you want to get notified when I publish new blog posts or make major project announcements, head over to &lt;a href="https://ashleemboyer.com/newsletter"&gt;https://ashleemboyer.com/newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>planning</category>
      <category>organization</category>
    </item>
    <item>
      <title>Set up a React App for Testing with Jest and Enzyme</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Tue, 01 Dec 2020 13:40:05 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/set-up-a-react-app-for-testing-with-jest-and-enzyme-4ae2</link>
      <guid>https://forem.com/ashleemboyer/set-up-a-react-app-for-testing-with-jest-and-enzyme-4ae2</guid>
      <description>&lt;p&gt;It's been awhile since I've set up a React app for testing with Jest and Enzyme. Since I had to look up more than one of these steps to remind myself how to accomplish this, I decided to write a super quick guide in case it helps anyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dec. 8th Correction
&lt;/h2&gt;

&lt;p&gt;Enzyme is not yet compatible with React 17. You should make sure the highest version of React you are using is &lt;code&gt;16.14.0&lt;/code&gt; if you want to use Enzyme with your tests. &lt;a href="https://github.com/enzymejs/enzyme/pull/2430"&gt;This PR&lt;/a&gt; will add an adapter for React 17. &lt;em&gt;Please do not ask them when it will be done, it will be done when they get it done!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create the app with &lt;code&gt;create-react-app&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This requires having &lt;code&gt;npx&lt;/code&gt; installed. You can read about it &lt;a href="https://www.npmjs.com/package/npx"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app &amp;lt;app-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: If you use Sass modules, like me, install &lt;code&gt;node-sass&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;At the time of this writing, &lt;code&gt;node-sass@5.0.0&lt;/code&gt; in incompatible and &lt;code&gt;node-sass@4.14.1&lt;/code&gt; must be installed instead. There's a Stack Overflow answer about it &lt;a href="https://stackoverflow.com/questions/64625050/error-node-sass-version-5-0-0-is-incompatible-with-4-0-0/64626556#64626556"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add node-sass@4.14.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3. Install the dev dependencies for Enzyme
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;--dev&lt;/code&gt; option is what saves these under &lt;code&gt;devDependencies&lt;/code&gt; in your &lt;code&gt;package.json&lt;/code&gt; file. Why do they need to be under &lt;code&gt;devDependencies&lt;/code&gt;? Because these kinds of dependences are "Packages that are only needed for local development and testing." You can read a little more on that &lt;a href="https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; enzyme enzyme-adapter-react-16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4. Configure Enzyme with an adapter in &lt;code&gt;setupTests.js&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Enzyme needs to know what adapter you want to use. We tell it in the &lt;code&gt;setupTests.js&lt;/code&gt; file in the &lt;code&gt;src&lt;/code&gt; directory of your project. You can get more details about setting up Enzyme &lt;a href="https://enzymejs.github.io/enzyme/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;setupTests.js&lt;/code&gt; should only have some comments and one &lt;code&gt;import&lt;/code&gt; statement right now. Just add these lines right after that &lt;code&gt;import&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Enzyme&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;enzyme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Adapter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;enzyme-adapter-react-16&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Enzyme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Adapter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5. Get to testing! 💪
&lt;/h2&gt;

&lt;p&gt;Everything you need is installed and now you just need to write up some tests. Here are some Jest and Enzyme docs to help you get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/docs/en/getting-started"&gt;Jest "Getting Started" Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/docs/en/tutorial-react"&gt;Jest "Testing React Apps" Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://enzymejs.github.io/enzyme/docs/guides/jest.html"&gt;Enzyme's "Using enzyme with Jest" Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://enzymejs.github.io/enzyme/docs/api/"&gt;Enzyme API Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Did you know I have a newsletter? 📬&lt;/p&gt;

&lt;p&gt;If you want to get notified when I publish new blog posts or make major project announcements, head over to &lt;a href="https://ashleemboyer.com/newsletter"&gt;https://ashleemboyer.com/newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Accessible, Smooth Scroll-to-top Buttons with Little Code</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Thu, 26 Nov 2020 23:52:29 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/accessible-smooth-scroll-to-top-buttons-with-little-code-3b9d</link>
      <guid>https://forem.com/ashleemboyer/accessible-smooth-scroll-to-top-buttons-with-little-code-3b9d</guid>
      <description>&lt;p&gt;Some of the original content in this post has been archived. This post previously showed how to create this component with a button element. I've since learned a better approach is to create this component with an anchor element and have it link to a Skip Navigation Link. &lt;a href="https://ashleemboyer.com/blog/archive/accessible-smooth-scroll-to-top-buttons-with-little-code--archived"&gt;You can read the archived post if you want to&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Scroll-to-top buttons are great for pages that are long enough to require a few scrolls to read everything. They're even better for extremely long pages. Scrolling is a lot of work for some users, especially on a mobile device. We (website creators) can greatly reduce the amount of work it takes to scroll our pages with surprisingly little effort on our part.&lt;/p&gt;

&lt;p&gt;One example is the &lt;a href="https://www.w3.org/TR/wai-aria-practices-1.1"&gt;WAI-ARIA Authoring Practices&lt;/a&gt;, which is 140,923 pixels tall at the time of this writing. I'm not calling them out, it's just one of my favorite pages on the entire internet! &lt;a href="https://ashleemboyer.com/blog/my-favorite-resource-for-making-accessible-custom-components"&gt;It's a great resource for making accessible custom components&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Making a scroll-to-top button and making it scroll smoothly is probably a lot easier than you think. It's definitely a lot easier than &lt;em&gt;I&lt;/em&gt; thought! The code bits I'm about to show are for React and SCSS, but you don't need to know either. The basic concepts here are for JavaScript and CSS. We'll also cover how to get rid of the smooth scrolling when it's an accessibility concern.The best part of this approach? It requires no focus management! &lt;span&gt;🎉&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;If you don't already have one, you need to add a Skip Navigation Link to your site. It's a quick, easy win as well, and the instructions below reference the one I use on my site. Not sure how to do it? Then read my post on &lt;a href="https://ashleemboyer.com/blog/how-i-added-a-skip-navigation-link-to-my-next-js-site"&gt;How I Added a Skip Navigation Link to My Next.js Site&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  The React Code
&lt;/h2&gt;

&lt;p&gt;As you may have read in &lt;a href="https://ashleemboyer.com/blog/how-i-added-a-skip-navigation-link-to-my-next-js-site#what-does-the-code-look-like"&gt;my post about Skip Navigation Links&lt;/a&gt;, I use &lt;a href="https://nextjs.org/docs/basic-features/layouts#per-page-layouts"&gt;Next.js Per-Page Layouts&lt;/a&gt; to help me render repeated content, such as navigation links, on many pages. The layout I use for the navigation header is where I placed a Skip Navigation Link and Scroll-to-Top link. The code looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./base-layout.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BaseLayout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#main-content"&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"skip-navigation-link"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Skip Navigation
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SiteHeader&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"main-content"&lt;/span&gt; &lt;span class="na"&gt;tabIndex&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#skip-navigation-link"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Back to Top&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SiteFooter&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's important from this code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Scroll-to-Top link goes to the first focusable control on the page, which should be a Skip Navigation Link.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;href&lt;/code&gt; of the Scroll-top-Top link matches the &lt;code&gt;id&lt;/code&gt; of the Skip Navigation Link.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The SCSS Code
&lt;/h2&gt;

&lt;p&gt;The code below takes an accessibility- and browser-support- first approach. Rather than making the default behavior for scrolling be smooth, an animation which can be physically harmful to some folks (including myself), it only applies smooth scrolling when two conditions are true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;prefers-reduced-motion&lt;/code&gt; query is supported (&lt;a href="https://caniuse.com/mdn-css_at-rules_media_prefers-reduced-motion"&gt;see the CanIUse.com page&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The value of the setting is &lt;code&gt;no-preference&lt;/code&gt; (which unfortunately is the default value)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no-preference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;scroll-behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;smooth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One thing to keep in mind is that &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior#browser_compatibility"&gt;&lt;code&gt;scroll-behavior&lt;/code&gt; does not have full browser support&lt;/a&gt;. At the time of writing, the feature is still in development for Safari.&lt;/p&gt;

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

&lt;p&gt;That's it! It really is just a few lines of code. After you add this, everyone will be able to quickly scroll to the top of your website. You've also made it so your site doesn't accidentally harm someone who can't tolerate animations! Well done. I am proud of you!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>First Look at the No-Code Overlays Web App</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Sat, 03 Oct 2020 00:26:55 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/first-look-at-the-no-code-overlays-web-app-e3a</link>
      <guid>https://forem.com/ashleemboyer/first-look-at-the-no-code-overlays-web-app-e3a</guid>
      <description>&lt;p&gt;Guess what I did today? I planned the features for the MVP, set up a &lt;a href="https://nextjs.org/docs/getting-started" rel="noopener noreferrer"&gt;Next.js app&lt;/a&gt; and its &lt;a href="https://github.com/NoCodeOverlays/app.nocodeoverlays.com" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, and I merged the first PR for the &lt;a href="https://app.nocodeoverlays.com" rel="noopener noreferrer"&gt;No-Code Overlays Web App&lt;/a&gt;! If you'd like to read all of the details in the PR, you can do so &lt;a href="https://github.com/NoCodeOverlays/app.nocodeoverlays.com/pull/1" rel="noopener noreferrer"&gt;here&lt;/a&gt;, but I'll give you a quick run down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEjXEFlkWoAAvGX2%3Fformat%3Djpg%26name%3Dmedium" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEjXEFlkWoAAvGX2%3Fformat%3Djpg%26name%3Dmedium" alt="The first merged PR as shown in GitHub."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, when you arrive at the app, you need to log in with an email and password. Having a login keeps everyone's information separate and private. I don't want anyone to be able to edit my streaming overlay, and no one wants me to edit theirs either! Here's a preview of that page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEjXEy0NWoAEa_BS%3Fformat%3Djpg%26name%3Dmedium" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEjXEy0NWoAEa_BS%3Fformat%3Djpg%26name%3Dmedium" alt="The No-Code Overlays login page. It shows email and password inputs in a white card on a dark purple background."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To put all of this together, I added a couple of pages to the app, installed the &lt;a href="https://www.npmjs.com/package/firebase" rel="noopener noreferrer"&gt;Firebase npm package&lt;/a&gt;, set up a new Firebase project, added a test user for logging in, and set up some functions for interacting with Firebase auth in &lt;a href="https://github.com/NoCodeOverlays/app.nocodeoverlays.com/blob/master/lib/api.js" rel="noopener noreferrer"&gt;this API file&lt;/a&gt;. This part was a little tedious, but pretty straightforward!&lt;/p&gt;

&lt;p&gt;The last step was to handle redirects to the login page when a page that requires a logged in user is trying to be reached. &lt;a href="https://nextjs.org/docs/api-reference/next/router#routerpush" rel="noopener noreferrer"&gt;Next's router&lt;/a&gt; makes it very easy to redirect, so the hardest part was checking with Firebase for a logged in user. In the API file I mentioned, I wrote a function for getting the current user. If there's no current user, then there's a redirect to the login page.&lt;/p&gt;

&lt;p&gt;I'm thinking about writing a blog post on this for my personal site, but no promises. This project has me pretty busy at the moment! Stay tuned for the next update! :)&lt;/p&gt;

</description>
      <category>nocodeoverlays</category>
      <category>justfingshipit</category>
      <category>womenmakechallenge</category>
    </item>
    <item>
      <title>Challenge Accepted! Just F*ing Ship It.</title>
      <dc:creator>Ashlee (she/her)</dc:creator>
      <pubDate>Fri, 02 Oct 2020 00:52:12 +0000</pubDate>
      <link>https://forem.com/ashleemboyer/challenge-accepted-just-f-ing-ship-it-1jp3</link>
      <guid>https://forem.com/ashleemboyer/challenge-accepted-just-f-ing-ship-it-1jp3</guid>
      <description>&lt;p&gt;Great news! I'm joining the 30-day Just F*ing Ship It challenge to launch &lt;a href="https://nocodeoverlays.com" rel="noopener noreferrer"&gt;No-Code Overlays&lt;/a&gt; on October 31st, 2020. If you want to read all the background information on the project, how I came up with my idea, and what the next few days will be like, make sure to check out the &lt;a href="https://nocodeoverlays.com/blog" rel="noopener noreferrer"&gt;No-Code Overlays blog&lt;/a&gt;! I'll keep posting updates there as well, so keep your eye out every few days or so.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FNoCodeOverlays%2Fnocodeoverlays.com%2Fraw%2Fmaster%2Fpublic%2Fpreview.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FNoCodeOverlays%2Fnocodeoverlays.com%2Fraw%2Fmaster%2Fpublic%2Fpreview.png" alt="A white page with black text. At the top is the site title "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nocodeoverlays</category>
      <category>justfingshipit</category>
      <category>womenmakechallenge</category>
    </item>
  </channel>
</rss>
