<?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: Geraldine</title>
    <description>The latest articles on DEV Community by Geraldine (@geraldiner).</description>
    <link>https://dev.to/geraldiner</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%2F769584%2F32b0a9fc-8f9f-4667-b800-bbe3fd41842c.jpeg</url>
      <title>DEV Community: Geraldine</title>
      <link>https://dev.to/geraldiner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geraldiner"/>
    <language>en</language>
    <item>
      <title>How To Set Up a GitHub Action to Update the README File in All Your GitHub Repositories</title>
      <dc:creator>Geraldine</dc:creator>
      <pubDate>Tue, 07 Dec 2021 14:06:03 +0000</pubDate>
      <link>https://dev.to/geraldiner/how-to-set-up-a-github-action-to-update-the-readme-file-in-all-your-github-repositories-4epj</link>
      <guid>https://dev.to/geraldiner/how-to-set-up-a-github-action-to-update-the-readme-file-in-all-your-github-repositories-4epj</guid>
      <description>&lt;center&gt;&lt;h2&gt;Submission Info&lt;/h2&gt;&lt;/center&gt;




&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;A workflow for updating the README file in all your repositories. This is especially helpful if you use a template and want to update a specific section with new information, e.g. an "Other Projects" section that needs to be updated with more recent projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category
&lt;/h3&gt;

&lt;p&gt;Wacky Wildcards&lt;/p&gt;

&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/geraldiner" rel="noopener noreferrer"&gt;
        geraldiner
      &lt;/a&gt; / &lt;a href="https://github.com/geraldiner/projects-readme-tutorial" rel="noopener noreferrer"&gt;
        projects-readme-tutorial
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;See below for a full tutorial!&lt;/p&gt;




&lt;h2&gt;
  
  
  README Files in Brief and How to Set One Up
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why You Should Have a README File in Your GitHub Repositories
&lt;/h3&gt;

&lt;p&gt;As you continue to build out your portfolio with projects on GitHub, it's a good idea to include a README at the root of each project to describe what the project is about and how it was built. This is useful for anyone who comes across your project—other developers, recruiters, or even your future self—to get a quick understanding of the project and your process. Personally, it is also a great reflection tool, since I usually write them after a project has been completed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj3cgsq6s4kroxv88nc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj3cgsq6s4kroxv88nc5.png" alt="README file template by Alec Ortega (@alecortega)" width="800" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Write a README File for Your Project
&lt;/h3&gt;

&lt;p&gt;But of course, you don't always have to do this from scratch. Resources, such as &lt;a href="https://www.readme-templates.com/" rel="noopener noreferrer"&gt;GitHub README Templates&lt;/a&gt;, allows you to view README layouts for different sites, which can give you an idea of how to format your own README. &lt;a href="https://www.google.com/search?q=github+readme+template" rel="noopener noreferrer"&gt;A simple Google search for "github readme template"&lt;/a&gt; will also bring up a number of templates in repositories that you can just fork for yourself.&lt;/p&gt;

&lt;p&gt;As the title of this post suggests, a full breakdown of a README for your project is beyond the scope of this post. To help you get started, I recommend reading &lt;a href="https://hashnode.com/@tracycod3r" rel="noopener noreferrer"&gt;Tracy Nuwagaba&lt;/a&gt;'s article, &lt;a href="https://tracy.hashnode.dev/how-to-write-a-readme-for-your-github-project" rel="noopener noreferrer"&gt;How to write a readme for your GitHub project&lt;/a&gt;. If you're like me, you can pick your favorite template and tweak it to fit your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus Tip: Load the template as a snippet in VS Code
&lt;/h3&gt;

&lt;p&gt;If you use VS Code as your main code/text editor, you can save your own snippets to reuse chunks of code in different places.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qvzd07gobrkmuhbcrft.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qvzd07gobrkmuhbcrft.gif" alt="Using code snippets in VS Code" width="1920" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets" rel="noopener noreferrer"&gt;these directions&lt;/a&gt; to save the template as a custom snippet in VS Code. You can also use &lt;a href="https://snippet-generator.app/" rel="noopener noreferrer"&gt;this snippet generator&lt;/a&gt; to easily format the code snippet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem: Updating Older README Files with Newer Content
&lt;/h2&gt;

&lt;p&gt;As previously mentioned, I use the same README template for my projects, which includes a section for "Other Projects" and links to the repos of my other projects. (This is a not-so-secret technique to keep the user clicking through my GitHub portfolio 😏)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftndgn6znrkkuzahohxi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftndgn6znrkkuzahohxi5.png" alt="Other Projects section of the README template I use for my projects" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Naturally, in my older projects, there were links to even-older projects. As I continue learning, I've built more projects and want to make sure the most recent and polished projects are always on display. But who wants to go through the other ~20+ repositories to update EVERY. SINGLE. README. FILE. 😵 Definitely not me.&lt;/p&gt;

&lt;p&gt;Using the tried-and-true method of Googling to see if anyone else has encountered this issue, I came across Eugene Yan's article, &lt;a href="https://eugeneyan.com/writing/how-to-update-github-profile-readme-automatically/" rel="noopener noreferrer"&gt;How to Update a GitHub Profile README Automatically&lt;/a&gt;. He also cites Simon Willison, who achieved a similar task of &lt;a href="https://simonwillison.net/2020/Jul/10/self-updating-profile-readme/" rel="noopener noreferrer"&gt;building a self-updating profile README for GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both of these were done with GitHub Actions, which I'd never heard of until then. And while this sounds like a really neat integration for the GitHub Profile README, it wasn't quite what I needed. But I thought maybe I could still use GitHub Actions to solve my problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution: GitHub Actions to Run a Script that Interacts with the GitHub API
&lt;/h2&gt;

&lt;p&gt;In short, &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; are automated workflows that run based on triggers to perform a set of jobs. (For JavaScript folks, it's like &lt;code&gt;addEventListener&lt;/code&gt; for GitHub 😅) From pushes, to pull requests, to issues, a GitHub Action can be attached to those events, which will trigger the action and the job(s) will run. &lt;/p&gt;

&lt;p&gt;Again, I'd never heard of GitHub Actions before, so I had to spend a lot of time reading the documentation and other people's code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd45pagdez7wkdxgycx8t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd45pagdez7wkdxgycx8t.gif" alt="https://3.bp.blogspot.com/-pH1pCb3OqtQ/W9EagJJc50I/AAAAAAAMQOg/ew-YHjCU4E4hw7ortL3ZDscpc-fXur4kwCLcBGAs/s1600/AS0004540_16.gif" width="370" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It turned out to be simpler than I thought, especially since I figured out you could write a script that you set up the action to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Instructions to Setting Up the GitHub Action
&lt;/h2&gt;

&lt;p&gt;GitHub Actions uses YAML, which this tutorial doesn't require you to know a lot of. (Personally, I relied on the documentation and Eugene and Simon's code for this part.) But the main script is written in JavaScript and uses Node.js, so some knowledge of both is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set up your project in your local environment
&lt;/h3&gt;

&lt;p&gt;First, set up your project on your computer or other work environment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If you're not particularly tied to one editor or don't have a local environment, you can still code in the browser! Check out my article on browser-based code editors: &lt;a href="https://blog.geraldiner.com/three-levels-of-code-editors-in-the-browser" rel="noopener noreferrer"&gt;Three Levels of Code Editors in the Browser&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this tutorial, I have a directory called &lt;code&gt;projects-readme-tutorial&lt;/code&gt; and I'll be using VS Code as my code editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4qjgi6x6v3nr6r4ggf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4qjgi6x6v3nr6r4ggf5.png" alt="VS Code editor with a project initialized" width="800" height="877"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Initiate a Node.js project with &lt;code&gt;npm init&lt;/code&gt; and install dependencies
&lt;/h3&gt;

&lt;p&gt;Next you have to initiate a Node.js project and install dependencies via a Terminal or Command Prompt.&lt;/p&gt;

&lt;p&gt;In VS Code, you can open the terminal by going to Terminal &amp;gt; New Terminal. You can use &lt;code&gt;npm init&lt;/code&gt;, which will take you through a series of questions to initiate your project, or use &lt;code&gt;npm init -y&lt;/code&gt; to use all the default configuration settings.&lt;/p&gt;

&lt;p&gt;Here, I used &lt;code&gt;npm init -y&lt;/code&gt; and a &lt;code&gt;package.json&lt;/code&gt; file was created in the directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqgqvtwyxclj3rs7no68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqgqvtwyxclj3rs7no68.png" alt="In the terminal, run  raw `npm init -y` endraw  to initialized a NodeJS project" width="737" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can install some dependencies for this project. &lt;/p&gt;

&lt;p&gt;For this project, you'll need the following dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/@octokit/core" rel="noopener noreferrer"&gt;@octokit/core&lt;/a&gt; - For accessing the GitHub API&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt; - For loading environment variables (such as a GitHub Personal Access Token) and keeping them secret when you push to the repository&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/nodemon" rel="noopener noreferrer"&gt;nodemon&lt;/a&gt; (optional) - For automatically restarting the node application when files are changed. I like to use this for quick and easy testing/debugging so I don't have to stop and start the server every time I change a file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the following line in your terminal to install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;octokit&lt;/span&gt;&lt;span class="sr"&gt;/core dotenv nodemo&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;package.json&lt;/code&gt; file should be updated with the dependencies you just installed. We'll come back to this in a bit to update the &lt;code&gt;scripts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foloq6wx4y6obxgumh2mx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foloq6wx4y6obxgumh2mx.png" alt="In package.json, you can see the dependencies added" width="734" height="460"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We'll also be using &lt;code&gt;fs&lt;/code&gt; for file system access, but that's already integrated with Node.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set up the file that holds the text to update all the README files
&lt;/h3&gt;

&lt;p&gt;Now you'll create the file that holds the text that will replace all the old text in the README files. This is the dynamic content, such as my "Other Projects" section of my README template. &lt;/p&gt;

&lt;p&gt;When creating this file, make sure there is some part that is easily distinguishable from the rest. This is so that in the main script, you can easily look for where the new content should be placed. You could add comments, such as &lt;code&gt;&amp;lt;!-- start dynamic content here --&amp;gt;&lt;/code&gt;, but I chose to go by the heading instead. There is no other "Other Projects" heading in the file.&lt;/p&gt;

&lt;p&gt;I've created a new file named &lt;code&gt;projects.md&lt;/code&gt; and pasted in the content that will replace the old content in the README files. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61nurrmh44u54aoa7nue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61nurrmh44u54aoa7nue.png" alt="Side by side comparison of the projects.md and README template file" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;projects.md&lt;/code&gt; file on the left is just the "Other Projects" section from my README template file on the right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Write a script to access the GitHub API and update the README file in all repos
&lt;/h3&gt;

&lt;p&gt;Now comes the meat and potatoes of the project. This is the script that will do all the work in finding the README file in all your repositories, updating the README file with the content from the &lt;code&gt;projects.md&lt;/code&gt; file, and pushing the new file and its changes to the repository. If you're looking to do something else with this project, be sure to read the &lt;a href="https://docs.github.com/en/rest/guides/getting-started-with-the-rest-api" rel="noopener noreferrer"&gt;GitHub API documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For anything interesting, we need a Personal Access Token when making requests to the GitHub API. Follow these instructions to get your own &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" rel="noopener noreferrer"&gt;Personal Access Token&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you've got the Personal Access Token, save it in a &lt;code&gt;.env&lt;/code&gt; file in the root of your project folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dan3k4st6qsu2ltery2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dan3k4st6qsu2ltery2.png" alt="Add your GitHub Personal Access Token to a .env file" width="800" height="703"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, create a file named &lt;code&gt;index.js&lt;/code&gt;. We'll need the &lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;dotenv&lt;/code&gt;, and &lt;code&gt;octokit&lt;/code&gt; packages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t22g3hv414an7u5via2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t22g3hv414an7u5via2.png" alt="Working on index.js" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we have to set up the &lt;code&gt;octokit&lt;/code&gt; client with our Personal Access Token to access our repos and files. For more information about setting up &lt;code&gt;octokit&lt;/code&gt;, take a look at &lt;a href="https://github.com/octokit/octokit.js" rel="noopener noreferrer"&gt;their documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F313zp4u5952v7q96iyl2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F313zp4u5952v7q96iyl2.png" alt="Adding octokit client to index.js" width="800" height="229"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The rest of the file is made up of asynchronous functions that will&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find all your repos&lt;/li&gt;
&lt;li&gt;Access the current README file (or create one if it doesn't exist)&lt;/li&gt;
&lt;li&gt;Commit the updated/new README file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Find All Your Repos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This part of the script uses the &lt;a href="https://docs.github.com/en/rest/reference/repos#list-repositories-for-a-user" rel="noopener noreferrer"&gt;"List repositories for a user" endpoint&lt;/a&gt; of the GitHub API. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6hlw6y40bq9ywvloukl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6hlw6y40bq9ywvloukl.png" alt="Asynchronous function to find all repositories and update the README file in each" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On &lt;code&gt;line 5&lt;/code&gt;, note that if you have more than 100 repositories, you'll have to modify the code a bit to cover all your repositories, since the max per page is 100.&lt;/p&gt;

&lt;p&gt;On &lt;code&gt;line 7&lt;/code&gt;, I take the extra step of filtering out certain repos that I don't want to be updated, including the README file for my GitHub profile and the project itself.&lt;/p&gt;

&lt;p&gt;Then, on &lt;code&gt;lines 8-10&lt;/code&gt; a simple for loop goes through each repo to find and access the README file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access the Current README file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This part of the script uses the &lt;a href="https://docs.github.com/en/rest/reference/repos#get-repository-content" rel="noopener noreferrer"&gt;"Get repository content" endpoint&lt;/a&gt; of the GitHub API. There are two other endpoints for specifically getting the README file of a directory, but for some reason, I couldn't get those to work. This one was the only one that would successfully retrieve the file (if it existed).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuojtu7gi0f010hahkt5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuojtu7gi0f010hahkt5i.png" alt="Asynchronous function to handle updating the README in the given repo" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On &lt;code&gt;line 3&lt;/code&gt; is where the actual request is being made.&lt;/p&gt;

&lt;p&gt;The data looks something like this 🤯:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxscxiso9mr72ks4zkc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxscxiso9mr72ks4zkc2.png" alt="Using the GitHub API, we can get the data for the README file in a repo as shown here" width="800" height="1366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what we're most interested in are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;path&lt;/code&gt; - the file name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sha&lt;/code&gt; - the id for the latest commit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content&lt;/code&gt; - the actual content of the README file in &lt;code&gt;base64&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encoding&lt;/code&gt; - the encoding for the file content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So on &lt;code&gt;line 4&lt;/code&gt;, there is some destructuring to isolate those pieces of information.&lt;/p&gt;

&lt;p&gt;The lines that follow are for converting the file contents from &lt;code&gt;base64&lt;/code&gt; to a String. Then, it finds the index for the "Other Projects" section heading (remember when I said to make it something easily distinguishable?). With this index, we can use &lt;code&gt;.slice()&lt;/code&gt; to only take the first part of the content and concatenate the new content from the &lt;code&gt;projects.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;There is a helper function to easily get the new content using the &lt;code&gt;fs&lt;/code&gt; package:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mq2fyi01knimcp0kqnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mq2fyi01knimcp0kqnd.png" alt="Helper function to get the contents of the projects.md file, which is used to update each README file" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the README file doesn't exist, it will just create a new one with the content from &lt;code&gt;projects.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit the updated/new README file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, the updated/new README file will be committed to their respective repos. This is where the &lt;code&gt;sha&lt;/code&gt; in the previous code segment comes in handy, so that it can replace the newest commit.&lt;/p&gt;

&lt;p&gt;This part of the script uses the &lt;a href="https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents" rel="noopener noreferrer"&gt;"Create or update file contents" endpoint&lt;/a&gt; of the GitHub API. Using information generated in the previous code segment, it will make a &lt;code&gt;PUT&lt;/code&gt; request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprvrqqzfyjl7xpy9iovm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprvrqqzfyjl7xpy9iovm.png" alt="Asynchronous function to handle committing the updated README file to the repo" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The final script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final script should look like the code below. Remember that we've only defined functions right now. We need to actually call the main function, &lt;code&gt;updateAllRepos()&lt;/code&gt;, so all that work will actually run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75kfryo38l2kkbxna8nf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75kfryo38l2kkbxna8nf.png" alt="Final version of index.js" width="800" height="1049"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running/Testing the script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that we've got the script set up, you can test it yourself by running &lt;code&gt;index.js&lt;/code&gt; with &lt;code&gt;node&lt;/code&gt; (or &lt;code&gt;nodemon&lt;/code&gt;, if it was installed).&lt;/p&gt;

&lt;p&gt;Back in the &lt;code&gt;package.json&lt;/code&gt; file, add the following to the &lt;code&gt;scripts&lt;/code&gt; section:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr97ev7m7q9i7toxmody0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr97ev7m7q9i7toxmody0.png" alt="Adding scripts to package.json" width="800" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Set up the GitHub Action in a YAML file
&lt;/h3&gt;

&lt;p&gt;Now that we've got the main script set up, we can work on setting up the actual GitHub Action. GitHub Actions are &lt;strong&gt;workflows&lt;/strong&gt; made of &lt;strong&gt;event(s)&lt;/strong&gt; that trigger &lt;strong&gt;job(s)&lt;/strong&gt;. For this GitHub Action, we ultimately want to run the script we just created whenever the &lt;code&gt;projects.md&lt;/code&gt; file is updated and pushed to the repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f7fkfk787jdc358ifns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f7fkfk787jdc358ifns.png" alt="Basic GitHub Action workflow" width="212" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the root of your project directory, create a folder called &lt;code&gt;.github&lt;/code&gt;, and in that folder, create another folder called &lt;code&gt;workflows&lt;/code&gt;. In the &lt;code&gt;workflows&lt;/code&gt; folder, create a file called &lt;code&gt;action.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60psf1ksy0irrejsee1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60psf1ksy0irrejsee1t.png" alt="Directory structure for the GitHub Action" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This action can be broken down to the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;event&lt;/strong&gt; will be a &lt;code&gt;push&lt;/code&gt; to the repository, specifically for the &lt;code&gt;projects.md&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;The main &lt;strong&gt;job&lt;/strong&gt; is to run the &lt;code&gt;index.js&lt;/code&gt; script, which is further broken down to the following steps:

&lt;ul&gt;
&lt;li&gt;Check out the repo&lt;/li&gt;
&lt;li&gt;Set up a Node.js environment&lt;/li&gt;
&lt;li&gt;Install the dependencies&lt;/li&gt;
&lt;li&gt;Run the script&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In the &lt;code&gt;action.yaml&lt;/code&gt; file, this translates to the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh98ylfars1mr0iryrkco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh98ylfars1mr0iryrkco.png" alt="GitHub Action code for running index.js when the projects.md file is pushed to the repo" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll notice on &lt;code&gt;lines 20-21&lt;/code&gt; that we're setting an environment variable called &lt;code&gt;GH_TOKEN&lt;/code&gt;, like we did in the &lt;code&gt;.env&lt;/code&gt; file. In order for the script to have access to the &lt;code&gt;GH_TOKEN&lt;/code&gt; while being run by the action, you need to set a repository secret. &lt;a href="https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository" rel="noopener noreferrer"&gt;Follow these instructions&lt;/a&gt; to set a secret for your repository. &lt;/p&gt;

&lt;p&gt;You can set any number of environment variables and secrets, and access them the same way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Set up a GitHub repository for where the GitHub Action should live
&lt;/h3&gt;

&lt;p&gt;Now that we've got all our files set up, we can push all our code to GitHub and get the GitHub Action up and running.&lt;/p&gt;

&lt;p&gt;First, set up a GitHub repository to house this project and the GitHub Action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajg2rgraakbmyh75ja3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajg2rgraakbmyh75ja3h.png" alt="Setting up a repo on GitHub for the project" width="800" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, follow the instructions for "...or push an existing repository from the command line" to connect to your local work environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu9o3b1mu89ie7gizjxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu9o3b1mu89ie7gizjxg.png" alt="Follow instructions for connecting your local environment to the repo just created" width="800" height="822"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Don't forget to set up a &lt;code&gt;.gitignore&lt;/code&gt; file to ignore the &lt;code&gt;node_modules&lt;/code&gt; folder and &lt;code&gt;.env&lt;/code&gt; file that contains your Personal Access Token.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9fszo7kjwguw25uco2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9fszo7kjwguw25uco2b.png" alt="Set up .gitignore file" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything worked out smoothly, you should see your code in the repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbsxdqp8x67yx9pikcyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbsxdqp8x67yx9pikcyt.png" alt="Commit all the code we've done to the repo" width="800" height="613"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If you go to the "Actions" tab, you might not see anything yet since it's the initial commit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbhsfod2tc29w673ba73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbhsfod2tc29w673ba73.png" alt="Initially, the Actions tab in the repo might be empty because of the initial commit" width="800" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, once you make some changes to &lt;code&gt;projects.md&lt;/code&gt; and push the changes to the repository, it should run the action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl42l2m53x8q763odx68k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl42l2m53x8q763odx68k.png" alt="Actions tab seeing some action after projects.md is committed with changes" width="800" height="445"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;And once the action is completed, you should see your README files updated, like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3f7qhe5g54bbxgemr5uc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3f7qhe5g54bbxgemr5uc.png" alt="Changes seen in the README file for one of my older repos" width="800" height="823"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;And that's it! Now you have a single file that can be used to update a bajillion other files! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2523v00rvyh4ic51msgf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2523v00rvyh4ic51msgf.gif" alt="Silly Ton Ton gif" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you learned as much as I did about GitHub Actions. It makes me curious about a whole bunch of other automations I could create, like the one that autogenerates the GitHub Profile README. &lt;/p&gt;

&lt;p&gt;If you have any questions or need some help, please feel free to reach out. &lt;/p&gt;

&lt;p&gt;Happy coding~ ✨&lt;/p&gt;




&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;💖 Geraldine | Say hi on Twitter 👋🏾 &lt;a href="https://twitter.com/geraldinedesu" rel="noopener noreferrer"&gt;@geraldinedesu&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78xt1423abv9bjasd9h4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78xt1423abv9bjasd9h4.gif" alt="It's feng shui" width="398" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was put together as if rearranging furniture. I had to move around the different pieces to make sure the step-by-step instructions were logical and easy to follow.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://media2.giphy.com/media/gM0piFxf9AMVy/giphy.gif" rel="noopener noreferrer"&gt;Giphy&lt;/a&gt;&lt;/p&gt;

</description>
      <category>actionshackathon21</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>github</category>
    </item>
  </channel>
</rss>
