<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rachael Wright-Munn</title>
    <description>The latest articles on DEV Community by Rachael Wright-Munn (@chaelcodes).</description>
    <link>https://dev.to/chaelcodes</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%2F365345%2Ff13fae63-e9c0-472b-974c-b0eed270bfa2.jpg</url>
      <title>DEV Community: Rachael Wright-Munn</title>
      <link>https://dev.to/chaelcodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chaelcodes"/>
    <language>en</language>
    <item>
      <title>Relicans Summer Camp Week 2: Open Source Week</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Tue, 13 Jul 2021 21:25:18 +0000</pubDate>
      <link>https://dev.to/newrelic/relicans-summer-camp-week-2-open-source-week-1717</link>
      <guid>https://dev.to/newrelic/relicans-summer-camp-week-2-open-source-week-1717</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🏕 &lt;strong&gt;Challenge: Submit an open source PR to a repo that you do not own and have it reviewed or commented on by the maintainer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Why open source?
&lt;/h1&gt;

&lt;p&gt;Open source is a fantastic way to connect with other developers, work on interesting projects, build your portfolio or your library of examples, and learn new skills! In our work lives, we're often told what to build and which tech stack to use. With open source contributions, you can explore an exciting new tech stack and build what you want to see in the world!&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I find an issue?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Issues are tickets in GitHub that describe a bug, or feature. Open ones haven't been fixed. They're used to track work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can find issues by searching GitHub for issues labeled "Good First Issue" or check out sites like &lt;a href="https://goodfirstissue.dev/" rel="noopener noreferrer"&gt;Good First Issue&lt;/a&gt; and &lt;a href="https://www.codetriage.com/" rel="noopener noreferrer"&gt;Code Triage&lt;/a&gt;. If you are looking at a project on GitHub, you can check to see if it has any good first issues by going to the &lt;em&gt;/contribute&lt;/em&gt; URL for the project. For example, if you were looking at the New Relic Ruby Agent repository (&lt;a href="https://github.com/newrelic/newrelic-ruby-agent" rel="noopener noreferrer"&gt;https://github.com/newrelic/newrelic-ruby-agent&lt;/a&gt;), you could then go to its &lt;em&gt;contribute&lt;/em&gt; page here: &lt;a href="https://github.com/newrelic/newrelic-ruby-agent/contribute" rel="noopener noreferrer"&gt;https://github.com/newrelic/newrelic-ruby-agent/contribute&lt;/a&gt; and it will tell you if there are any good first issues waiting to be tackled.&lt;/p&gt;

&lt;p&gt;You want to look for issues that are well-scoped, small, and include reproduction steps. Anything with screenshots is going to be a lot easier to solve. You'll be in an unfamiliar codebase, so there's no reason to make your first PR an ambitious one! Extensions to existing features and bugs are great choices and a huge help!&lt;/p&gt;

&lt;p&gt;Did you know that &lt;a href="http://therelicans.com" rel="noopener noreferrer"&gt;theRelicans.com&lt;/a&gt; and &lt;a href="http://dev.to"&gt;dev.to&lt;/a&gt; are run on an open source platform called &lt;a href="https://github.com/forem/forem/contribute" rel="noopener noreferrer"&gt;Forem&lt;/a&gt;? If you can't find a project you like, you could always start there!&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I claim an issue to work on?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1. Read their contributing guide.
&lt;/h3&gt;

&lt;p&gt;Most open source repositories store their contributing guide in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; or &lt;code&gt;README.md&lt;/code&gt;. This is where you'll find information about coding standards, how to set up the codebase, and their issue/review process. Sometimes this guide will link to documentation on the tool, like in &lt;a href="https://github.com/forem/forem/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Forem's case&lt;/a&gt;, or they could require you to sign a waiver.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2. Comment on the issue.
&lt;/h3&gt;

&lt;p&gt;Let the maintainer and other contributors know that you're working on the issue and how you plan to solve it. If you have any questions about the issue or how they'd like it solved, this is a great time to ask.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A maintainer is responsible for merging items into the codebase and releasing new versions. A contributor creates some value for the codebase, through code, documentation, or issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How do I set up the codebase locally?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1. Fork the Repository.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A forked repository is a personal copy of a codebase. It only updates when you update it, and you can make as many changes as you want without impacting the upstream repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the upper right of the repo page on GitHub, there is a Fork button.&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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2F46hb08aqur5hw2i0odra.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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2F46hb08aqur5hw2i0odra.png" alt="picture of the fork ui"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click that, and it will walk you through forking your own copy of the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2. Clone the repository locally.
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;git clone &amp;lt;the git url&amp;gt;&lt;/code&gt; on your machine to clone the repository locally. This url should be for your forked version of the repository.&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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Fu8d6z0y3qlaatr5xuxzz.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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Fu8d6z0y3qlaatr5xuxzz.png" alt="Clone URL in the GitHub UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3. Set up any dependencies.
&lt;/h3&gt;

&lt;p&gt;Most projects have documentation, often right in their &lt;code&gt;README.md&lt;/code&gt;, that provides instructions on how to set up that particular project. It is often in the &lt;em&gt;Development&lt;/em&gt; or &lt;em&gt;Contributing&lt;/em&gt; section at the bottom of the &lt;code&gt;README.md&lt;/code&gt;, or in the separate &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; file. It's a good idea to check if they have a docker or vagrant setup. If they do, you can quickly setup the repo without installing the dependencies on your computer, and you can discard the dev environment when you're done working with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I solve the problem?
&lt;/h2&gt;

&lt;p&gt;Open source is a little different from other work projects, because you're being introduced to the codebase for the first time, and the issues are created by volunteers. The issues sometimes aren't verified, and far less detailed than what a good PM writes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1. Start the app and run the tests.
&lt;/h3&gt;

&lt;p&gt;The contributing guide from earlier should've told you how to run the application, and run the tests. This is your first hurdle! Once you can start the app and run the tests, you can say your dev environment is successfully set up. Some frameworks, like Rails, don't have an app to start up. That's okay! Just make sure you can run all the test cases, and can confidently verify your changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2. Reproduce the issue
&lt;/h3&gt;

&lt;p&gt;Don't make a single change until you've reproduced the issue or original functionality described in the issue! Open source issues are often fixed in other PRs, fall out of date, or are insufficiently described. If you're unable to reproduce the issue, it's time to leave a comment on the issue, and pick up a new one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3. Make your changes.
&lt;/h3&gt;

&lt;p&gt;This is the part you're good at! Write some tests, make some changes, and follow any style guidelines. And yes, definitely write the tests. Most projects won't accept a PR that doesn't have appropriate tests. They will remind you if you forget to include them, but it's better if you make test writing a regular part of how you work on and deliver PRs. Good tests are always appreciated!&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the PR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A PR is shorthand for a Pull Request. Maintainers can "pull" code contained in a Pull Request into their repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1. Push your changes to your Forked Repository.
&lt;/h3&gt;

&lt;p&gt;Create a new branch (if you haven't already) using &lt;code&gt;git branch -b &amp;lt;name of branch&amp;gt;&lt;/code&gt; then push that to your forked repository using &lt;code&gt;git push&lt;/code&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you &lt;code&gt;git push&lt;/code&gt; and see the following error. You are probably trying to push to the parent instead of your forked repo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR: Permission to &amp;lt;parent repo&amp;gt; denied to &amp;lt;user&amp;gt;.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2. Create a PR.
&lt;/h3&gt;

&lt;p&gt;After pushing your code to your fork on GitHub, if you look at the branch page in GitHub, you will see a &lt;em&gt;Contribute&lt;/em&gt; link. This will walk you through creating a pull request. There'll also be a link in the git cli the first time you push to that branch.&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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Ftvvyjsudr78u2adwxtki.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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Ftvvyjsudr78u2adwxtki.png" alt="Create a PR ui"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your pull request should describe the issue you are solving, and the changes that you made. Screenshots of any changes are greatly appreciated. You should also link the issue in your PR, (&lt;code&gt;closes #1234&lt;/code&gt;). This will automatically close the issue when your PR merges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3. Point your PR to their main branch on their repo.
&lt;/h3&gt;

&lt;p&gt;This is a matter of selecting the right branches from the dropdown boxes in the form that you are presented with. It should look similar to this:&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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Fb91lkmi7z00njjcl8bbj.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%2Fwww.therelicans.com%2Fremoteimages%2Fuploads%2Farticles%2Fb91lkmi7z00njjcl8bbj.png" alt="UI for changing the base branch - it happens in the PR header"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most repos use this method, but if the contributing guide says otherwise, follow the contributing guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I get my PR merged?
&lt;/h2&gt;

&lt;p&gt;Maintainers of large repos are busy folks, and sometimes a PR can go ignored for days, or weeks. Sometimes you get a review in hours. Every repo varies, and it's a good idea to practice patience, and respond quickly to change requests. The contributing guide should tell you what's okay, and if they include a code of conduct, follow it at all times. You're asking someone to include your work in their group project. If it's your first time in a repo, they will probably want changes. But once it merges, be proud! You've helped contribute to making open source a better place, and hopefully learned something during the process!&lt;/p&gt;

&lt;h1&gt;
  
  
  Next Steps
&lt;/h1&gt;

&lt;p&gt;Wow! Hopefully, you learned a lot about contributing to open source from this blog post. If you have any questions, feel free to ask them in the comments, or we'll be hosting a &lt;a href="//www.twitch.tv/new_relic"&gt;live workshop&lt;/a&gt; 7/13 at 17:00 UTC! When you make your first open source contribution, link the PR in the comments here and post under &lt;a href="https://www.therelicans.com/t/relicanssummercamp" rel="noopener noreferrer"&gt;#RelicansSummerCamp&lt;/a&gt; to get your camp badge! We're really excited to see what you do!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>reicanssummercamp</category>
    </item>
    <item>
      <title>The Invisible Zoom Streaming method</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Mon, 21 Jun 2021 17:28:20 +0000</pubDate>
      <link>https://dev.to/chaelcodes/the-invisible-zoom-streaming-method-37ii</link>
      <guid>https://dev.to/chaelcodes/the-invisible-zoom-streaming-method-37ii</guid>
      <description>&lt;p&gt;Your stream guests know and love zoom, but it doesn’t look very professional to just share a zoom window on your stream. This technique will allow for easily adding guests and sharing screens, without cropping zoom windows.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hide Zoom
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Join the zoom call with your camera
&lt;/h2&gt;

&lt;p&gt;The first step is joining a zoom call. You must use the desktop application to follow the rest of these steps. Your video feed will run through zoom. This is much easier, and your guests will see you.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add zoom to OBS
&lt;/h2&gt;

&lt;p&gt;Create a window capture in OBS, and select your zoom window. Exclude the cursor, and only capture the client area to remove any application window styling.&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F1-create-a-window-capture.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F1-create-a-window-capture.PNG" alt="screenshot of OBS window settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Unmirror your video
&lt;/h2&gt;

&lt;p&gt;Inside zoom, your video will display mirrored by default. This only inverts your image on your zoom instance. Now that we’re sharing that instance with the world, you want to unmirror it so text displays normally. Under video settings, ensure “Mirror my Image” is unchecked.&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F2-turn-off-mirrored-screen.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F2-turn-off-mirrored-screen.png" alt="Screenshot of zoom settings"&gt;&lt;/a&gt;Optional: Slide “Touch up my appearance” all the way into “turn my bags into smokey eyes” territory. No foundation? No problem!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Share your &lt;em&gt;visible&lt;/em&gt; guests
&lt;/h2&gt;

&lt;p&gt;You can hide everyone who has chosen not to share their video by checking hide non-video participants. This makes it easy to cue up guest changes, and also have a hidden producer running the show. If you have multiple guests, having a producer who can pass messages like “5 minutes left” or communicate with the next guest via zoom chat is really helpful.&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F3-hide-non-video-participants.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F3-hide-non-video-participants.png" alt="screenshot of zoom UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While you’re here, optionally uncheck “Always display participant names on their video.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Hide the rest of the zoom UI
&lt;/h2&gt;

&lt;p&gt;Uncheck “Always show meeting controls” to have the option of hiding zoom’s buttons.&lt;/p&gt;

&lt;p&gt;Alt will cycle through displaying the zoom UI, showing participant names, and hiding everything. If you want to crop zoom’s UI out, that also works. Note that hovering over the zoom UI area will bring it back, so keep your cursor above the bottom third.&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F4-no-participant-names-or-ui.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F4-no-participant-names-or-ui.PNG" alt="zoom in OBS with no participant names or UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your Zoom window in OBS should look like this.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Hide Zoom in OBS
&lt;/h2&gt;

&lt;p&gt;Chromakey works by removing everything of one color. Normally, that color is green, but we can make it Zoom Grey. Chromakey also adds a little variability to catch green shadows, but we can strip all that range out, because zoom doesn’t have lighting or shadows. Add a filter to the Zoom window source in OBS. Use a color key with a custom color of 1a1a1a, and set the similarity and smoothness all the way down to 1. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F5-apply-chroma-key.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F5-apply-chroma-key.PNG" alt="screen shot of color key window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Place an image beneath the zoom window in OBS, and now you’ve got a pretty great looking setup!&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F6-invisible-zoom-demo.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F6-invisible-zoom-demo.PNG" alt="final form of invisible zoom technique"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Screenshare in Zoom
&lt;/h1&gt;

&lt;p&gt;All of this is good, but we need screensharing for the real magic of zoom to activate. Don’t worry, we won’t have separate windows and captures. Seamless transitions from a conversation to presentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep screenshare in one window
&lt;/h2&gt;

&lt;p&gt;By default, when someone shares their screen, Zoom goes full-screen, and moves audience video into a second window, but you can set zoom to share a screen within the current view.&lt;/p&gt;

&lt;p&gt;Turn on side-by-side view. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F7-turn-on-side-by-side.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F7-turn-on-side-by-side.PNG" alt="side by side in zoom"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your presentation will be on the left and your guests can be added and drop on the right!&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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F8-side-by-side-demo.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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Finvisible_zoom%2F8-side-by-side-demo.PNG" alt="zoom looking good with slides and screenshare"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now there’s a great looking zoom presentation on an image background. You can sub in speakers without issue, and people can swap between presentations!&lt;/p&gt;

&lt;h2&gt;
  
  
  Flaws
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;You cannot screenshare while producing.&lt;/em&gt; It will change your whole view. A secondary computer or your guest can screenshare.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Zoom does not resize windows automatically.&lt;/em&gt; You will need to adjust the zoom level if the user’s screen is very large or very small.&lt;/p&gt;

&lt;h1&gt;
  
  
  Don’t forget audio!
&lt;/h1&gt;

&lt;p&gt;Audio is a whole different challenge. When you capture audio from zoom, you will get everyone else’s audio, but not your own. Zoom doesn’t play your own audio back to you. There are two ways to handle this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have a producer who’s responsible for communicating with guests, and streaming the zoom, but doesn’t appear on-screen. This has the added benefit of giving you a moderator who’s focused on chat and production.&lt;/li&gt;
&lt;li&gt;Stitch your audio together using loopback, voicemeeter, or two audio inputs in OBS. If you use two audio inputs in OBS, then you will have issues &lt;a href="https://dev.to/chaelcodes/how-to-caption-your-twitch-streams-5e63"&gt;captioning&lt;/a&gt;, because all captioning plugins that I know of use one audio input as the source.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;This isn’t the greatest and most technically proficient guest setup that has ever existed, but it is a robust, easy solution that uses technology your guests are confident in. It’s a great option for panels or small-scale live conferences and meetups. Let me know if you try this out, or come up with ways to deal with those flaws above!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>speaking</category>
    </item>
    <item>
      <title>Sadistic Self-Care Survival Game</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Thu, 03 Jun 2021 15:59:59 +0000</pubDate>
      <link>https://dev.to/chaelcodes/sadistic-self-care-survival-game-2404</link>
      <guid>https://dev.to/chaelcodes/sadistic-self-care-survival-game-2404</guid>
      <description>&lt;p&gt;Your body has been kind to you. It has tolerated your dehydration, exhaustion, hunger, and lack of exercise without complaint for YEARS. That ends today. This game built using the DragonRuby framework will remind you how generous your body has been with its mistreatment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This blog post was a companion guide to a &lt;a href="https://twitch.tv/ChaelCodes"&gt;Twitch stream&lt;/a&gt; on 4/16 at 1500 UTC. The game is now free to play at &lt;a href="https://chaelcodes.itch.io/sscs-game"&gt;Itch.io&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IKH_bfry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.chael.codes/assets/img/posts/DragonRuby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IKH_bfry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.chael.codes/assets/img/posts/DragonRuby.png" alt="DragonRuby logo" width="630" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start with the tools. &lt;a href="https://dragonruby.itch.io/"&gt;DragonRuby&lt;/a&gt; is a game framework built on the Ruby specification. We’ll be joined by one of the creators of that framework, Amir Rajan! It focuses on 2D game design, and the entire game state is stored in an object called args. It supports PC, Mac, Linux, Raspberry Pi, Web (wasm)iOS, Android, Nintendo Switch, XBOX One, and PS4. Let’s target this one at a web release!&lt;/p&gt;

&lt;p&gt;NOW IT’S TIME FOR THE GAME! I want to give the player a feeling of desperation as they use self-care techniques to keep their body alive and functioning. I plan to utilize status bars that slowly clutter the screen to help create that desperate feeling. For the first stream I want to focus on building one full core gameplay loop, then adding the rest.&lt;/p&gt;

&lt;p&gt;In order to create the simplest version possible, I’d like to focus on the task screen and status bars. The game will start on a laptop screen with a 🍽 food status bar, 🥤 water status bar, and progress bar running on the screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zoy8E5LC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.chael.codes/assets/img/posts/mockup.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zoy8E5LC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.chael.codes/assets/img/posts/mockup.jpg" alt="Prototype" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The progress bar starts at 0%, and every tick, it increments by the product of all active status bars. If you have a full water and food bar, it increments by 1, but if your food and water are half-full, then it increments by .25. When the progress bar reaches 100, the player receives 💵$50. The time to completion is always displayed above the task.&lt;/p&gt;

&lt;p&gt;If any status bar reaches 0, and there are no warnings for this, the character dies, and it’s Game Over for the player. The status bars can be refilled by drinking water from a water bottle or eating a granola bar from the desk.&lt;/p&gt;

&lt;p&gt;Drinking water and eating food to keep your status bars up so tasks complete faster is a good start, but it’s meaningless if you run out of food or can’t spend the mokney, so let’s implement a store!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pomodoro Timer&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;Saves task process every 25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Granola Bar&lt;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;td&gt;Increases food by 10 points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandwich&lt;/td&gt;
&lt;td&gt;$8&lt;/td&gt;
&lt;td&gt;Increases food by 40 points, takes 5s to make&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We also need to implement some breaks to refill your water bottle, make sandwiches, and do something about all that water you’ve been drinking. I’m not sure if we’ll get to that part though. I’d like to implement additional status bars like 🍺 pee, 💩 waste, 💢 stress, 💫soreness, and 💤tiredness. I think completing tasks should increase stress and soreness, and tiredness should gradually rise! Maybe we can take a break to reduce stress and tiredness, and do some stretches to reduce soreness. I feel a whole system building out of this, but let’s start with hunger and thirst!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ruby</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Deploying Jekyll with GitHub Actions, not Pages</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Sun, 23 May 2021 22:37:23 +0000</pubDate>
      <link>https://dev.to/newrelic/deploying-jekyll-with-github-actions-not-pages-40pi</link>
      <guid>https://dev.to/newrelic/deploying-jekyll-with-github-actions-not-pages-40pi</guid>
      <description>&lt;p&gt;I built a &lt;a href="https://rubygems.org/gems/jekyll-twitch"&gt;Gem&lt;/a&gt; that embeds Twitch clips in Jekyll Sites! Unfortunately, I can’t use it, because I’m deploying using github-pages. So let’s change the deploy process. 😏&lt;/p&gt;

&lt;h1&gt;
  
  
  Why do we have to do this?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://pages.github.com/"&gt;GitHub pages&lt;/a&gt; is where &lt;a href="https://www.chael.codes"&gt;my site&lt;/a&gt; is hosted. They require you to add the gh-pages gem instead of the jekyll gem, and they lock the version of Jekyll at 3.9.0. They would have to rework how gh-pages interacts with GitHub servers to support Jekyll 4.0, and that would break all the 3.9 sites out there. &lt;em&gt;&lt;a href="https://github.com/github/pages-gem/issues/651"&gt;They’ve decided not to upgrade instead.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They also don’t let you add &lt;a href="https://docs.github.com/en/github/working-with-github-pages/about-github-pages-and-jekyll#plugins"&gt;random plugins&lt;/a&gt;. Only their allow list, and &lt;a href="https://github.com/ChaelCodes/jekyll-twitch/"&gt;my baby Jekyll-Twitch&lt;/a&gt; isn’t on it.&lt;/p&gt;

&lt;h1&gt;
  
  
  So, what’s the plan?
&lt;/h1&gt;

&lt;p&gt;Jekyll has shared a guide on &lt;a href="https://jekyllrb.com/docs/continuous-integration/github-actions/"&gt;deploying using GitHub Actions&lt;/a&gt;. We’ll need a &lt;code&gt;github_pages.yml&lt;/code&gt; file in &lt;code&gt;.github/workflows&lt;/code&gt;. This is going to trigger every time we push to main. It’ll call out to a &lt;a href="https://github.com/helaili/jekyll-action"&gt;jekyll-action&lt;/a&gt; created by helaili which deploys the static site on the gh-pages branch. The jekyll-action deprecates &lt;a href="https://github.com/helaili/jekyll-action#deprecation"&gt;JEKYLL_PAT&lt;/a&gt;, so we should update &lt;a href="https://github.com/jekyll/jekyll/blob/master/docs/_docs/continuous-integration/github-actions.md"&gt;their docs&lt;/a&gt; while we do this.&lt;/p&gt;

&lt;p&gt;There’s some additional GitHub configuration necessary. First, the jekyll action needs a github token to push to the gh-pages branch, then GitHub needs to use the gh-pages branch instead of the main branch.&lt;/p&gt;

&lt;p&gt;We’ll need to include a &lt;a href="https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository"&gt;secret&lt;/a&gt; in our &lt;a href="https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsenv"&gt;action&lt;/a&gt; to store the github token.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ChaelCodes/chaelcodes.github.io/pull/11"&gt;This was easier than I thought.&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lending some color to Tokei Code Analyzer</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Sat, 15 May 2021 21:52:32 +0000</pubDate>
      <link>https://dev.to/newrelic/lending-some-color-to-tokei-code-analyzer-pib</link>
      <guid>https://dev.to/newrelic/lending-some-color-to-tokei-code-analyzer-pib</guid>
      <description>&lt;p&gt;Time for another open-source adventure! We’ll be joined by &lt;a href="https://twitter.com/maxjacobson" rel="noopener noreferrer"&gt;Max Jacobson&lt;/a&gt; as we visit the Rust cli-tool &lt;a href="https://github.com/XAMPPRocky/tokei" rel="noopener noreferrer"&gt;Tokei&lt;/a&gt;. Tokei generates statistics around your code and language usage. For example, &lt;a href="https://www.chael.codes/2021/04/07/tokei-open-source.html" rel="noopener noreferrer"&gt;chael.codes&lt;/a&gt; looks like: &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2FTokei-no-color.JPG" 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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2FTokei-no-color.JPG" alt="tokei code analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Forem, the repo behind therelicans.com and dev.to, looks like this: &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Ftokei-forem-no-color.JPG" 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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Ftokei-forem-no-color.JPG" alt="tokei code analysis of Forem"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re going to pick up &lt;a href="https://github.com/XAMPPRocky/tokei/issues/419" rel="noopener noreferrer"&gt;an issue&lt;/a&gt; with a lot of discussion that hasn’t been touched in 10 months that I personally like. Those screenshots before weren’t very engaging, right? Let’s add some lovely color to Tokei’s terminal output!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are some requirements listed out in the issue above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It must look good in light and dark mode terminals&lt;/li&gt;
&lt;li&gt;A crate should manage colorizing the output&lt;/li&gt;
&lt;li&gt;A color flag should manage color output &lt;code&gt;--color (always|auto|never)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;thick rows === should be bold and the thin rows — dimmed&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think it’d look nice to give all the languages a cyan color, and emphasize the subtotals.&lt;/p&gt;

&lt;p&gt;First step is identifying how we’ll cover color output, and the issue points us to &lt;a href="https://crates.io/crates/colored" rel="noopener noreferrer"&gt;colored&lt;/a&gt; which is based on a Ruby gem of &lt;a href="https://github.com/defunkt/colored" rel="noopener noreferrer"&gt;the same name&lt;/a&gt;. Usage is very straightforward. &lt;code&gt;println!("Hello, {}!", "world".green().bold())&lt;/code&gt; will use the terminal’s colors, and bold the text. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Fterminal-color.JPG" 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%2Fwww.chael.codes%2Fassets%2Fimg%2Fposts%2Fterminal-color.JPG" alt="the world in hello, world is green and bold"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that “cyan” or “green” may not always be cyan or green, they’re just roles in your terminal color scheme.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, it’s time to think about how and where to output these colors. Tokei implements a printer interface in &lt;a href="https://github.com/XAMPPRocky/tokei/blob/611de1fc7b33027b918e97127c67825cc7408273/src/cli_utils.rs" rel="noopener noreferrer"&gt;cli_utils.rs&lt;/a&gt; which is where I found the &lt;a href="https://github.com/XAMPPRocky/tokei/blob/611de1fc7b33027b918e97127c67825cc7408273/src/cli_utils.rs#L150-L164" rel="noopener noreferrer"&gt;headers!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With some lovely colors and style implemented in Tokei, it’s time to think about those command line args and turning off color. Some people (like other computers) prefer not to have color. I think we handle this in &lt;a href="https://github.com/XAMPPRocky/tokei/blob/611de1fc7b33027b918e97127c67825cc7408273/src/cli.rs#L10-L26" rel="noopener noreferrer"&gt;cli.rs&lt;/a&gt;. &lt;a href="https://docs.rs/colored/2.0.0/colored/control/struct.ShouldColorize.html" rel="noopener noreferrer"&gt;ShouldColorize&lt;/a&gt; respects environment variables like NOCOLOR and CLICOLOR, but flags seem helpful too. We should document this regardless.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/XAMPPRocky/tokei/pull/751" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Add Color to Tokei
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#751&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F8124558%3Fv%3D4" alt="ChaelCodes avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;ChaelCodes&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/XAMPPRocky/tokei/pull/751" rel="noopener noreferrer"&gt;&lt;time&gt;Apr 09, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;closes #419
Use the colored crate to add some additional color to Tokei.
Colored will respect settings like CLICOLOR_FORCE and NO_COLOR.
It will also use the configured terminal theme's blue.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://user-images.githubusercontent.com/8124558/114241125-b05c2c80-9956-11eb-957d-ab21cbb0ec10.PNG" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8124558%2F114241125-b05c2c80-9956-11eb-957d-ab21cbb0ec10.PNG" alt="old tokei"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://user-images.githubusercontent.com/8124558/114241115-a9351e80-9956-11eb-883e-2687e518f045.PNG" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8124558%2F114241115-a9351e80-9956-11eb-883e-2687e518f045.PNG" alt="tokei color"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://user-images.githubusercontent.com/8124558/114241140-b5b97700-9956-11eb-92e5-4c3ab7578ba1.PNG" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8124558%2F114241140-b5b97700-9956-11eb-92e5-4c3ab7578ba1.PNG" alt="tokei bright no color"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://user-images.githubusercontent.com/8124558/114241144-b8b46780-9956-11eb-997f-6030a1a687f3.PNG" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8124558%2F114241144-b8b46780-9956-11eb-997f-6030a1a687f3.PNG" alt="Tokei color bright"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/XAMPPRocky/tokei/pull/751" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>rust</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building Jekyll-Twitch, the gem</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Thu, 01 Apr 2021 21:32:37 +0000</pubDate>
      <link>https://dev.to/newrelic/building-jekyll-twitch-the-gem-1kca</link>
      <guid>https://dev.to/newrelic/building-jekyll-twitch-the-gem-1kca</guid>
      <description>&lt;p&gt;I'm really happy with my new website! But I can't embed Twitch clips. In fact, no one can embed Twitch clips in Jekyll, because there's no liquid tag for it. But we can fix that, not just for us, but for everyone!&lt;/p&gt;

&lt;p&gt;This project breaks down into 3 distinct problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a Jekyll Liquid Tag&lt;/li&gt;
&lt;li&gt;Embedding a Twitch Broadcast, Clip, or VOD&lt;/li&gt;
&lt;li&gt;Creating a Gem, and publishing it to Ruby Gems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating a Jekyll Liquid Tag
&lt;/h2&gt;

&lt;p&gt;Jekyll liquid tags allow you to embed user-generated content safely. You might be okay with letting your users embed youtube videos, but you don't want them executing random javascript on your website. &lt;a href="https://shopify.dev/docs/themes/liquid/reference/basics" rel="noopener noreferrer"&gt;Liquids&lt;/a&gt; are an extensible templating library designed by Shopify. You specify a tag type, and then pass your url or id, and the tag sanitizes it and embeds the content. &lt;code&gt;{% twitch &amp;lt;clip url here&amp;gt; %}&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Examples:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/dommmel/jekyll-youtube" rel="noopener noreferrer"&gt;Jekyll-YouTube&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/rob-murray/jekyll-twitter-plugin" rel="noopener noreferrer"&gt;Jekyll-Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jekyll/jekyll-gist" rel="noopener noreferrer"&gt;Jekyll-Gist&lt;/a&gt; (This one is maintained by Jekyll)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We'll start with Jekyll's guide to &lt;a href="https://jekyllrb.com/docs/plugins/tags/" rel="noopener noreferrer"&gt;liquid tags.&lt;/a&gt; They say we should create a &lt;code&gt;TwitchTag&lt;/code&gt; class inside the &lt;code&gt;Jekyll&lt;/code&gt; module, and add a render method for the embeds. We also need to register the tag, &lt;code&gt;Liquid::Template.register_tag('twitch', Jekyll::TwitchTag)&lt;/code&gt;, so Jekyll knows that it can use this tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedding a Twitch broadcast, clip, or VOD
&lt;/h2&gt;

&lt;p&gt;Twitch allows you to embed clips, broadcasts, and VODs using several different &lt;a href="https://dev.twitch.tv/docs/embed" rel="noopener noreferrer"&gt;embeds&lt;/a&gt;. They require that all embeds be served over SSL, and they want to know the parent domain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.twitch.tv/docs/embed/everything" rel="noopener noreferrer"&gt;Option 1&lt;/a&gt; - Twitch offers an embed that includes chat, login, subscription, and everything normally available on the Twitch site. Unfortunately, it serves everything through JavaScript, and requires you to embed their script on your site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.twitch.tv/docs/embed/video-and-clips#non-interactive-inline-frames-for-live-streams-and-vods" rel="noopener noreferrer"&gt;Option 2&lt;/a&gt; - This is a simple, non-interactive iframe for Twitch that works for VODs and Livestreams. The viewer will have to continue to Twitch to follow or subscribe. This will also &lt;a href="https://dev.twitch.tv/docs/embed/video-and-clips#non-interactive-iframes-for-clips" rel="noopener noreferrer"&gt;work for clips&lt;/a&gt; if we customize the url.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.twitch.tv/docs/embed/video-and-clips#interactive-frames-for-live-streams-and-vods" rel="noopener noreferrer"&gt;Option 3&lt;/a&gt; - This option asks you to embed the same script as option 1, but they've used the player instead of the embed. The documentation doesn't make the differences clear.&lt;/p&gt;

&lt;p&gt;I plan to start with option 2 because it's simpler, and I need it for clips. Options 1 and 3 don't support clips.&lt;/p&gt;

&lt;p&gt;Here's the super simple iFrame I'll be embedding. For clips, the url is: &lt;code&gt;https://clips.twitch.tv/embed?clip=&amp;lt;VeryLongClipTitle&amp;gt;&amp;amp;parent=streamernews.example.com&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;iframe
    src="https://player.twitch.tv/?&amp;lt;channel, video, or collection&amp;gt;&amp;amp;parent=streamernews.example.com"
    height="&amp;lt;height&amp;gt;"
    width="&amp;lt;width&amp;gt;"
    allowfullscreen="&amp;lt;allowfullscreen&amp;gt;"&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I've embedded this before for Forem, so I'm looking forward to improving it.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Create a Gem
&lt;/h2&gt;

&lt;p&gt;We can create the gem using the same tool we use for managing versions: &lt;a href="https://bundler.io/v2.0/guides/creating_gem.html" rel="noopener noreferrer"&gt;Bundler.&lt;/a&gt; Then, I plan to &lt;a href="https://guides.rubygems.org/publishing/" rel="noopener noreferrer"&gt;publish it on RubyGems.&lt;/a&gt; I'm really excited about this! &lt;/p&gt;
&lt;h2&gt;
  
  
  Files I'll need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;lib/twitch_tag.rb - this is going to handle formatting and rendering the twitch embed&lt;/li&gt;
&lt;li&gt;lib/spec/twitch_tag_spec.rb - this is where all our tests around the twitch embed will live.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Gems I'll use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rspec/rspec" rel="noopener noreferrer"&gt;RSpec&lt;/a&gt; This is my favorite testing gem. I love how readable and well-organized the tests are.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ruby/rdoc" rel="noopener noreferrer"&gt;RDoc&lt;/a&gt; We'll use this gem to document our TwitchTag.rb class.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rubocop/rubocop" rel="noopener noreferrer"&gt;Rubocop&lt;/a&gt; Just for fun, let's add this one too. It'll keep our styles consistent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these gems will be dependencies. I can run them exclusively in development.&lt;/p&gt;
&lt;h2&gt;
  
  
  CI/CD
&lt;/h2&gt;

&lt;p&gt;Let's reuse the GitHub actions from last week.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/ChaelCodes/chaelcodes.github.io/pull/1" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Automatically Lint New PRs
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F8124558%3Fv%3D4" alt="ChaelCodes avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;ChaelCodes&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/ChaelCodes/chaelcodes.github.io/pull/1" rel="noopener noreferrer"&gt;&lt;time&gt;Mar 12, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;h1&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Description of Problem&lt;/h1&gt;
&lt;p&gt;I want some quality control and consistency. If I don't have some sort of linter, I can't ensure that happens.&lt;/p&gt;
&lt;h1&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Technical Solution&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Run rubocop on every push using github actions.&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ChaelCodes/chaelcodes.github.io/pull/1" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Then we'll add a new one to run RSpec, and verify that tests pass.&lt;/p&gt;

&lt;p&gt;Once I have the entire repository set up, and the gem built, I'll want to add it to my own site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Gem to &lt;a href="https://www.chael.codes" rel="noopener noreferrer"&gt;chael.codes&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The Jekyll docs say that GitHub pages excludes gems using the &lt;code&gt;--safe&lt;/code&gt; option, &lt;del&gt;but they also say that you can skip that by including it in &lt;code&gt;jekyll-plugins&lt;/code&gt;.&lt;/del&gt; This did not work. GitHub Pages only supports their allow-listed plugins.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;
        ChaelCodes
      &lt;/a&gt; / &lt;a href="https://github.com/ChaelCodes/jekyll-twitch" rel="noopener noreferrer"&gt;
        jekyll-twitch
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Embed Twitch clips, VODs, and broadcasts in your Jekyll sites.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Jekyll::Twitch&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This gem allows you to embed twitch channels, clips, collections, and videos in your Jekyll websites. It adds and registers a new twitch liquid tag that accepts a twitch clip, channel, broadcast, or highlight url. It's based on the &lt;a href="https://dev.twitch.tv/docs/embed/video-and-clips" rel="nofollow noopener noreferrer"&gt;Twitch video embeds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{% twitch https://www.twitch.tv/chaelcodes/clip/SpoopySlipperyGrasshopperPogChamp %}&lt;/code&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;a href="https://www.chael.codes/jekyll-twitch/" rel="nofollow noopener noreferrer"&gt;See the DEMO site&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Check out the &lt;a href="https://www.chael.codes/jekyll-twitch/" rel="nofollow noopener noreferrer"&gt;demo site&lt;/a&gt; for install instructions and to review different embed examples.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Add this line to your application's Gemfile:&lt;/p&gt;
&lt;div class="highlight highlight-source-ruby notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-en"&gt;gem&lt;/span&gt; &lt;span class="pl-s"&gt;'jekyll-twitch'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;And then execute:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ bundle install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or install it yourself as:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ gem install jekyll-twitch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then add Jekyll-Twitch to your &lt;code&gt;_config.yml&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;plugins:
  - jekyll-twitch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This is a Jekyll liquid tag, so just put &lt;code&gt;{% twitch  https://www.twitch.tv/chaelcodes/clip/SpoopySlipperyGrasshopperPogChamp %}&lt;/code&gt; to embed your clip, channel, or broadcast.&lt;/p&gt;
&lt;p&gt;When building your site, Jekyll no longer substitutes &lt;code&gt;site.url&lt;/code&gt; for localhost, which means Twitch embeds will not render. You need to supply host and localhost to view…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ChaelCodes/jekyll-twitch" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>jekyll</category>
      <category>twitch</category>
      <category>ruby</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Research for a Jekyll Profile on GitHub pages</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Thu, 25 Mar 2021 15:12:50 +0000</pubDate>
      <link>https://dev.to/newrelic/research-for-a-jekyll-profile-on-github-pages-5dcp</link>
      <guid>https://dev.to/newrelic/research-for-a-jekyll-profile-on-github-pages-5dcp</guid>
      <description>&lt;p&gt;I have too many links and social pages. I can't even keep track of them all. What if I could store them all in one place, for free, and build the site using my favorite language? Let's build the technical plan!&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Requirements
&lt;/h2&gt;

&lt;p&gt;I need to share my Twitter, GitHub, Twitch, TheRelicans, and Dev.To. (And &lt;a href="https://chaelcodes.netlify.com" rel="noopener noreferrer"&gt;BitBurner&lt;/a&gt;.) I also want to throw random webpages and utilities on it without thinking about hosting providers or tech stack. Then my blogs need a canonical source. I plan to cross-post to Dev.To and therelicans.com, so a blog format that can easily transfer is important. We can lorem ipsum some space with a bio too! I bought a &lt;a href="https://chael.codes" rel="noopener noreferrer"&gt;domain&lt;/a&gt;, so let's show everything there instead of chaelcodes.github.io. ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Research
&lt;/h2&gt;

&lt;p&gt;First, I checked out &lt;a href="https://jekyllrb.com/docs/step-by-step/01-setup/" rel="noopener noreferrer"&gt;the Jekyll tutorial&lt;/a&gt; to get an idea of how to build a site, and make sure it'll meet the requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jekyllrb.com/docs/step-by-step/08-blogging/" rel="noopener noreferrer"&gt;Posts&lt;/a&gt; are markdown files stored in a _posts directory. This feels very straight-forward, and my blog posts will all be tracked via git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jekyllrb.com/docs/step-by-step/02-liquid/" rel="noopener noreferrer"&gt;Liquids&lt;/a&gt; are tags used to safely embed external content in posts and pages. I've &lt;a href="https://www.youtube.com/watch?v=EZu4pJftF-E" rel="noopener noreferrer"&gt;used them before&lt;/a&gt; with Forem (aka Dev.To). These will help with embedding Twitch and talk slides. The markdown format and Liquids mean it's easy to convert posts from Jekyll blog to Relican blog. I'll only need formatting changes for the slides and Twitch liquids.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jekyll Plugins
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jekyll/rubocop-jekyll" rel="noopener noreferrer"&gt;Rubocop-Jekyll&lt;/a&gt; will check our styles. I also want to try out Github Actions for the &lt;a href="https://docs.github.com/en/actions/guides/building-and-testing-ruby#linting-your-code" rel="noopener noreferrer"&gt;automatic linter&lt;/a&gt; since I'm building everything in GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md" rel="noopener noreferrer"&gt;Jekyll SEO Tag&lt;/a&gt; - You know how Google and Twitter have descriptions when you link to them? Those come from metadata tags, and this plugin will help us set them up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/sylhare/Type-on-Strap" rel="noopener noreferrer"&gt;Type-On-Strap&lt;/a&gt; I'd like a theme that's got top-level nav, because I don't have many pages to navigate between. This one is well-maintained, has over 450 stars on GitHub, and the image have a parallax effect, which I really like.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hosting
&lt;/h3&gt;

&lt;p&gt;GitHub's documentation has an &lt;a href="https://docs.github.com/en/github/working-with-github-pages/setting-up-a-github-pages-site-with-jekyll" rel="noopener noreferrer"&gt;entire section&lt;/a&gt; dedicated to documenting GH Pages and Jekyll. The short version is that you make a gh-pages branch, name the repo &lt;code&gt;username.github.io&lt;/code&gt;, and replace the &lt;code&gt;jekyll&lt;/code&gt; gem with the &lt;code&gt;github-pages&lt;/code&gt; gem. Then you &lt;a href="https://docs.github.com/en/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#choosing-a-publishing-source" rel="noopener noreferrer"&gt;configure GH pages&lt;/a&gt; in GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Domain
&lt;/h3&gt;

&lt;p&gt;Once I've got the site up, it's time to think about the domain. I picked up &lt;a href="http://chael.codes" rel="noopener noreferrer"&gt;chael.codes&lt;/a&gt; on Namecheap, which is a fabulous domain, and right now, it's a blank page, but we can fix that! First, we'll have to &lt;a href="https://docs.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain" rel="noopener noreferrer"&gt;configure a CNAME on GitHub&lt;/a&gt;, then we'll add that &lt;a href="https://www.namecheap.com/support/knowledgebase/article.aspx/579/2237/which-record-type-option-should-i-choose-for-the-information-im-about-to-enter/" rel="noopener noreferrer"&gt;new CName record&lt;/a&gt; to NameCheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Information Architecture
&lt;/h2&gt;

&lt;p&gt;Plugins, tools, and deploys are all great, but they're nothing without the content! I want to keep things as simple as possible, so we're starting with only 2 pages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Index page contains social links and bio.&lt;/li&gt;
&lt;li&gt;Blog page lists all blog posts.

&lt;ul&gt;
&lt;li&gt;I have some &lt;a href="https://chaelcodes.wordpress.com/blog/" rel="noopener noreferrer"&gt;old blogs&lt;/a&gt;, but I'm not migrating them. They can gather dust in the internet archive, k'thanks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I can foresee a future where I gather Twitch + Youtube + Blog content around games I'm playing, but that's the future! Not for today! (I think a Games directory with a post page for each would be cool though...)&lt;/p&gt;

&lt;p&gt;We built this on Twitch!!&lt;br&gt;
&lt;iframe src="https://clips.twitch.tv/embed?clip=NurturingEphemeralLegKreygasm-pZLTOLAGhV8sHP7Z&amp;amp;parent=dev.to&amp;amp;autoplay=false" height="399" width="710"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;And here's the repo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ChaelCodes" rel="noopener noreferrer"&gt;
        ChaelCodes
      &lt;/a&gt; / &lt;a href="https://github.com/ChaelCodes/chaelcodes.github.io" rel="noopener noreferrer"&gt;
        chaelcodes.github.io
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Portfolio site for ChaelCodes. Blogs, podcasts, and talks hosted here!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;chaelcodes.github.io&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This is a Portfolio site for ChaelCodes! You can see it at &lt;a href="https://www.chael.codes" rel="nofollow noopener noreferrer"&gt;chael.codes&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running the site Locally&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Run &lt;code&gt;bundle exec jekyll serve --livereload&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;bundle exec jekyll serve --livereload --port 5000&lt;/code&gt; if you need to free up port 4000.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tools used&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Theme is &lt;a href="https://github.com/sylhare/Type-on-Strap" rel="noopener noreferrer"&gt;type-on-strap&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ChaelCodes/chaelcodes.github.io" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>ruby</category>
      <category>jekyll</category>
    </item>
    <item>
      <title>How to caption your Twitch streams</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Tue, 12 Jan 2021 04:01:25 +0000</pubDate>
      <link>https://dev.to/chaelcodes/how-to-caption-your-twitch-streams-5e63</link>
      <guid>https://dev.to/chaelcodes/how-to-caption-your-twitch-streams-5e63</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Hey friends! If you have a better way, let me know in the comments below and I'll update the article to include your solutions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two types of captions: open and closed. Closed captions are captions included along your stream and your viewers can turn them on or off, and change the font, color, and style to suit their needs. Open captions are text captions captured in your video, and cannot be changed or hidden by the viewer. We're going to be focusing on closed captions which are &lt;a href="https://help.twitch.tv/s/article/guide-to-closed-captions?language=en_US#HowtoUseLiveClosedCaptionsforBroadcasters"&gt;supported by Twitch&lt;/a&gt;. There are a number of &lt;a href="https://dashboard.twitch.tv/extensions/h1ekceo16erc49snp0sine3k9ccbh9-1.5.1"&gt;twitch&lt;/a&gt; &lt;a href="https://dashboard.twitch.tv/extensions/g8w1nnehm3uxv44zl9eutspl8g3jcz-0.9.6"&gt;extensions&lt;/a&gt; &lt;a href="https://dashboard.twitch.tv/extensions/xxwoffr2lnpxrgpq228mawvdgxetip-1.0.1"&gt;that&lt;/a&gt; circumvent Twitch captions, but I want to focus on captions through Twitch.&lt;/p&gt;

&lt;h1&gt;
  
  
  Recording Software
&lt;/h1&gt;

&lt;p&gt;You need a caption provider, and to transmit captions through your recording software. All of the solutions I've found so far require an OBS plugin. Streamlabs does not support OBS plugins, so you have to use OBS. StreamElements offers OBS.Live on Windows which adds a lot of the functionality Streamlabs offered. You can also import your Streamlabs widgets as browser sources. If you still want to use Streamlabs, look at the extension options offered in the previous paragraph.&lt;/p&gt;

&lt;h1&gt;
  
  
  Caption Provider
&lt;/h1&gt;

&lt;p&gt;Your caption provider converts your voice into a transcript and captions. All options here are supported in Mac and Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Closed Captions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ratwithacompiler/OBS-captions-plugin"&gt;Cloud Closed Captions&lt;/a&gt; is an OBS plugin that uses Google Cloud Speech Recognition API to generate captions in OBS. You do not need to open a browser window to caption.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Cloud Closed captions &lt;a href="https://github.com/ratwithacompiler/OBS-captions-plugin#installation-windows"&gt;windows&lt;/a&gt; &lt;a href="https://github.com/ratwithacompiler/OBS-captions-plugin#installation-mac-os"&gt;mac&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Restart OBS&lt;/li&gt;
&lt;li&gt;Go to settings and select the microphone source, and enable captions.
If you are on Mac, fight with Security &amp;amp; Permissions, but you have captions!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Webcaptioner
&lt;/h3&gt;

&lt;p&gt;Webcaptioner is a common choice for open captions, because it runs on the &lt;a href="https://webcaptioner.com/help/getting-started/web-speech-api"&gt;Web Speech API for browsers&lt;/a&gt;. It's currently only supported by Google Chrome. In order to integrate with webcaptioner, &lt;a href="https://webcaptioner.com/help/integrations/obs"&gt;follow these steps&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://github.com/Palakis/obs-websocket/releases/tag/4.8.0"&gt;OBS websockets plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configure Websockets in OBS with a password and port number.&lt;/li&gt;
&lt;li&gt;Open webcaptioner in Google Chrome, and configure an OBS Studio channel with port and password.&lt;/li&gt;
&lt;li&gt;Set webcaptioner to use your microphone for captions.
You must have the webcaptioner window open and recording the correct microphone at all times in order to receive captions.
# Captioning Guests
The solutions offered above only work with one microphone, but often, you'll have guests on stream to chat with, or TTS messages you want to hear. You need to turn multiple audio source into one using a virtual mixer like Voicemeeter. Voicemeeter has several competitors, but this article will start with just covering voicemeeter. Let me know in the comments what your favorite virtual mixer is, and I'll add it to the list!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Voicemeeter
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vb-audio.com/Voicemeeter/banana.htm"&gt;Voicemeeter&lt;/a&gt; is a virtual mixer that allows you to combine multiple audio sources into a virtual output or input source. It is only supported on Windows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up your microphone as a hardware input, and select a virtual output (like B1).&lt;/li&gt;
&lt;li&gt;Separate you vocal audio into one virtual input, by adjusting the output of each application. The setting should be where you decide which speaker to use.&lt;/li&gt;
&lt;li&gt;Set that virtual input to the same virtual output from step one (B1).&lt;/li&gt;
&lt;li&gt;Set this virtual output as your microphone source in your caption provider.
You do not need to output this audio as your source in OBS. You could use it exclusively to create your captions.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>streaming</category>
      <category>twitch</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Live-Coding Setup Changelog</title>
      <dc:creator>Rachael Wright-Munn</dc:creator>
      <pubDate>Fri, 07 Aug 2020 20:56:27 +0000</pubDate>
      <link>https://dev.to/chaelcodes/live-coding-setup-changelog-2kda</link>
      <guid>https://dev.to/chaelcodes/live-coding-setup-changelog-2kda</guid>
      <description>&lt;p&gt;I love live-coding on &lt;a href="https://twitch.tv/ChaelCodes"&gt;Twitch&lt;/a&gt;. On Sundays, I work on my open-source Rails app HuntersKeepers. On Thursdays, I play programming-adjacent games. Getting all of this to work effectively is an ongoing process. Existing setup blogs focus on the current setup, but I want a changelog to track how the purchase improved my stream and whether it was worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Known Issues
&lt;/h2&gt;

&lt;p&gt;🐛 Application audio must be set to 1-2 in Windows Mixer unless audience tinnitus is desired.&lt;br&gt;
🐛 Cannot see level of computer audio in Streamlabs.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.0 Camera Update
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZHZgsvqT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4NPTKr4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZHZgsvqT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4NPTKr4.jpg" alt="Imgur" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/2W8UjmW"&gt;Canon EOS Rebel T6&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;This camera is so nice!! I bought it for Ken and borrowed it for the Kinesis stream, and it looked so nice that I kept it! My face is clearer, and the soft out of focus effect helps pull me out from the background. The lens drastically reduces the amount of room visible, but the trade-off is worth it. I use Canon's &lt;a href="https://www.usa.canon.com/internet/portal/us/home/support/self-help-center/eos-webcam-utility"&gt;EOS webcam utility&lt;/a&gt; to get video out of it. It's a little buggy. I have to deactivate the video input in streamlabs, turn off the camera, turn the camera back on, and turn the video input back on, and then we're good to record! On mac, you can't output to desktop zoom, unless you're going through an intermediary like &lt;a href="https://blog.streamlabs.com/streamlabs-obs-now-supports-virtual-camera-9a4e464435c2"&gt;Streamlabs virtual cam&lt;/a&gt;. I've been enjoying looking extra fabulous on zoom calls!&lt;br&gt;
&lt;a href="https://www.amazon.com/gp/product/B01CQJHJ2E/ref=as_li_ss_il?ie=UTF8&amp;amp;psc=1&amp;amp;linkCode=li2&amp;amp;tag=chaelcodes-20&amp;amp;linkId=ef621843c0a81518af598f93a2085307&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B01CQJHJ2E&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y-t2Jwk9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01CQJHJ2E" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y-t2Jwk9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01CQJHJ2E" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.0.1 (released Sep.14.2020)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/3a4y7k9"&gt;Kinesis Freestyle Edge RGB&lt;/a&gt;⌨️
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://amzn.to/3a4y7k9"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07SW1S3YZ&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;Kinesis gave me a free split ergonomic keyboard! Look how beautiful it is! It has the softest wrist cushions, my favorite brown switches, and if I have two halves of a keyboard, I have to learn to touch type. The brown switches are great for streams. My typing has a feel and sound to it, but it doesn't overwhelm my voice.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.0 (Released Aug.20.2020)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OD7-xkk0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/sW2G0dyl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OD7-xkk0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/sW2G0dyl.jpg" alt="Chael at her new desk" width="640" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.upliftdesk.com/uplift-v2-24-deep-standing-desk/"&gt;UpLift Standing Desk&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;DESK UPGRADE! My company gave us a one-time work from home budget to spend on office setup. I love this desk! I like how the acoustic panels reduce echo + room noise, my Stream Tank has more airflow, and the precision desk height is fun to adjust on stream!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q61Vif4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/MvIIXrLm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q61Vif4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/MvIIXrLm.png" alt="img" width="276" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/31wfcuv"&gt;Streamdeck&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;I knew the Streamdeck would make my life easier, but I had no idea how much it would help! My credits are so much smoother, now that I'm not navigating menus, and I can update my twitter name when I go live and stop being live. I can't wait to add raid commands into this! I'm still figuring out how to disable follower alerts when I'm follow botted, and make cat snuggle time easy on the Streamdeck, but so far, it's great! I wish I'd upgraded sooner. Even the phone app helped.&lt;br&gt;
&lt;a href="https://www.amazon.com/Elgato-Stream-Deck-Controller-customizable/dp/B06XKNZT1P/ref=as_li_ss_il?dchild=1&amp;amp;keywords=stream+deck&amp;amp;qid=1596840862&amp;amp;s=electronics&amp;amp;sr=1-1&amp;amp;linkCode=li2&amp;amp;tag=chaelcodes-20&amp;amp;linkId=79284922353a1c1fd74ac3066260d778&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B06XKNZT1P&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3JSo7W-X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB06XKNZT1P" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3JSo7W-X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB06XKNZT1P" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  UpLift Vert Desk Chair
&lt;/h4&gt;

&lt;p&gt;This is not a comfortable chair. It's better than nothing, but it's got no lumbar support and very few adjustable points. You can adjust the height, armrest height, and back tilt, but that's it! The seat pan is less comfortable than rocks I've sat on. I swiped it from Ken, who's not eager to have it back.&lt;/p&gt;

&lt;h4&gt;
  
  
  $7 Floor Lamp once purchased from Wal-Mart
&lt;/h4&gt;

&lt;p&gt;My husband bought this lamp when he was in college. It's a floor lamp, with a plastic shade, and it directs light at the ceiling. I put it in front of my desk, and turned off the ring light on the Kiyo and all my over-exposure/glare problems are fixed.&lt;br&gt;
🦋 Glare from the Razer Kiyo ring light on my glasses is gone!&lt;br&gt;
🦋 Uneven lighting and overexposure from the window has been balanced out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2.2 (Released)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.vb-audio.com/Voicemeeter/banana.htm"&gt;VoiceMeeter&lt;/a&gt;🔈
&lt;/h4&gt;

&lt;p&gt;This lets me output my volume to two different headsets, and to Streamlabs!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nOYuAMPW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/cmfXTut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nOYuAMPW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/cmfXTut.png" alt="Screenshot of Voicemeeter" width="800" height="485"&gt;&lt;/a&gt;&lt;br&gt;
🐛 Computer audio volume is no longer accurately reported in Streamlabs.&lt;br&gt;
🦋 Disconnecting bose headphones no longer impacts audio.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2.1 (Patch to Support Goat Stream!)
&lt;/h3&gt;

&lt;p&gt;We rented goats to eat our underbrush! I did a 12-hour stream to share my beautiful goats with the world.&lt;/p&gt;

&lt;h4&gt;
  
  
  Yi Cam
&lt;/h4&gt;

&lt;p&gt;I saw the goats the goats on day 1, and immediately decided I needed to stream them. Webcams are designed to focus on a person in front of a desk, but security cams are designed to capture a whole yard! I connected the USB cam to a charging block that lasted 12 hours. The mobile nature of the Yi Cam + charging block made it easy to move the cam to wherever the goats were. There was a significant delay, as seen in this clip where &lt;a href="https://www.twitch.tv/videos/677932888"&gt;I realize the goats have destroyed my chiminea.&lt;/a&gt; Sometimes the video would stutter which I think was related to WiFi on the deck. I didn't do anything fancy for capturing video. I opened the Yi live watch application, and captured that application through OBS, and covered the chrome with videos. Not bad for a makeshift setup!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cfSIPZhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/SKUbktKm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cfSIPZhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/SKUbktKm.jpg" alt="Yi Camera on charging block" width="320" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Laptop Webcam used
&lt;/h4&gt;

&lt;p&gt;♻️ Old streaming laptop used.&lt;br&gt;
♻️ Lapel Mics reused.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 (Released)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zCmQA0_a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/6ymAg0t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zCmQA0_a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/6ymAg0t.jpg" alt="ChaelCodes at her desk, all gear on display" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/30Eyizr"&gt;Rode NT1&lt;/a&gt;🎤
&lt;/h4&gt;

&lt;p&gt;I saw &lt;a href="https://www.youtube.com/watch?v=aZLwnVw_h00"&gt;podcaststage&lt;/a&gt; try out this mic on YouTube and it made his voice silky smooth! Then I really wanted a mic upgrade. I thought it would really help improve my audio and deal with a persistent hiss I was hearing. All I've learned is that soundproofing &amp;gt; mic upgrades. Turning off the A/C and fan helps with noise floors way more than the mic upgrade did. This microphone upgrade came with a shock mount and a pop-filter upgrade.&lt;br&gt;
&lt;a href="https://amzn.to/30Eyizr"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XwIQCAqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/uiBESOQm.jpg" width="213" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1.2 (Released)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Pretzel Rocks!
&lt;/h4&gt;

&lt;p&gt;This is amazing! I listen to Chill/No Vocals/No Mature and it is bopping! I regularly get questions about what's playing, and the answer is already reported to chat by Pretzel!&lt;br&gt;
🦋 No more muted VODs!&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1.1 (Patch to Support Mobile Recording)
&lt;/h3&gt;

&lt;p&gt;IlluminatedSpace had an incredible project that I wanted to be part of! Recording videos for coding tutorials to encourage and explain why concepts were important! I took my setup to work to get a cool backdrop. It didn't work. None of my framing attempts worked without compromising company security or co-worker privacy.&lt;br&gt;
💥 Razer Kiyo hinge breaks in bookbag.&lt;br&gt;
♻️ Lapel mics&lt;br&gt;
♻️ Old streaming laptop&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 (Released xxx.xx.2019)
&lt;/h3&gt;

&lt;p&gt;Window Seat! I really like looking outside, and so do the cats! The cat tower moves next to me in stream after this.&lt;br&gt;
🐛 Uneven lighting and overexposure.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.0.1 (Patch to Support Mobile Stream)
&lt;/h3&gt;

&lt;p&gt;I went to Florida! It was my Grandma's 94th birthday, so I streamed from the hotel.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/33EKXnU"&gt;Saramonic Blink 500 Lapel Mics&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Lapel mics are supposed to be really good for capturing one audio source, on the move, and filtering out external noise that's far from the microphone. Mine were crisper and clearer than the condenser mic I was using, which allowed me to identify that the rushing noise was partially due to the highway a mile from my house.&lt;br&gt;
In practice, I've yet to use both transmitters at the same time. Also, it's &lt;em&gt;very&lt;/em&gt; difficult to tell if they're paired or not. I had some trouble setting them up, because I had to use the correct microphone cable on the laptop port, and the input type to use was confusing. The range on this is great though! They last about two hours, but I almost always have the receiver plugged into a charger, and I often charge the transmitter during use.&lt;br&gt;
&lt;a href="https://amzn.to/33EKXnU"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07X3XNCXB&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hprll0in--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07X3XNCXB" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hprll0in--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07X3XNCXB" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;br&gt;
♻️ Razer Kiyo&lt;br&gt;
♻️ Old Streaming Laptop&lt;/p&gt;

&lt;h3&gt;
  
  
  1.0 (Released)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Stream Tank
&lt;/h4&gt;

&lt;p&gt;My laptop was dropping frames when trying to run 7 Billion Humans on 12x speed! It was time to upgrade to a dedicated machine. Ken built me this beautiful Stream Tank.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OXm2YoPD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4dFGQJEm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXm2YoPD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4dFGQJEm.jpg" alt="Centerfold computer case, wide open, revealing the components inside" width="240" height="320"&gt;&lt;/a&gt;&lt;br&gt;
Asus x570 Tuf Gaming + WiFi, AMD Ryzen 7 3700x, Ripjaws 32GB DDR4 3600, Fractal Design Meshify C TG, EVGA SuperNova G3 650, Nvidia GTX 670&lt;/p&gt;

&lt;h3&gt;
  
  
  0.1 (Released Oct.06.2019)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Windows Subsystem for Linux
&lt;/h4&gt;

&lt;p&gt;I use Ruby on Rails professionally, and I play Monster of the Week recreationally. When Hacktober came around, building a new open-source RoR app to make managing games of Monster of the Week easier seemed like an obvious choice. One problem, neither Ruby nor Rails like Windows, and I have no intention of streaming on my work macbook. Getting WSL set up was significantly easier than I thought it would be. File permissions aren't a big deal if you put your files in mnt/c.&lt;/p&gt;

&lt;h3&gt;
  
  
  0.0 (Released Aug.03.2019) ✨
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AFdhJ7Bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/8YReAxh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AFdhJ7Bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/8YReAxh.jpg" alt="Desk with recording gear" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://streamlabs.com/"&gt;Streamlabs OBS&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;I get follow alerts, commands, and recording software in one free tool! Streamlabs is significantly easier to use than OBS, and has the same power, because it's built on OBS.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.ncsmusic.com/usage/"&gt;No Copyright Sounds&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Yes! They have playlists on Spotify based on mood, Cradles is amazing, and all I have to do is include their logo in my panel. Plus they're copyright-free on YouTube too, (as long as you credit them in the description), so I can upload my VODs! they change out which songs are in their spotify playlists on a regular basis, so there's often fresh music.&lt;br&gt;
&lt;iframe src="https://open.spotify.com/embed/playlist/7fIGJFhLqGXXK435PN0BEA" width="100%" height="380px"&gt;
&lt;/iframe&gt;
&lt;br&gt;
🐛 Occasionally, my VODs were muted?!&lt;/p&gt;

&lt;h4&gt;
  
  
  Microphone
&lt;/h4&gt;

&lt;p&gt;Ken bought this microphone over a year ago on sale on amazon. It was $5 on Prime day. A lot of my initial issues with this microphone were related to misuse. I had it the wrong way around, and it took me a while to figure out how to correctly set the gain.&lt;br&gt;
🐛 Weird water rushing sound at the bottom of the microphone's range.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/3kprNII"&gt;Microphone Arm&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;I bought a cheap microphone arm from amazon for $23. This microphone arm worked great! It held the mic up, came with a shock mount and pop filter, and was perfect. The shock mount is key in reducing noise from bumping the desk or even typing on the keyboard. The pop filter helps with plosives, which are 'p' and 'b' sounds. Microphones pick up noise through vibrations, and if you blow on your mic, it'll pick up air movement and sound movement, making your 'p's pop a little too much. The pop filter helps diffuse that air.&lt;br&gt;
&lt;a href="https://amzn.to/3kprNII"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B01GRMF4RS&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3swGkS1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01GRMF4RS" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3swGkS1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01GRMF4RS" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/3kWcB6d"&gt;Audio Interface&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Audio Interfaces provide phantom power to microphones, and connect to the PC via USB. I have never had a problem with this audio interface.&lt;br&gt;
&lt;a href="https://amzn.to/3kWcB6d"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B00FFIGZF6&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NWLTw5WT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00FFIGZF6" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWLTw5WT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00FFIGZF6" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/3gFvYh1"&gt;Razer Kiyo&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;This is some nice crisp video, but the ring light is too small to be helpful. My screen with a light mode application and fully brightness does more than the ring light. This webcam just works, so I don't have much to say about it. 1080p is very nice, but Twitch is going to throttle my face down to 720p, so I'm not sure who's benefitting from it.&lt;br&gt;
&lt;a href="https://amzn.to/3gFvYh1"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B075N1BYWB&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S6imDuy6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB075N1BYWB" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S6imDuy6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB075N1BYWB" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;br&gt;
🐛 Ring light produces glare on glasses.&lt;br&gt;
🐛 Auto focus issues in low-light scenarios.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/31smnEc"&gt;Acer R 15 Laptop&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;I bought this for my sister for Christmas when she went to college, but she said it was too heavy and she couldn't carry it around. I bought her a used Surface Pro from a friend, and I was supposed to return this laptop, but between Christmas and laziness, it went past the return period. I started using it as a personal computer, and when I wanted to stream, it was there waiting for me!&lt;br&gt;
&lt;a href="https://amzn.to/31smnEc"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B06WD61CF5&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4mNvgRbj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB06WD61CF5" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4mNvgRbj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB06WD61CF5" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;br&gt;
🐛 This laptop once decided to defrag during a stream, resulting a lot of dropped frames.&lt;/p&gt;

&lt;h4&gt;
  
  
  Monitor
&lt;/h4&gt;

&lt;p&gt;This was just a monitor I had laying around the house. Having two monitors when you're streaming is incredibly helpful. I put chat and my recording software on one side, and the application I'm recording on the other. It's important that chat is always easy to see and respond to, but also, it's important to have an easy way to check your video and audio levels.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/3ihWDRC"&gt;Mechanical Keyboard&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;When I bought this, you could customize the switches, and it was made by gofreetech. I love brown switches, because they have the same tactile feeling as blues, but a little quieter. Any mechanical keyboard feels nicer to type on than a standard laptop keyboard with stubby, mashy keys. I deliberately chose an audible switch for my stream. I wanted the lines of code to have an impact as they were being written, and to be more prominent in the stream. If I were playing an FPS or any game using WASD to travel, I'd choose clears.&lt;br&gt;
&lt;a href="https://www.amazon.com/gp/product/B0789C52WX/ref=as_li_ss_il?ie=UTF8&amp;amp;psc=1&amp;amp;linkCode=li2&amp;amp;tag=chaelcodes-20&amp;amp;linkId=4c88a5b84fdfd7e070eb746991ce3f04&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B0789C52WX&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LbFFp1ji--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB0789C52WX" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LbFFp1ji--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB0789C52WX" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Surprise! I'm including my work keyboard too! The &lt;a href="https://amzn.to/3fF5Y4i"&gt;Pok3r 60% keyboard&lt;/a&gt; feels amazing. I got it in white with brown switches. The metal casing, sleek design, and keys look, sound, and feel great. You know what doesn't feel great? The claw hand I go into every time I need the arrow keys. I don't even think about the motion, or my future arthritis, when I traverse the code using arrow keys. Honestly, this keyboard may have caused me to use the mouse more. Gorgeous though. Best feeling keyboard I own.&lt;br&gt;
&lt;a href="https://amzn.to/3fF5Y4i"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B00W02J5KM&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r1r-pmlD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00W02J5KM" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r1r-pmlD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00W02J5KM" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/2PvVNEB"&gt;Jelly Comb Mouse&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;The mouse so nice, I bought it twice! I had one for work and one for home. I love this mouse. It's completely silent on stream. It feels nice in my hand. It even looks nice!&lt;br&gt;
&lt;a href="https://amzn.to/2PvVNEB"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B076F5P28T&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fKm5dess--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3D%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB076F5P28T" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fKm5dess--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3D%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB076F5P28T" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://amzn.to/31stUTr"&gt;Bose Headphones&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;These are just used as headphones, not mic. You need headphones to prevent the mic from picking up your computer audio. I like to move around and bob a little, so I can't be tied down with a wire; the bluetooth is mandatory! The in-ear headphones hurt my ears, so I need the over-ear cans.&lt;br&gt;
&lt;a href="https://amzn.to/31stUTr"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B01E3SNO1G&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=chaelcodes-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QzmtD-eE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01E3SNO1G" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QzmtD-eE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dchaelcodes-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB01E3SNO1G" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;br&gt;
🐛 These are a little frustrating, because when they disconnect or connect to another device, the audio on the stream dramatically increases in volume.&lt;br&gt;
🐛 Audio levels will sporadically change over time because headphones are connected/disconnected.&lt;br&gt;
🐛 Application audio on Windows must be set to 1-5 volume to not be overwhelming.&lt;/p&gt;

&lt;p&gt;Thank you for reading! If you have questions or suggestions, let me know in the comments!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've included links to Amazon for product details and easy purchasing. I receive a 2% commission on purchases using these links. #disclosed #ftc_safe If you discover a link to amazon, and you cannot purchase the product, that is intentional. I want you see what I bought.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>changelog</category>
      <category>productivity</category>
      <category>workstations</category>
      <category>livecoding</category>
    </item>
  </channel>
</rss>
