<?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: Josh Soref</title>
    <description>The latest articles on DEV Community by Josh Soref (@jsoref).</description>
    <link>https://dev.to/jsoref</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%2F754839%2F5b7391b1-ad82-46cc-8b54-31f3a4e4293a.png</url>
      <title>DEV Community: Josh Soref</title>
      <link>https://dev.to/jsoref</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsoref"/>
    <language>en</language>
    <item>
      <title>Add check-spelling to a repository</title>
      <dc:creator>Josh Soref</dc:creator>
      <pubDate>Fri, 03 Dec 2021 01:47:14 +0000</pubDate>
      <link>https://dev.to/jsoref/add-check-spelling-to-a-repository-4n66</link>
      <guid>https://dev.to/jsoref/add-check-spelling-to-a-repository-4n66</guid>
      <description>&lt;p&gt;Everyone wonders why I care about spelling. Sometimes the rewards are 🍺:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This typo is epic, you just made my day! 🤣 &lt;/p&gt;

&lt;p&gt;I never would've imagined that a MR with hundreds of typo fixes would have any real impact, but you made it happen.  It turns out the EDNS keepalive module didn't work because of this typo (and no one noticed...) And you fixed it, thank you!&lt;/p&gt;

&lt;p&gt;We owe you a beer! 🍻&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted by @tomaskrizek in &lt;a href="https://github.com/CZ-NIC/knot-resolver/pull/75#discussion_r752569877"&gt;https://github.com/CZ-NIC/knot-resolver/pull/75#discussion_r752569877&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sadly, the spell checker shows that there just aren't enough 👀 (&lt;a href="https://quotepark.com/quotes/1728076-eric-s-raymond-given-enough-eyeballs-all-bugs-are-shallow/"&gt;"Given enough eyeballs, all bugs are shallow."&lt;/a&gt;):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh wow!  This is a lesser used portion of the Chocolatey application, but I would have still expected for this to have been caught before now.  This change makes sense to me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted by &lt;a class="mentioned-user" href="https://dev.to/gep13"&gt;@gep13&lt;/a&gt;
 in &lt;a href="https://github.com/chocolatey/choco/pull/2466#discussion_r755506047"&gt;https://github.com/chocolatey/choco/pull/2466#discussion_r755506047&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/check-spelling/spell-check-this/blob/main/.github/workflows/spelling.yml"&gt;https://github.com/check-spelling/spell-check-this/blob/main/.github/workflows/spelling.yml&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow is built around &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/check-spelling"&gt;
        check-spelling
      &lt;/a&gt; / &lt;a href="https://github.com/check-spelling/check-spelling"&gt;
        check-spelling
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Spelling checker action
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
@check-spelling/check-spelling GitHub Action&lt;/h1&gt;
&lt;h2&gt;
Overview&lt;/h2&gt;
&lt;p&gt;Everyone makes typos. This includes people writing documentation and comments
but it also includes programmers naming variables, functions, apis, classes
and filenames.&lt;/p&gt;
&lt;p&gt;Often, programmers will use &lt;code&gt;InitialCapitalization&lt;/code&gt;, &lt;code&gt;camelCase&lt;/code&gt;
&lt;code&gt;ALL_CAPS&lt;/code&gt;, or &lt;code&gt;IDLCase&lt;/code&gt; when naming their things. When they do this, it makes
it much harder for naive spelling tools to recognize misspellings, and as such,
with a really high false-positive rate, people don't tend to enable spellchecking
at all.&lt;/p&gt;
&lt;p&gt;This repository's tools are capable of tolerating all of those variations.
Specifically, &lt;a href="https://github.com/jsoref/spelling/blob/master/w"&gt;w&lt;/a&gt; understands
enough about how programmers name things that it can split the above conventions
into word-like things for checking against a dictionary.&lt;/p&gt;
&lt;h2&gt;
Spell Checker GitHub Actions&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/check-spelling/check-spelling/actions?query=workflow:%22Spell+checking%22+branch:main+event:push"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Yd5dmeFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/check-spelling/check-spelling/workflows/Spell%2520checking/badge.svg%3Fbranch%3Dmain%26event%3Dpush" alt="Spell checking"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/check-spelling/check-spelling#basic-configuration"&gt;Basic Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/check-spelling/check-spelling/wiki/"&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/check-spelling/check-spelling/wiki/Possible-features"&gt;Possible features&lt;/a&gt;
are listed on the &lt;a href="https://github.com/check-spelling/check-spelling/wiki/"&gt;Wiki&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/check-spelling/check-spelling/wiki/Warnings"&gt;Warning descriptions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/check-spelling/check-spelling/wiki/Configuration"&gt;Configuration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/check-spelling/check-spelling/wiki/Configuration#workflow-variables"&gt;Workflow variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/check-spelling/check-spelling/wiki/Configuration:-Workflows"&gt;Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/check-spelling/check-spelling/wiki/Configuration#Files"&gt;Files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jsoref/spelling#overview"&gt;Historical information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Sample output&lt;/h3&gt;
&lt;h4&gt;
Comment as seen in a PR&lt;/h4&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/check-spelling/check-spellingimages/check-spelling-comment.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1NvJPWlV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/check-spelling/check-spellingimages/check-spelling-comment.png" alt="github action comment"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
Comment as seen in a commit&lt;/h4&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/check-spelling/check-spellingimages/check-spelling-annotation.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cyOb5iqW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/check-spelling/check-spellingimages/check-spelling-annotation.png" alt="github action annotation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
GitHub Action&lt;/h4&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/check-spelling/check-spelling"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
 &lt;a href="https://github.com/marketplace/actions/check-spelling"&gt;Marketplace Actions Check spelling&lt;br&gt;
&lt;/a&gt;
&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;
&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/check-spelling/spell-check-this/blob/main/.github/workflows/spelling.yml"&gt;workflow&lt;/a&gt; has a couple of interesting pieces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It can check both a push and a pull request.&lt;/li&gt;
&lt;li&gt;If there's an existing pull request, the action will skip checking the push to save computing resources.&lt;/li&gt;
&lt;li&gt;Permissions are reduced during the check phase for security reasons.&lt;/li&gt;
&lt;li&gt;It's possible to only check changed files.&lt;/li&gt;
&lt;li&gt;The action generates outputs which enables one to consume them in ways I couldn't otherwise imagine.&lt;/li&gt;
&lt;li&gt;There's a separate comment phase as commenting requires additional permissions. (This is the default way that the workflow consumes the action's outputs and then sends them back to the action.)&lt;/li&gt;
&lt;li&gt;It's possible to ask the workflow to update its own metadata.&lt;/li&gt;
&lt;li&gt;When it updates the metadata, it collapses its original comment and your note to update the metadata.&lt;/li&gt;
&lt;li&gt;I recently added a note as part of this last phase linking users to a file they can edit in order to trigger a new validation pass.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Journey
&lt;/h3&gt;

&lt;p&gt;I've been working on this tool for a while.&lt;/p&gt;

&lt;p&gt;You can use it just for your documentation (as PowerDNS does), or you can use it for your entire project.&lt;/p&gt;

&lt;p&gt;In the second half of this year, I've significantly improved its performance (it wasn't bad for small to medium repositories, but it wasn't good enough for giant ones, it's now doing reasonably well there), including allowing concurrency at the process level and via matrix runs.&lt;/p&gt;

&lt;p&gt;I've also been adding additional heuristics, such as recognizing when a file really isn't worth checking -- often it will identify translation files and binaries as things to skip. I ran across a couple of projects with source code files that were &amp;gt;10 MB, so there's logic to skip such files by default (you can tune the threshold).&lt;/p&gt;

&lt;p&gt;There are now heuristics to identify supplemental dictionaries one could use to reduce the size of the in-repository metadata. (The heuristics run if there are unrecognized terms, but you can turn them off if you don't want them.)&lt;/p&gt;

&lt;p&gt;I'm slowly working on adjusting the action so that it could check other languages (hopefully next year).&lt;/p&gt;

&lt;p&gt;I regularly feed projects to the template and am growing a list of &lt;a href="https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns"&gt;pattern templates&lt;/a&gt; to make it easy for projects to trim out noise.&lt;/p&gt;

&lt;p&gt;For medium-sized projects, the tool will regularly find bugs, whether it's a broken public API or a test that isn't testing what it thought it was testing. These are all normal occurrences. Consistent spelling helps projects avoid such pitfalls.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Auto-detecting dictionary words
&lt;/h4&gt;

&lt;p&gt;Because the workflow is customizable, I'm playing with instance-specific customizations such as &lt;a href="https://github.com/ohmyzsh/ohmyzsh/commit/733ac0a85b56d57516355d4c39a031291beb7d5e"&gt;this one&lt;/a&gt; for &lt;a href="https://github.com/ohmyzsh/ohmyzsh"&gt;ohmyzsh/ohmyzsh&lt;/a&gt;. As ohmyzsh is built around aliases for zsh, this additional commit would automatically recognize aliases before the spell checker runs and add them to the dictionary. This means that if the alias is used in the documentation (and hopefully it is!), it'll be automatically accepted as a word, and when someone misspells an alias, that misspelling will stick out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ohmyzsh/ohmyzsh/blob/e6657a8b5524c0a4893bd6bcbf9cf0234a07e155/.github/workflows/spelling.yml#L33-L40"&gt;https://github.com/ohmyzsh/ohmyzsh/blob/e6657a8b5524c0a4893bd6bcbf9cf0234a07e155/.github/workflows/spelling.yml#L33-L40&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;find aliases&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;for a in $(git ls-files|grep '\.zsh$'); do&lt;/span&gt;
          &lt;span class="s"&gt;echo "-- $a"&lt;/span&gt;
          &lt;span class="s"&gt;if [ -s "$a" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;perl -ne 'next unless s/^alias ([A-Za-z]{3,})=.*/$1/;print' "$a" | tee -a .github/actions/spelling/allow.txt&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
        &lt;span class="s"&gt;done;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This logic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Looks for &lt;code&gt;.zsh&lt;/code&gt; script files.&lt;/li&gt;
&lt;li&gt;Reports the name of the file from which it's going to be getting terms.&lt;/li&gt;
&lt;li&gt;Ensures there's a file with content (there's currently a &lt;a href="https://github.com/nektos/act/issues/912"&gt;quirk&lt;/a&gt; in &lt;code&gt;act&lt;/code&gt; where a file tracked by git that matches &lt;code&gt;.gitignore&lt;/code&gt; will not be copied into the &lt;code&gt;act&lt;/code&gt; environment).&lt;/li&gt;
&lt;li&gt;Looks for lines that start with &lt;code&gt;alias&lt;/code&gt; and have at least 3 characters.&lt;/li&gt;
&lt;li&gt;Reports each item and adds them to the dictionary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've submitted this as &lt;a href="https://github.com/ohmyzsh/ohmyzsh/pull/10475"&gt;ohmyzsh/ohmyzsh#10475&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Neat things
&lt;/h3&gt;
&lt;h4&gt;
  
  
  GitLab via &lt;code&gt;act&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;I know at least one project that runs check-spelling using &lt;a href="https://github.com/nektos/act"&gt;nektos/act&lt;/a&gt; in &lt;a href="https://gitlab.com/"&gt;GitLab&lt;/a&gt;. Because of the support for outputs, it would be possible for the act workflow to take the outputs and wire them to an equivalent commenting GitLab mechanism.&lt;/p&gt;
&lt;h3&gt;
  
  
  Recent deployments
&lt;/h3&gt;
&lt;h4&gt;
  
  
  dev.to
&lt;/h4&gt;

&lt;p&gt;This blog is hosted by &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; which is a deployment of: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/forem"&gt;
        forem
      &lt;/a&gt; / &lt;a href="https://github.com/forem/forem"&gt;
        forem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For empowering community 🌱
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;br&gt;
  &lt;h1&gt;
Forem 🌱
&lt;/h1&gt;
  &lt;strong&gt;For Empowering Community&lt;/strong&gt;
&lt;/div&gt;



&lt;p&gt;
  &lt;a href="https://travis-ci.com/forem/forem" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/38a2899a4c13fbce6221d2fb9d4b81b4366e7e6515a2afcd0b7b25ae9a6af7b0/68747470733a2f2f7472617669732d63692e636f6d2f666f72656d2f666f72656d2e7376673f6272616e63683d6d61696e" alt="Travis Status for forem/forem"&gt;
  &lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/64b9f7c7c5f41ec22113b61235256435cd61779a0554b0595b88b6011f94c60b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d"&gt;&lt;img src="https://camo.githubusercontent.com/64b9f7c7c5f41ec22113b61235256435cd61779a0554b0595b88b6011f94c60b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d" alt="GitHub commit activity"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/issues?q=is%3Aissue+is%3Aopen+label%3A%22ready+for+dev%22"&gt;
    &lt;img src="https://camo.githubusercontent.com/52c57e03799f9e9d02e90651d5eb43cb30ef547ba0023e2835ff1aaf752a3878/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f666f72656d2f666f72656d2f726561647920666f7220646576" alt="GitHub issues ready for dev"&gt;
  &lt;/a&gt;
  &lt;a href="https://gitpod.io/from-referrer/" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/63c6e800af1de7d75c99e61d64a1f1dd1972471f778b4290c98886f35ee4170c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73657475702d6175746f6d617465642d626c75653f6c6f676f3d676974706f64" alt="GitPod badge"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;a href="https://forem.com" rel="nofollow"&gt;Forem&lt;/a&gt; codebase, the platform that powers
&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt;. We are so excited to have you. With your help, we can
build out Forem’s usability, scalability, and stability to better serve our
communities.&lt;/p&gt;
&lt;h2&gt;
What is Forem?&lt;/h2&gt;
&lt;p&gt;Forem is open source software for building communities. Communities for your
peers, customers, fanbases, families, friends, and any other time and space
where people need to come together to be part of a collective
&lt;a href="https://dev.to/devteam/for-empowering-community-2k6h" rel="nofollow"&gt;See our announcement post&lt;/a&gt;
for a high-level overview of what Forem is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt; (or just DEV) is hosted by Forem. It is a community of
software developers who write articles, take part in discussions, and build
their professional profiles. We value supportive and constructive dialogue in
the pursuit of great code and career growth for all members. The ecosystem spans
from beginner to advanced developers, and all are welcome to find their place…&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/forem/forem"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;So, I set up a deployment of check-spelling for forem: &lt;a href="https://github.com/check-spelling/forem/actions"&gt;https://github.com/check-spelling/forem/actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It doesn't take much work to convert the output into a list of words to correct (I use &lt;a href="https://sheets.google.com"&gt;Google Sheets&lt;/a&gt; to generate corrections):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks for all the work in this PR &lt;a class="mentioned-user" href="https://dev.to/jsoref"&gt;@jsoref&lt;/a&gt;
! Since this is quite a big PR, could you maybe break it down into smaller ones? I'd really like to get some things that are actual bugs (like this one) out faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Originally posted by &lt;a class="mentioned-user" href="https://dev.to/citizen428"&gt;@citizen428&lt;/a&gt;
 in &lt;a href="https://github.com/forem/forem/pull/15670#discussion_r762683014"&gt;https://github.com/forem/forem/pull/15670#discussion_r762683014&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/jsoref"&gt;@jsoref&lt;/a&gt;
 The most important one to me would be everything that is &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;actual code, not a comment (&lt;code&gt;currrentTime&lt;/code&gt;, &lt;code&gt;onkeykup&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;not in a migration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once we have that out of the way we can think about how to slice and dice the rest.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Originally posted by &lt;a class="mentioned-user" href="https://dev.to/citizen428"&gt;@citizen428&lt;/a&gt;
 in &lt;a href="https://github.com/forem/forem/pull/15670#discussion_r762689579"&gt;https://github.com/forem/forem/pull/15670#discussion_r762689579&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was quickly merged. I've now updated the remainder and split it into two more pieces...&lt;/p&gt;

&lt;h4&gt;
  
  
  microsoft/PowerToys
&lt;/h4&gt;

&lt;p&gt;I got a ping about some items that weren't being matched in &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://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/microsoft"&gt;
        microsoft
      &lt;/a&gt; / &lt;a href="https://github.com/microsoft/PowerToys"&gt;
        PowerToys
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Windows system utilities to maximize productivity
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Microsoft PowerToys&lt;/h1&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/microsoft/PowerToysdoc/images/overview/PT_hero_image.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OK8M0meS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/microsoft/PowerToysdoc/images/overview/PT_hero_image.png" alt="Hero image for Microsoft PowerToys"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/powertoys-docs" rel="nofollow"&gt;How to use PowerToys&lt;/a&gt; | &lt;a href="https://aka.ms/installPowerToys" rel="nofollow"&gt;Downloads &amp;amp; Release notes&lt;/a&gt; | &lt;a href="https://github.com/microsoft/PowerToys#contributing"&gt;Contributing to PowerToys&lt;/a&gt; | &lt;a href="https://github.com/microsoft/PowerToys#whats-happening"&gt;What's Happening&lt;/a&gt; | &lt;a href="https://github.com/microsoft/PowerToys#powertoys-roadmap"&gt;Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Build status&lt;/h2&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;Main&lt;/th&gt;
&lt;th&gt;Installer (Stable)&lt;/th&gt;
&lt;th&gt;Installer (Main)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x64&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.azure.com/ms/PowerToys/_build/latest?definitionId=219&amp;amp;branchName=main" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3bc2eef170ecf3a047d8362eda266cca12fd43b2e626009ab2e5de07bb8c5752/68747470733a2f2f6465762e617a7572652e636f6d2f6d732f506f776572546f79732f5f617069732f6275696c642f7374617475732f6d6963726f736f66742e506f776572546f79733f6272616e63684e616d653d6d61696e" alt="Build Status for Main"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.azure.com/ms/PowerToys/_build/latest?definitionId=219&amp;amp;branchName=stable" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/b81973ce7abf20961d29655984d8fd0007396cd7d8e46b7f331a54066c37abcb/68747470733a2f2f6465762e617a7572652e636f6d2f6d732f506f776572546f79732f5f617069732f6275696c642f7374617475732f6d6963726f736f66742e506f776572546f79733f6272616e63684e616d653d737461626c65" alt="Build Status for Stable"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github-private.visualstudio.com/microsoft/_build/latest?definitionId=61&amp;amp;branchName=main" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5a303c5c864366a14b00f287ef49fd7ef5bfd95c948f6615bc2bd692c900e1bf/68747470733a2f2f6769746875622d707269766174652e76697375616c73747564696f2e636f6d2f6d6963726f736f66742f5f617069732f6275696c642f7374617475732f434450582f706f776572746f79732f706f776572746f79732d57696e646f77732d4f6666696369616c2d6d61737465722d546573743f6272616e63684e616d653d6d61696e" alt="Build Status for Installer"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARM64&lt;/td&gt;
&lt;td&gt;Currently investigating&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/microsoft/PowerToys/issues/490"&gt;Issue #490&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
About&lt;/h2&gt;
&lt;p&gt;Microsoft PowerToys is a set of utilities for power users to tune and streamline their Windows experience for greater productivity. For more info on &lt;a href="https://aka.ms/powertoys-docs" rel="nofollow"&gt;PowerToys overviews and how to use the utilities&lt;/a&gt;, or any other tools and resources for &lt;a href="https://docs.microsoft.com/windows/dev-environment/overview" rel="nofollow"&gt;Windows development environments&lt;/a&gt;, head over to &lt;a href="https://aka.ms/powertoys-docs" rel="nofollow"&gt;docs.microsoft.com&lt;/a&gt;!&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Current utilities:&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_Awake" rel="nofollow"&gt;PowerToys Awake&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_ColorPicker" rel="nofollow"&gt;Color Picker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_FancyZones" rel="nofollow"&gt;FancyZones&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_FileExplorerAddOns" rel="nofollow"&gt;File Explorer Add-ons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_ImageResizer" rel="nofollow"&gt;Image Resizer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_KeyboardManager" rel="nofollow"&gt;Keyboard Manager&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_MouseUtilities" rel="nofollow"&gt;Mouse utilities&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_PowerRename" rel="nofollow"&gt;PowerRename&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_PowerToysRun" rel="nofollow"&gt;PowerToys Run&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_ShortcutGuide" rel="nofollow"&gt;Shortcut Guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aka.ms/PowerToysOverview_VideoConference" rel="nofollow"&gt;Video Conference Mute&lt;/a&gt;&lt;/td&gt;

&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
Installing and running Microsoft PowerToys&lt;/h2&gt;
&lt;h3&gt;
Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 or Windows 10 v1903 (18362) or newer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-desktop-3.1.20-windows-x64-installer" rel="nofollow"&gt;.NET Core 3.1.20 Desktop Runtime&lt;/a&gt; or a newer 3.1.x runtime. The installer will handle this if not present.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Via GitHub with EXE [Recommended]&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://aka.ms/installPowerToys" rel="nofollow"&gt;Microsoft PowerToys GitHub releases&lt;/a&gt;…&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/microsoft/PowerToys"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;So, I made a &lt;a href="https://github.com/microsoft/PowerToys/pull/14873"&gt;quick update&lt;/a&gt; for it.&lt;/p&gt;

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

&lt;p&gt;There are a number of deployments including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft/&lt;a href="https://github.com/microsoft/terminal/"&gt;terminal&lt;/a&gt;, &lt;a href="https://github.com/microsoft/powertoys"&gt;powertoys&lt;/a&gt;, &lt;a href="https://github.com/microsoft/winget-cli"&gt;winget-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/powerdns/pdns/"&gt;PowerDNS/pdns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nasa/fprime"&gt;NASA/fprime (F')&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>actionshackathon21</category>
    </item>
  </channel>
</rss>
