<?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: 802.11 Savage</title>
    <description>The latest articles on DEV Community by 802.11 Savage (@hipstersmoothie).</description>
    <link>https://dev.to/hipstersmoothie</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%2F290856%2F47a43e76-7d65-4e1b-8dd4-10c9d33e3e29.jpg</url>
      <title>DEV Community: 802.11 Savage</title>
      <link>https://dev.to/hipstersmoothie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hipstersmoothie"/>
    <language>en</language>
    <item>
      <title>Removing Background Noise from Pre-recorded Audio</title>
      <dc:creator>802.11 Savage</dc:creator>
      <pubDate>Sun, 23 May 2021 19:39:05 +0000</pubDate>
      <link>https://dev.to/hipstersmoothie/removing-background-noise-from-pre-recorded-audio-2g6i</link>
      <guid>https://dev.to/hipstersmoothie/removing-background-noise-from-pre-recorded-audio-2g6i</guid>
      <description>&lt;p&gt;So you recorded your podcast and everything went great! You open up your recorded files and notice some pretty nasty background noise. You have a few options on removing this noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use some noise gates to get rid of it =&amp;gt; Wont be able to remove everything, especially noises mixed with the voice&lt;/li&gt;
&lt;li&gt;Manually edit it out =&amp;gt; still doesn't work with mixed audio&lt;/li&gt;
&lt;li&gt;cry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are tools that work &lt;em&gt;while&lt;/em&gt; recording (such as &lt;a href="https://krisp.ai" rel="noopener noreferrer"&gt;krisp.ai&lt;/a&gt;) but not once you have a recording.&lt;/p&gt;

&lt;p&gt;...unless you use some audio wizard!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Download &lt;a href="https://rogueamoeba.com/loopback/" rel="noopener noreferrer"&gt;Loopback&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;From Loopback's website:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With the power of Loopback, it's easy to pass audio from one application to another. Loopback can combine audio from both application sources and audio input devices, then make it available anywhere on your Mac.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So using this app we will be able to send audio from one application (whatever is playing your video) as an input to another application (krisp.ai to remove the background noise)&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Download &lt;a href="https://krisp.ai" rel="noopener noreferrer"&gt;krisp.ai&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This app will enable use to us AI to remove the background noise from your audio&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Set up Virtual Capture Device
&lt;/h2&gt;

&lt;p&gt;Once you have loopback installed we will need to set up a virtual device. This will make the &lt;code&gt;Descript Audio&lt;/code&gt; virtual device available to other applications.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqir5m3y0d25ogmwm7uos.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqir5m3y0d25ogmwm7uos.png" alt="Routing audio from Descript into a Loopback virtual device"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Set krisp.ai's Input to &lt;code&gt;Descript Audio&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Now set krisp.ai to use our virtual device as its input. This will enable krisp to remove the audio from the other app once we start recording. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure the switch the &lt;code&gt;Remove Noise&lt;/code&gt; option on.&lt;/p&gt;
&lt;/blockquote&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jbtgubnwwa1nm0mdqwv.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jbtgubnwwa1nm0mdqwv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use QuickTime for Capture
&lt;/h2&gt;

&lt;p&gt;Now that we have our audio routing set up all that's left to do is actually capture it!&lt;/p&gt;

&lt;p&gt;Open QuickTime and start a new audio recording (&lt;code&gt;File =&amp;gt; New Audio Recording&lt;/code&gt;).' Then using the dropdown select &lt;code&gt;krisp microphone&lt;/code&gt; as the capture device.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeprqxvnfcqn3ddn5ooe.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeprqxvnfcqn3ddn5ooe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Start Capture
&lt;/h2&gt;

&lt;p&gt;Now all you have to do it hit the &lt;code&gt;Record&lt;/code&gt; button in QuickTime and start playing you audio in whatever application you are capturing. While this is happening you won't hear anything come out of your speakers because QuickTime is capturing it. &lt;/p&gt;

&lt;p&gt;Wait until your video is done and stop recording. You know have you audio with all the background noise removed! 🎉&lt;/p&gt;

</description>
      <category>audio</category>
      <category>video</category>
      <category>podcast</category>
    </item>
    <item>
      <title>JavaScript Monorepo Tooling</title>
      <dc:creator>802.11 Savage</dc:creator>
      <pubDate>Sun, 14 Feb 2021 04:16:57 +0000</pubDate>
      <link>https://dev.to/hipstersmoothie/javascript-monorepo-tooling-48b9</link>
      <guid>https://dev.to/hipstersmoothie/javascript-monorepo-tooling-48b9</guid>
      <description>&lt;h1&gt;
  
  
  JavaScript Monorepo Tooling
&lt;/h1&gt;

&lt;p&gt;JavaScript monorepo tooling has come a long way. The landscape is vast and filled with varying tools that attempt to solve different parts of the tool chain. Many times while discussing what tools do what I see lots of confusion. This article attempts to summarize a some popular tools and their approach to solving monorepo problems.&lt;/p&gt;

&lt;p&gt;The functionality of these tools can be organized into 3 capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;installer&lt;/code&gt; - tools that help with installing a monorepo's dependencies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task-runner&lt;/code&gt; - tools that help with running commands or scripts throughout the repo and possibly creating new packages within the repo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;publisher&lt;/code&gt; - tools that help/enforce versioning for a monorepo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some tools have multiple functions and can encompass multiple Capabilities.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;installer&lt;/th&gt;
&lt;th&gt;task-runner&lt;/th&gt;
&lt;th&gt;publisher&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lerna&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yarn v1&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm v7&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pnpm&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rush&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nx&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ultra-runner&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;turborepo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;changesets&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;auto&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Monorepo tooling is a sea of innovation right now and some best in class have emerged that enable you to build a monorepo with wonderful DX. With faster builds becoming the focus of many of these tool I'm excited to see what I can do with all my new free time 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Monorepo Structure
&lt;/h2&gt;

&lt;p&gt;Most of the tools in this article operate under the assumption that your project is structured like following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;package.json&lt;/code&gt;: &lt;code&gt;devDependencies&lt;/code&gt; and &lt;code&gt;scripts&lt;/code&gt; for the monorepo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;packages/**/package.json&lt;/code&gt;: &lt;code&gt;dependencies&lt;/code&gt;, unique &lt;code&gt;devDependencies&lt;/code&gt; and &lt;code&gt;scripts&lt;/code&gt; for the package&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The packages &lt;code&gt;package.json&lt;/code&gt;s form a dependency graph that describes how everything depends on each other. All of these tools in some way utilize the dependency graph in some way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;This is not a comprehensive list and some tools maybe left out. If you see one i've missed tell me about it &lt;a href="https://twitter.com/hipstersmoothie"&gt;on twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🐉 &lt;a href="https://github.com/lerna/lerna/"&gt;lerna&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A tool for managing JavaScript projects with multiple packages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;installer&lt;/code&gt; &lt;code&gt;task-runner&lt;/code&gt; &lt;code&gt;publisher&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;From my experience &lt;code&gt;lerna&lt;/code&gt; was the first JavaScript monorepo tool that came with all the tools needed to manage a monorepo. It paved the way for all of these other tools and is a piece of software that truly changed my life. If you want to you can just use &lt;code&gt;lerna&lt;/code&gt; and it's commands in your projects.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;installer&lt;/code&gt; =&amp;gt; &lt;code&gt;lerna bootstrap&lt;/code&gt; &lt;code&gt;lerna add&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;The first command &lt;code&gt;lerna&lt;/code&gt; comes with that most people probably attribute their &lt;code&gt;lerna&lt;/code&gt; experience to is the &lt;code&gt;bootstrap&lt;/code&gt; command. This is how it's described in the docs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Link local packages together and install remaining package dependencies&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Basically it's &lt;code&gt;npm install&lt;/code&gt; but for monorepos. While not the fastest monorepo installer it gets the job done! It also set the stage for other tool to iterate and improve.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;task-runner&lt;/code&gt; =&amp;gt;&lt;code&gt;lerna changed&lt;/code&gt; &lt;code&gt;lerna run&lt;/code&gt; &lt;code&gt;lerna exec&lt;/code&gt; &lt;code&gt;lerna create&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;All of these command in some way facilitate running the various &lt;code&gt;scripts&lt;/code&gt; in your projects. &lt;code&gt;lerna&lt;/code&gt; exposes some flags that help you run these scripts in a monorepo-aware way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lerna run --stream&lt;/code&gt;: Run a script in each package in order of the dependency graph&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lerna run --parallel&lt;/code&gt;: Run a script in all matches packages in parallel processes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lerna run --since&lt;/code&gt;: Run a script in all changed packages since a specific commit or tag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;lerna&lt;/code&gt; can also quickly scaffold a new package using &lt;code&gt;lerna create&lt;/code&gt;. Although this doesn't work off of templates, and created packages are don't conain many files.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;publisher&lt;/code&gt; =&amp;gt; &lt;code&gt;lerna version&lt;/code&gt; &lt;code&gt;lerna publish&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;In my opinion this is really where a &lt;code&gt;lerna&lt;/code&gt; really shines. Publishing in a monorepo is hard! You have many packages and lots of dependencies between them, so it's pretty hard to know what package to version and when.&lt;/p&gt;

&lt;p&gt;To solve this problem &lt;code&gt;lerna&lt;/code&gt; can publish a project in two modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;fixed&lt;/code&gt; (recommended) - All packages in the project have the same version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;independent&lt;/code&gt; - All package in the project have independent version&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In either mode &lt;code&gt;lerna&lt;/code&gt; will figure out what packages have changed, even taking into dependencies between packages, then update the &lt;code&gt;package.json&lt;/code&gt;s as needed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: in &lt;code&gt;fixed&lt;/code&gt; mode you can use the &lt;code&gt;--force-publish&lt;/code&gt; flag to always publish each package on any change. This makes it simple to debug versions since they should all be the same!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The amount of time that these commands have saved me is immense! This is the &lt;code&gt;publish&lt;/code&gt; workflow to beat for monorepo tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  🐈 &lt;a href="http://yarnpkg.com/"&gt;yarn v1&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast, reliable, and secure dependency management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;installer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn&lt;/code&gt; is an alternative to &lt;code&gt;npm&lt;/code&gt; that came with the promise of faster install times. At the time of it's creation it really delivered! Installs were super fast, so fast even that &lt;code&gt;npm&lt;/code&gt; improved the performance of their install too.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;yarn&lt;/code&gt; introduced the concept of &lt;code&gt;workspaces&lt;/code&gt; they brought that same speed to monorepo install times. Compared to &lt;code&gt;lerna bootstrap&lt;/code&gt; &lt;code&gt;yarn&lt;/code&gt; is almost twice as fast for the projects I work on.&lt;/p&gt;

&lt;p&gt;All of the monorepos I've set up both at my job and in open source utilize a combination of &lt;code&gt;lerna&lt;/code&gt; and &lt;code&gt;yarn&lt;/code&gt; and it's been amazing! They go together like chocolate and peanut butter.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;link:&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;When declaring a dependency between packages in your monorepo use the &lt;code&gt;link:../path-to-package&lt;/code&gt; syntax. This will create a symlink in you &lt;code&gt;node_modules&lt;/code&gt; to the package in your repo so that any requires resolve to the current version of the code. These links will get resolved by &lt;code&gt;lerna&lt;/code&gt; during a publish for seamless developer experience.&lt;/p&gt;

&lt;p&gt;The one caveat to this is that none of the tooling warns you when you created and invalid dependency &lt;code&gt;link:&lt;/code&gt;. If you mis-type a path, that path won't be resolved during a publish, it will make it's way into consuming projects and break their code!&lt;/p&gt;

&lt;p&gt;To fix this my teammate &lt;a href="https://twitter.com/GassnerKendall"&gt;Kendall Gassner&lt;/a&gt; forked &lt;code&gt;eslint-plugin-package-json&lt;/code&gt; and added a rule to create an error when an invalid &lt;code&gt;link:&lt;/code&gt; is found!&lt;/p&gt;

&lt;p&gt;Check it out &lt;a href="https://github.com/kendallgassner/eslint-plugin-package-json"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🐻 &lt;a href="https://github.blog/2020-10-13-presenting-v7-0-0-of-the-npm-cli/"&gt;npm v7&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The CLI for the world's largest software registry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;installer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Very recently &lt;code&gt;npm&lt;/code&gt; add support for &lt;code&gt;workspaces&lt;/code&gt;. It works in the same manner as &lt;code&gt;yarn&lt;/code&gt; workspaces and makes &lt;code&gt;npm&lt;/code&gt; a monorepo aware &lt;code&gt;installer&lt;/code&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  🐨 &lt;a href="https://pnpm.js.org/"&gt;pnpm&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast, disk space efficient package manager&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;installer&lt;/code&gt; &lt;code&gt;task-runner&lt;/code&gt; &lt;code&gt;publisher-ish&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pnpm&lt;/code&gt; stands for &lt;code&gt;performant npm&lt;/code&gt;, it aims to be a fast &lt;code&gt;installer&lt;/code&gt; for any JavaScript project. From my reading of the docs it focuses mainly on the &lt;code&gt;installer&lt;/code&gt; and &lt;code&gt;task-runner&lt;/code&gt; aspects of monorepo management.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;installer&lt;/code&gt; =&amp;gt; &lt;code&gt;pnpm install&lt;/code&gt; &lt;code&gt;pnpm add&lt;/code&gt; &lt;code&gt;pnpm update&lt;/code&gt; and more!
&lt;/h4&gt;

&lt;p&gt;These commands are the bread and butter of &lt;code&gt;pnpm&lt;/code&gt;. They facilitate managing the decencies for you project and work well for monorepos.&lt;/p&gt;

&lt;p&gt;This functionality is a direct competitor to &lt;code&gt;yarn&lt;/code&gt; and &lt;code&gt;npm&lt;/code&gt;, any of these can be a good fit for a project.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;task-runner&lt;/code&gt; =&amp;gt; &lt;code&gt;pnpm run&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Much like &lt;code&gt;lerna&lt;/code&gt;'s &lt;code&gt;run&lt;/code&gt; command you can use &lt;code&gt;pnpm run&lt;/code&gt; to run monorepo aware scripts in your project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pnpm run --recursive&lt;/code&gt;: Run a script in each package in order of the dependency graph&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pnpm run --parallel&lt;/code&gt;: Run a script in all matches packages in parallel processes&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;publisher&lt;/code&gt; =&amp;gt; &lt;code&gt;pnpm publisher&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;With this command you can edit a package version and then run &lt;code&gt;pnpm publish --recursive&lt;/code&gt; to publish the current package and it's dependencies.&lt;/p&gt;

&lt;p&gt;Other than that &lt;code&gt;pnpm&lt;/code&gt; does not implement anything further to help you with publishing you monorepo. This is probably the place where &lt;code&gt;pnpm&lt;/code&gt; lacks the most, but they know that and &lt;a href="https://pnpm.js.org/en/workspaces#release-workflow"&gt;recommend other tools in this post&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚴‍♂️ &lt;a href="https://rushjs.io/"&gt;rush&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Rush: a scalable monorepo manager for the web&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;installer&lt;/code&gt; &lt;code&gt;task-runner&lt;/code&gt; &lt;code&gt;publisher&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Rush aims to be a full featured tool set for managing monorepos much like &lt;code&gt;lerna&lt;/code&gt;, but takes a much different approach for each set of problems. A lot of it is very config driven and newly initiated project have a lot of files.&lt;/p&gt;

&lt;p&gt;It supports plugins too!&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;installer&lt;/code&gt; =&amp;gt; &lt;code&gt;rush add&lt;/code&gt; &lt;code&gt;rush check&lt;/code&gt; &lt;code&gt;rush install&lt;/code&gt; &lt;code&gt;rush update&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Rush has it's own approach to monorepo structure. In a Rush project there is not root &lt;code&gt;package.json&lt;/code&gt; and only each individual package has a &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In one step, Rush installs all the dependencies for all your projects into a common folder. This is not just a &lt;code&gt;package.json&lt;/code&gt; file at the root of your repo (which might set you up to accidentally require() a sibling's dependencies). Instead, Rush uses symlinks to reconstruct an accurate &lt;code&gt;node_modules&lt;/code&gt; folder for each project, without any of the limitations or glitches that seem to plague other approaches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They support all the popular JavaScript package managers (&lt;code&gt;npm&lt;/code&gt; &lt;code&gt;yarn&lt;/code&gt; &lt;code&gt;pnpm&lt;/code&gt;), so you can choose whatever best fits your project.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;task-runner&lt;/code&gt; =&amp;gt; &lt;code&gt;rush build&lt;/code&gt; &lt;code&gt;rush rebuild&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Rush improves running build in your repo through a few methods.&lt;/p&gt;

&lt;p&gt;The first is by being smart about execution using the dependency graph.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rush detects your dependency graph and builds your projects in the right order. If two packages don't directly depend on each other, Rush parallelizes their build as separate processes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the second is by only building the parts of the projects when you want to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you only plan to work with a few projects from your repo, &lt;code&gt;rush rebuild --to &amp;lt;project&amp;gt;&lt;/code&gt; does a clean build of just your upstream dependencies. After you make changes, &lt;code&gt;rush rebuild --from &amp;lt;project&amp;gt;&lt;/code&gt; does a clean build of only the affected downstream projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It even support incremental builds for even faster builds! Unfortunately this is where Rush's task running abilities end, it only does builds, so you'll have to figure out running other types of scripts on your own.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;publisher&lt;/code&gt; =&amp;gt; &lt;code&gt;rush change&lt;/code&gt; &lt;code&gt;rush version&lt;/code&gt; &lt;code&gt;rush publish&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Keeping with the trend, Rush also has it's own custom publishing process.&lt;/p&gt;

&lt;p&gt;When a developer is submitting a PR to a Rush based monorepo they need to run &lt;code&gt;rush change&lt;/code&gt; to tell Rush what the change is and how it should effect the package's version.&lt;/p&gt;

&lt;p&gt;On a CI the build script will run &lt;code&gt;rush change -v&lt;/code&gt; to verify that a PR has a change from &lt;code&gt;rush change&lt;/code&gt; included. Once the PR is merged the CI run &lt;code&gt;rush publish&lt;/code&gt; to apply the version changes. This command will create a changelog for each effected package in the dependency graph and publish it to &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A cool new feature they introduced recently is &lt;a href="https://rushjs.io/pages/maintainer/publishing/#3-version-policy"&gt;Version Policies&lt;/a&gt;. Version Policies are a lot like &lt;code&gt;lerna&lt;/code&gt;'s &lt;code&gt;fixed&lt;/code&gt; and &lt;code&gt;independent&lt;/code&gt; mode but more powerful. Instead of saying &lt;em&gt;all&lt;/em&gt; packages should be &lt;code&gt;fixed&lt;/code&gt; or &lt;code&gt;independent&lt;/code&gt; you can group packages into a policy as you want. This means you could have multiple parts of your repo have different &lt;code&gt;fixed&lt;/code&gt; versioning and independently version the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌊 &lt;a href="https://nx.dev/"&gt;nx&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Nx is a suite of powerful, extensible dev tools to help you architect, test, and build at any scale — integrating seamlessly with modern technologies and libraries while providing a robust CLI, caching, dependency management, and more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;task-runner&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This tool focuses mainly on being a smart &lt;code&gt;task-runner&lt;/code&gt;. In the same vein as other tools in this list it will only run commands for code effected in your project's dependency graph. It can also use a &lt;code&gt;distributed computation cache&lt;/code&gt;, which stores the results of commands in a cache to speed up execution.&lt;/p&gt;

&lt;p&gt;Nx changes the monorepo structure by only having a root &lt;code&gt;package.json&lt;/code&gt;. Instead of a &lt;code&gt;package.json&lt;/code&gt; for each project in the monorepo all of that is configured through the &lt;code&gt;workspace.json&lt;/code&gt;. This file describes all of the apps, libraries and tools in the monorepo and how they depend on each other. It also includes command and generator configuration.&lt;/p&gt;

&lt;p&gt;Comparing it to &lt;code&gt;lerna&lt;/code&gt; can be summarized as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lerna&lt;/code&gt; =&amp;gt; A tool for managing a monorepo of packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nx&lt;/code&gt; =&amp;gt; A tool for managing a monorepo of applications, tools and services for an&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Plugins
&lt;/h4&gt;

&lt;p&gt;Nx also has a plugin systems so you can easily add popular development tools in an easy way. These plugins range from test and linting tools to templates for new libraries, services and websites.&lt;/p&gt;

&lt;p&gt;This project has the most full featured project templating/package creation of the tools in this list.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;task running&lt;/code&gt; =&amp;gt; &lt;code&gt;nx run&lt;/code&gt; &lt;code&gt;nx run-many&lt;/code&gt; &lt;code&gt;nx affected&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;This tool comes with many of the same features as other task runner, supporting parallel, dependency graph sorted and git detected change builds.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏃 &lt;a href="https://github.com/folke/ultra-runner"&gt;ultra-runner&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Zero-config ultra fast monorepo script runner and build tool&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;task-runner&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This tool is super easy to use in any repo using the common monorepo structure. It parses scripts in your &lt;code&gt;package.json&lt;/code&gt; to intelligently run theme and only re-executes commands if the files have changes using a local build cache.&lt;/p&gt;

&lt;p&gt;While not as full features as other tools on this list it does one things and does it well. One of it's biggest features for me is the ease with which you can add it to an existing monorepo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏩ &lt;a href="https://turborepo.com/"&gt;turborepo&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Monorepos that make ship happen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;task-runner&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is the only tool on the list &lt;a href="https://twitter.com/HipsterSmoothie/status/1360435020175867904"&gt;but it's the one I'm most excited about&lt;/a&gt;. From what I've read and seen, &lt;code&gt;turborepo&lt;/code&gt; seems to be like all the intelligent builds of &lt;code&gt;rush&lt;/code&gt; and &lt;code&gt;nx&lt;/code&gt; without all of the config or monorepo structure changes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;turborepo&lt;/code&gt; use a local+remote caching system with your dependency graph to run your builds and scripts more efficiently. It also is going to shipt with a plugin system that will make it work with various tools. The plugin system seem super cool to me because it potentially opens up the tool for use outside of JavaScript. Imagine have super quick builds for &lt;em&gt;everything&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🦋 &lt;a href="https://github.com/atlassian/changesets"&gt;changesets&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A way to manage your versioning and changelogs with a focus on monorepos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;publisher&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;changesets&lt;/code&gt; operate in a very similar way to how &lt;code&gt;rush change&lt;/code&gt; works. They both produce a file that describes the change and how it should effect the version.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;publishing&lt;/code&gt; =&amp;gt; &lt;code&gt;changeset&lt;/code&gt; &lt;code&gt;changeset version&lt;/code&gt; &lt;code&gt;changeset publish&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Once a PR is merged with a changeset file the CI can apply the version bumps described in those files with &lt;code&gt;changeset version&lt;/code&gt;. This command will create changelog file, apply version bump to the dependency graph, and delete the changeset files. The &lt;code&gt;changeset publish&lt;/code&gt; command is then called to publish the changes made by the &lt;code&gt;version&lt;/code&gt; command&lt;/p&gt;

&lt;h3&gt;
  
  
  🏎️ &lt;a href="https://intuit.github.io/auto/"&gt;auto&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Generate releases based on semantic version labels on pull requests.&lt;/p&gt;

&lt;p&gt;Disclaimer: I'm the main author and maintainer of this project&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; &lt;code&gt;publisher&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;auto&lt;/code&gt;'s &lt;code&gt;npm&lt;/code&gt; plugin has built-in support for publishing JavaScript monorepos that's built on top of &lt;code&gt;lerna&lt;/code&gt; awesome publishing features. Where it differs is that it automates the semantic versioning of you project though GitHub labels. It handles creating changelogs, versioning your packages, creating Github releases, publishing canary/prerelease versions, and a host of other things through its plugin system.&lt;/p&gt;

&lt;p&gt;All of this is available of one context aware command that you just run at the end of each build: &lt;code&gt;auto shipit&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call from base branch -&amp;gt; latest version released&lt;/li&gt;
&lt;li&gt;call from prerelease branch -&amp;gt; prerelease version released&lt;/li&gt;
&lt;li&gt;call from PR in CI -&amp;gt; canary version released&lt;/li&gt;
&lt;li&gt;call locally when not on base/prerelease branch -&amp;gt; canary version released&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The awesome thing about &lt;code&gt;auto&lt;/code&gt; is that you can bring its workflow to whatever platform you want! As of today &lt;code&gt;auto&lt;/code&gt; has 11 different package manager plugins that enable you to publish anything from a rust create to a gradle project.&lt;/p&gt;

&lt;p&gt;At the company where I work (Intuit) we have hundreds of projects on various platforms using auto and have made 16,000+ release and saved thousands of developer hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best In Class
&lt;/h2&gt;

&lt;p&gt;Compared to just a few years ago the open source options for monorepo tooling have exploded with a lot of quality options. If you chose any of the tools mentioned in this article you would be in good hands.&lt;/p&gt;

&lt;p&gt;The following details my personal "best" of each category. I have not used a few of these tools at all and my opinions are in now way facts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Best&lt;/th&gt;
&lt;th&gt;Honorable Mention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;yarn v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pnpm&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;While I have put &lt;code&gt;yarn&lt;/code&gt; as the best it's really because it's the only one I've used in the past few years. While researching this article I now have the itch to try out &lt;code&gt;pnpm&lt;/code&gt; on a project since the transition seems easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task Running
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Best&lt;/th&gt;
&lt;th&gt;Honorable Mention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;rush&lt;/code&gt; or &lt;code&gt;nx&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;turborepo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I haven't used either of these tools that I've deemed best, but given their features they have vastly improved build and task execution for monorepo projects. The one detractor for me is that both of those tools rely heavily on radically different monorepo configurations, and lots and lots of config.&lt;/p&gt;

&lt;p&gt;This is what has me excited for &lt;code&gt;turborepo&lt;/code&gt;. Since it can easily fit to the common monorepo model it will be a no brainer for any project.It doesn't seem to rely on a bunch of new configuration either which is a huge plus, the less config the better. If it's plugin system can be extended to other languages and platforms I predict this tool will become popular&lt;/p&gt;

&lt;h3&gt;
  
  
  Publishing
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Best&lt;/th&gt;
&lt;th&gt;Honorable Mention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rush&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On this category I am a little biased. I maintain &lt;code&gt;auto&lt;/code&gt; but I truly believe that it's the best solution for publishing in &lt;em&gt;any&lt;/em&gt; project. It's automated publishing system can be used with any package management system though it's plugin systems. It takes one of the most stress filled parts of managing a monorepo and makes it as easy as merging a pull request.&lt;/p&gt;

&lt;p&gt;Rush's new Versioning Policy feature is pretty cool. It feels like the next generation of &lt;code&gt;lerna&lt;/code&gt;'s &lt;code&gt;fixed&lt;/code&gt; and &lt;code&gt;independent&lt;/code&gt; modes. I'm excited to test it out, and probably will write and &lt;code&gt;auto&lt;/code&gt; plugin for it 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  ❤️ Thanks for Reading
&lt;/h2&gt;

&lt;p&gt;I hope you found some useful information in this article and learned something! Feel free to hit me up &lt;a href="https://twitter.com/hipstersmoothie"&gt;on twitter&lt;/a&gt; to discuss the latest and greatest in monorepo tooling and automated publishing!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tooling</category>
      <category>typescript</category>
    </item>
    <item>
      <title>My Terminal Setup</title>
      <dc:creator>802.11 Savage</dc:creator>
      <pubDate>Fri, 29 May 2020 03:49:17 +0000</pubDate>
      <link>https://dev.to/hipstersmoothie/my-terminal-setup-588e</link>
      <guid>https://dev.to/hipstersmoothie/my-terminal-setup-588e</guid>
      <description>&lt;p&gt;When I first started coding in college, one of the scariest pieces of technology to me was the terminal. Back then OSX shipped with bash and the default was just plain hard to look at, so I didn't.&lt;/p&gt;

&lt;p&gt;Often tell junior developers to get as comfortable as possible with the terminal as soon as they can. I recount a tale from my college years where, just a few hours before a due date, I &lt;code&gt;rm -rf&lt;/code&gt;ed my project and had to redo it in a rush. This was solely because I was hesitant to use the terminal and didn't realize what I was doing. Being comfortable on the terminal is a &lt;em&gt;critical&lt;/em&gt; skill as a dev, so being on your terminal should feel &lt;strong&gt;amazing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Over the years I've played around with a bunch of different terminal setups and even &lt;a href="https://github.com/hipstersmoothie/PowerlevelHipstersmoothie" rel="noopener noreferrer"&gt;written themes of my own&lt;/a&gt;. But I've really come to love my current setup. This post will detail how do make your's looks like this too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEZJFW18VcAA8_j7%3Fformat%3Djpg%26name%3Dlarge" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FEZJFW18VcAA8_j7%3Fformat%3Djpg%26name%3Dlarge" alt="A picture of my terminal setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminal App
&lt;/h2&gt;

&lt;p&gt;The default terminal for OSX is okay but I always install &lt;a href="https://www.iterm2.com/" rel="noopener noreferrer"&gt;iterm&lt;/a&gt; for all it's great features.&lt;/p&gt;

&lt;h3&gt;
  
  
  iTerm settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Beautiful Font
&lt;/h4&gt;

&lt;p&gt;The default rendering just kind of feels "off". To make it buttery smooth go to &lt;code&gt;Preferences =&amp;gt; Profiles =&amp;gt; Text&lt;/code&gt; and check &lt;code&gt;Enable subpixel anti-aliasing&lt;/code&gt;. This is a huge quality of life improvement.&lt;/p&gt;

&lt;p&gt;The them I use recommends to install these fonts and I wholeheartedly agree.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf" rel="noopener noreferrer"&gt;MesloLGS NF Regular.ttf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf" rel="noopener noreferrer"&gt;MesloLGS NF Bold.ttf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf" rel="noopener noreferrer"&gt;MesloLGS NF Italic.ttf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf" rel="noopener noreferrer"&gt;MesloLGS NF Bold Italic.ttf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then go to &lt;code&gt;Preferences =&amp;gt; Profiles =&amp;gt; Text&lt;/code&gt; and change the font to &lt;code&gt;MesloLGS NF&lt;/code&gt;. I also up the default font size to 16 instead of 12. You will need to restart iTerm for it to save you font selection to the default profile.&lt;/p&gt;

&lt;h4&gt;
  
  
  Minimal Theme
&lt;/h4&gt;

&lt;p&gt;Go to &lt;code&gt;Preferences =&amp;gt; Appearance =&amp;gt; General&lt;/code&gt; and change &lt;code&gt;Theme&lt;/code&gt; to &lt;code&gt;Minimal&lt;/code&gt;. This is what makes the terminal's toolbar black and uniform with the rest of the app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Unfocused Pane Dimming
&lt;/h4&gt;

&lt;p&gt;Go to &lt;code&gt;Preferences =&amp;gt; Appearance =&amp;gt; Dimming&lt;/code&gt; and make sure everything but &lt;code&gt;Dim background windows&lt;/code&gt; is checked. This will make it so that when you split panes the unfocused pane isn't distracting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Split Pane in Same Directory
&lt;/h3&gt;

&lt;p&gt;Something that I hated about terminal splitting was that the new terminal starts out in the home directory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;Preferences =&amp;gt; Profiles =&amp;gt; General =&amp;gt; Working Directory&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Advanced Configuration&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Edit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;Working Directory for New Split Panes&lt;/code&gt; to &lt;code&gt;Reuse previous session's directory&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Quiet New Terminal Prompts
&lt;/h4&gt;

&lt;p&gt;When you make a new terminal it will spit out a bunch of text you don't care about. Run the following command to silence all of these! This even works on corporate computers!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; ~/.hushlogin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shell Configuration Manager
&lt;/h2&gt;

&lt;p&gt;And then the next thing I install &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;oh-my-zsh&lt;/a&gt;. From their website:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh My Zsh is a delightful, open source, community-driven framework for managing your Zsh configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We will this utilize the theming and plugin support&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Theme
&lt;/h2&gt;

&lt;p&gt;Theming your terminal usually involves a lot of setup and tweaking. Recently I found &lt;a href="https://github.com/romkatv/powerlevel10k" rel="noopener noreferrer"&gt;powerlevel10k&lt;/a&gt; and am absolutely in love.&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup is a breeze&lt;/li&gt;
&lt;li&gt;The font the have you install looks amazing on a terminal&lt;/li&gt;
&lt;li&gt;Instantly responsive on a new tab (I type so fast now!)&lt;/li&gt;
&lt;li&gt;Transient Prompt make having information on your terminal prompt useable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the theme on your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 https://github.com/romkatv/powerlevel10k.git &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/themes/powerlevel10k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the theme in &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ZSH_THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"powerlevel10k/powerlevel10k"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you restart your terminal you will go through the setup to customize your terminal. If you like the way mine above is rendered, you can &lt;a href="https://github.com/hipstersmoothie/dotfiles/blob/master/.p10.zsh" rel="noopener noreferrer"&gt;grab mine here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  p10k Customizations
&lt;/h3&gt;

&lt;p&gt;In this section I explain the customization I did to my &lt;code&gt;~./.p10k.zsh&lt;/code&gt;. If you use mine you do not have to read any of this, as it has already been done for you&lt;/p&gt;

&lt;h4&gt;
  
  
  Left Prompt
&lt;/h4&gt;

&lt;p&gt;On the left side I added a custom icon on the first line, and a prompt character on the second line. The rest of the values are the defaults.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;typeset&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;POWERLEVEL9K_LEFT_PROMPT_ELEMENTS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
  &lt;span class="c"&gt;# =========================[ Line #1 ]=========================&lt;/span&gt;
  my_icon
  &lt;span class="nb"&gt;dir&lt;/span&gt;                     &lt;span class="c"&gt;# current directory&lt;/span&gt;
  vcs                     &lt;span class="c"&gt;# git status&lt;/span&gt;
  &lt;span class="c"&gt;# =========================[ Line #2 ]=========================&lt;/span&gt;
  newline                 &lt;span class="c"&gt;# \n&lt;/span&gt;
  prompt_char           &lt;span class="c"&gt;# prompt symbol&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Display a custom Icon the changes depending on the time&lt;/span&gt;
&lt;span class="c"&gt;# Use the Font Book on your mac to figure out the character&lt;/span&gt;
&lt;span class="c"&gt;# To change the color change `-f 070` to a different 256 color&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;prompt_my_icon&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;currentTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;(%)&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;%D{%H%M&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; currentTime &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 1619 &lt;span class="o"&gt;||&lt;/span&gt; currentTime &amp;lt; 421 &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Weed&lt;/span&gt;
    p10k segment &lt;span class="nt"&gt;-f&lt;/span&gt; 070 &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'ﲤ'&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c"&gt;# Duck&lt;/span&gt;
    p10k segment &lt;span class="nt"&gt;-f&lt;/span&gt; 227 &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Right Prompt
&lt;/h3&gt;

&lt;p&gt;Here I un-commented any node version detection and added three items to the second line of the prompt.&lt;br&gt;
These three segments are only show on previous commands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt; - Whether the last command failed or passed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;time&lt;/code&gt; - The time the last command was run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dir&lt;/code&gt; - The directory the command was run from&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is super useful when your are looking back on commands you've run. You know the context in which they were ran and that information isn't cluttered with all the other stuff in your prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;typeset&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
  &lt;span class="c"&gt;# =========================[ Line #1 ]=========================&lt;/span&gt;
  &lt;span class="c"&gt;# ALL THE DEFAULTS DONT DELETE THEM. REMOVED FOR CLARITY&lt;/span&gt;
  nodenv                  &lt;span class="c"&gt;# node.js version from nodenv (https://github.com/nodenv/nodenv)&lt;/span&gt;
  node_version          &lt;span class="c"&gt;# node.js version&lt;/span&gt;
  battery               &lt;span class="c"&gt;# internal battery&lt;/span&gt;
  &lt;span class="c"&gt;# =========================[ Line #2 ]=========================&lt;/span&gt;
  newline                 &lt;span class="c"&gt;# \n&lt;/span&gt;
  status
  &lt;span class="nb"&gt;time
  dir&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Turn of p10k's transient prompt so we can control it&lt;/span&gt;
&lt;span class="nb"&gt;typeset&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;POWERLEVEL9K_TRANSIENT_PROMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off

&lt;span class="c"&gt;# Hide the second line on the right side&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;p10k-on-pre-prompt&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  p10k display &lt;span class="s1"&gt;'1|*/left_frame'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;show &lt;span class="s1"&gt;'2/right/(time|dir|status)'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hide
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Show the second line on the right side after command is run&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;p10k-on-post-prompt&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  p10k display &lt;span class="s1"&gt;'1|*/left_frame'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hide &lt;span class="s1"&gt;'2/right/(time|dir|status)'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;show
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ZSH Plugins
&lt;/h2&gt;

&lt;p&gt;ZSH Plugins offer a lot and most of the are geared towards a specific dev stack. Finding the right plugin means an awesome tab completion experience. Install whatever you need, I don't use plugins for this though.&lt;/p&gt;

&lt;p&gt;The two plugin I &lt;strong&gt;do&lt;/strong&gt; use are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting" rel="noopener noreferrer"&gt;zsh-syntax-highlighting&lt;/a&gt; - Fish shell like syntax highlighting for Zsh. This is what makes my aliases/commands green above. If it's green then it's installed!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-autosuggestions" rel="noopener noreferrer"&gt;zsh-autosuggestions&lt;/a&gt; - Fish-like autosuggestions for zsh. Will show a preview of the last matching command while typing. Press right to use&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Aliases
&lt;/h2&gt;

&lt;p&gt;I started out not using aliases all that much, but as you get more comfortable with the terminal they become really useful. Create these as you see fit, that's the easiest way to remember them.&lt;/p&gt;

&lt;p&gt;The following ones are simple and can fit most workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Alias the vs-code "code" command to something shorter&lt;/span&gt;
&lt;span class="c"&gt;# You can use it to open anything in vscode "c ." will open the current directory&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;

&lt;span class="c"&gt;# Open your .zshrc in VS Code&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;zshrc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"c ~/.zshrc"&lt;/span&gt;

&lt;span class="c"&gt;# Restart the terminal and ZSH&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"exec zsh"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Git
&lt;/h3&gt;

&lt;p&gt;I started as a Git GUI person (I still love and use &lt;a href="https://gitup.co/" rel="noopener noreferrer"&gt;gitup&lt;/a&gt; daily) but as I've grown as a developer I moved more and more into my terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open the current repository in Gitup&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gitup"&lt;/span&gt;
&lt;span class="c"&gt;# Create a new Branch&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git checkout -b"&lt;/span&gt;
&lt;span class="c"&gt;# Show the current status of the repo&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git status --short"&lt;/span&gt;
&lt;span class="c"&gt;# Stage some files&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ga&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git add -v"&lt;/span&gt;
&lt;span class="c"&gt;# Stage all files&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gaa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ga -A"&lt;/span&gt;
&lt;span class="c"&gt;# Make a commit&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git commit -m"&lt;/span&gt;
&lt;span class="c"&gt;# Add all changes, amend the last commit, and force push&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gaf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gaa &amp;amp;&amp;amp; git amend &amp;amp;&amp;amp; gp -f"&lt;/span&gt;

gitPush&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;# If in a git repo - call git mv. otherwise- call mv&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;git config &lt;span class="s2"&gt;"branch.&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--abbrev-ref&lt;/span&gt; HEAD&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.merge"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;then
        &lt;/span&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;--porcelain&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;git push &lt;span class="nt"&gt;--porcelain&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# Push to origin and set the upstream if necessary&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gitPush

&lt;span class="c"&gt;# Delete merged branches&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gcb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git checkout master &amp;amp;&amp;amp; git pull &amp;amp;&amp;amp; git branch --merged master | egrep -v 'next|master' | xargs -I % sh -c 'git branch -d %; git config --get branch.%.merge &amp;amp;&amp;amp; git push origin -d %'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;gp&lt;/code&gt; alias requires you to set a value in your git configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;push&lt;/span&gt;]
  &lt;span class="n"&gt;default&lt;/span&gt; = &lt;span class="n"&gt;current&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;gaf&lt;/code&gt; alias requires you to set a value in your git configuration. This will also make the &lt;code&gt;git amend&lt;/code&gt; command available. This command will amend the last commit with any staged changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;alias&lt;/span&gt;]
  &lt;span class="n"&gt;amend&lt;/span&gt; = &lt;span class="n"&gt;commit&lt;/span&gt; --&lt;span class="n"&gt;no&lt;/span&gt;-&lt;span class="n"&gt;edit&lt;/span&gt; --&lt;span class="n"&gt;no&lt;/span&gt;-&lt;span class="n"&gt;verify&lt;/span&gt; --&lt;span class="n"&gt;amend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And while you're there you might as well use all my color settings too. Git output should be pretty too!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;color&lt;/span&gt;]
  &lt;span class="n"&gt;ui&lt;/span&gt; = &lt;span class="n"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;branch&lt;/span&gt; = &lt;span class="n"&gt;auto&lt;/span&gt;
[&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="s2"&gt;"diff-highlight"&lt;/span&gt;]
  &lt;span class="n"&gt;oldNormal&lt;/span&gt; = &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;oldHighlight&lt;/span&gt; = &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt; &lt;span class="m"&gt;52&lt;/span&gt;
  &lt;span class="n"&gt;newNormal&lt;/span&gt; = &lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;newHighlight&lt;/span&gt; = &lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;
[&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="s2"&gt;"diff"&lt;/span&gt;]
  &lt;span class="n"&gt;commit&lt;/span&gt; = &lt;span class="n"&gt;yellow&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;old&lt;/span&gt; = &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;new&lt;/span&gt; = &lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;whitespace&lt;/span&gt; = &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;
[&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="s2"&gt;"status"&lt;/span&gt;]
  &lt;span class="n"&gt;branch&lt;/span&gt; = &lt;span class="n"&gt;magenta&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;remoteBranch&lt;/span&gt; = &lt;span class="n"&gt;magenta&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;changed&lt;/span&gt; = &lt;span class="n"&gt;yellow&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;untracked&lt;/span&gt; = &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;updated&lt;/span&gt; = &lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
[&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="s2"&gt;"branch"&lt;/span&gt;]
  &lt;span class="n"&gt;current&lt;/span&gt; = &lt;span class="n"&gt;magenta&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;ul&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
  &lt;span class="n"&gt;remote&lt;/span&gt; = &lt;span class="n"&gt;yellow&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;bold&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Terminal Keyboard Shortcuts
&lt;/h2&gt;

&lt;p&gt;Being skilled with keyboard shortcuts can make you look like a superhero in a text editor. The default iTerm keyboard shortcuts are nothing like vs-codes so I was always inserting weird character in the terminal instead of quickly navigating text.&lt;/p&gt;

&lt;p&gt;To fix this you can set up custom keyboard shortcuts in iTerm. Go to &lt;code&gt;Preferences =&amp;gt; Keys&lt;/code&gt;. For each of the following click the + button and make the &lt;code&gt;Action&lt;/code&gt; set to &lt;code&gt;Send Hex Code&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Hex Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd + right&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cursor to end of line&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x05&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd + left&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cursor to start of line&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd + backspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete line&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alt + right&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cursor skip one word right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x1b 0x66&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alt + left&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cursor skip one word left&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x1b 0x62&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alt + backspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete one word&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x1b 0x08&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Better Default Tools
&lt;/h2&gt;

&lt;p&gt;A lot of the tools you use are probably super old! That's great cause they work no problem, but they might not be as pretty as we want them! All of the following are tools I use to replace default tooling that is preinstalled on most computers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;cat&lt;/code&gt; =&amp;gt; &lt;code&gt;bat&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;A cat(1) clone with wings.&lt;/a&gt;. So much nicer!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;bat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to alias &lt;code&gt;cat&lt;/code&gt; in your &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias cat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bat"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;ls&lt;/code&gt; =&amp;gt; &lt;code&gt;exa&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ogham/exa" rel="noopener noreferrer"&gt;A modern version of ‘ls’.&lt;/a&gt;. Pretty colors!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;exa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to alias &lt;code&gt;cat&lt;/code&gt; in your &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"exa"&lt;/span&gt;
&lt;span class="c"&gt;# Show lots of info, even with icons!&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;lss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"exa -alh --icons --git-ignore"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;git diff&lt;/code&gt; =&amp;gt; &lt;code&gt;diff-so-fancy&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/so-fancy/diff-so-fancy" rel="noopener noreferrer"&gt;Strives to make your diffs human readable instead of machine readable.&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;diff-so-fancy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tell git to use diff-so-fancy for all diffs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.pager &lt;span class="s2"&gt;"diff-so-fancy | less -FR --tabs=4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  History search
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;bash&lt;/code&gt; and &lt;code&gt;zsh&lt;/code&gt; ship with a nice search history (press &lt;code&gt;ctrl + r&lt;/code&gt;). But it's old and ugly. For a better experience I install &lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;fzf

&lt;span class="c"&gt;# To install useful key bindings and fuzzy completion:&lt;/span&gt;
&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/opt/fzf/install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;cd&lt;/code&gt; =&amp;gt; &lt;code&gt;z&lt;/code&gt; (zoxide)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ajeetdsouza/zoxide" rel="noopener noreferrer"&gt;Easily jump to directories&lt;/a&gt;. Just supply a part of the path and it will change the directory to the last matching path. I still use &lt;code&gt;cd&lt;/code&gt; but I use &lt;code&gt;z&lt;/code&gt; to jump between projects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap ajeetdsouza/zoxide
brew &lt;span class="nb"&gt;install &lt;/span&gt;zoxide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add some config in your &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;zoxide init zsh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;zoxide&lt;/code&gt; ships with a &lt;code&gt;zi&lt;/code&gt; alias. This allows you to fuzzy search though all possible directory matches.&lt;/p&gt;

</description>
      <category>bash</category>
    </item>
    <item>
      <title>npm: More Secure Canary Publishing</title>
      <dc:creator>802.11 Savage</dc:creator>
      <pubDate>Sun, 15 Dec 2019 00:16:24 +0000</pubDate>
      <link>https://dev.to/hipstersmoothie/npm-more-secure-canary-publishing-4j7l</link>
      <guid>https://dev.to/hipstersmoothie/npm-more-secure-canary-publishing-4j7l</guid>
      <description>&lt;p&gt;Publishing canary versions comes with some security risks. If your project is private you have nothing to worry about, but if your project is open source there are some security holes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A canary version is a test version put out for a change other user's can utilize for testing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Attack Vectors
&lt;/h2&gt;

&lt;p&gt;Depending on the build platform you might be able to pass secrets to PR builds for forked repos. While this makes the developer experience of your project nice, in &lt;a href="https://github.com/intuit/auto/"&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/a&gt;'s case publishing canary versions, it exposes your keys.&lt;/p&gt;

&lt;p&gt;An attacker could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;print secrets&lt;/li&gt;
&lt;li&gt;send secrets to some server&lt;/li&gt;
&lt;li&gt;modify &lt;a href="https://github.com/intuit/auto/"&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/a&gt; to publish to the latest tag instead of &lt;code&gt;canary&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No amount of code can fix these problems. If your release keys are in everyone's CI builds an attacker can do any number of things to modify what you intend for &lt;a href="https://github.com/intuit/auto/"&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/a&gt; to do (or any other release method run in the CI).&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;The solution for this is actually quite simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a test scope that you publish canaries under (ex: &lt;code&gt;@auto-canary&lt;/code&gt; or &lt;code&gt;@auto-test&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Create a user that only has access to that scope&lt;/li&gt;
&lt;li&gt;Set the default &lt;code&gt;NPM_TOKEN&lt;/code&gt; to a token that can publish to that scope (this is used for any pull request)&lt;/li&gt;
&lt;li&gt;Set up a &lt;code&gt;secure&lt;/code&gt; token that is only accessible on the main fork (still named &lt;code&gt;NPM_TOKEN&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 3 might not be possible on your build platform.&lt;/p&gt;

&lt;p&gt;The following are the ways the &lt;a href="https://github.com/intuit/auto/"&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/a&gt; team knows how to do it. If you do not see the method for you build platform, please tell us about it!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://circleci.com/docs/2.0/contexts/"&gt;CircleCI Context&lt;/a&gt; - Contexts provide a mechanism for securing and sharing environment variables across projects. The environment variables are defined as name/value pairs and are injected at runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;To use this work flow in &lt;a href="https://github.com/intuit/auto/"&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/a&gt;, supply the following configuration to the &lt;code&gt;npm&lt;/code&gt; plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"canaryScope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@auto-canary"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now when people make pull requests to your repos: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;your CI can run &lt;code&gt;auto shipit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the canary versions will get published under your &lt;code&gt;canaryScope&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;This feature was added in &lt;code&gt;auto@v8.1.0&lt;/code&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>Announcing “auto” 8.0.0</title>
      <dc:creator>802.11 Savage</dc:creator>
      <pubDate>Thu, 12 Dec 2019 08:06:18 +0000</pubDate>
      <link>https://dev.to/hipstersmoothie/announcing-auto-8-0-0-2lo3</link>
      <guid>https://dev.to/hipstersmoothie/announcing-auto-8-0-0-2lo3</guid>
      <description>&lt;p&gt;We are excited to announce the release of &lt;code&gt;auto&lt;/code&gt; 8.0.0! This release brings a new command &lt;code&gt;next&lt;/code&gt;, a new use for &lt;code&gt;shipit&lt;/code&gt;, more powerful label configuration, and more.&lt;/p&gt;

&lt;p&gt;If you are unfamiliar, &lt;code&gt;auto&lt;/code&gt; is a CLI tool which helps you version your code and automate any part of your release pipeline. &lt;code&gt;auto&lt;/code&gt;'s main use is for automating your versioning with &lt;a href="https://semver.org/"&gt;semantic versioning&lt;/a&gt; and &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; pull request labels. It handles determining the next version, creating changelogs, publishing to package managers, publishing &lt;a href="https://help.github.com/en/github/administering-a-repository/about-releases"&gt;GitHub Releases&lt;/a&gt;, and so much more through plugins.&lt;/p&gt;

&lt;p&gt;The following is a high level view of the workflow that auto shipit enables:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P896Ok0T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dbgx6jmmmo5gsaud7va5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P896Ok0T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dbgx6jmmmo5gsaud7va5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you aren't already using &lt;code&gt;auto&lt;/code&gt; you can either install it through &lt;code&gt;npm&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or if you are publishing to something other than &lt;code&gt;npm&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On OSX&lt;/span&gt;
brew tap intuit/auto https://github.com/intuit/auto
brew &lt;span class="nb"&gt;install &lt;/span&gt;auto

&lt;span class="c"&gt;# Or other OSs&lt;/span&gt;
&lt;span class="c"&gt;# Download a platform specific version of auto&lt;/span&gt;
curl &lt;span class="nt"&gt;-vkL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; - https://github.com/intuit/auto/releases/download/v8.0.0/auto-linux.gz | &lt;span class="nb"&gt;gunzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/auto
&lt;span class="c"&gt;# Make auto executable&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;a+x ~/auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;next&lt;/code&gt; Command
&lt;/h2&gt;

&lt;p&gt;This new command will make a preview release of your code. This entails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating a prerelease on package management platform (supported by &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;git-tag&lt;/code&gt; plugins)&lt;/li&gt;
&lt;li&gt;Creating a tag and "Pre Release" on GitHub releases page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The only prerelease branch &lt;code&gt;auto&lt;/code&gt; comes configured with is &lt;code&gt;next&lt;/code&gt;. You can configure as many branches as you want with the &lt;a href="https://intuit.github.io/auto/pages/autorc.html#prerelease-branches"&gt;prereleaseBranches&lt;/a&gt; &lt;code&gt;.autorc&lt;/code&gt; option. If your package manager plugin supports release tags, such as the &lt;a href="https://intuit.github.io/auto/plugins/npm/README.html"&gt;npm&lt;/a&gt; plugin, &lt;code&gt;auto&lt;/code&gt; will publish the prerelease branch to a tag of the same name. Calling &lt;code&gt;auto next&lt;/code&gt; from a one of these branches will publish a prerelease, otherwise it will publish to your default prerelease branch/tag.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Usage
&lt;/h3&gt;

&lt;p&gt;Given the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prereleaseBranches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"beta"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;auto next&lt;/code&gt; from &lt;code&gt;beta&lt;/code&gt; branch =&amp;gt; Publish prerelease to &lt;code&gt;beta&lt;/code&gt; tag.&lt;br&gt;
Run &lt;code&gt;auto next&lt;/code&gt; from &lt;code&gt;feature&lt;/code&gt; branch =&amp;gt; Publish prerelease to &lt;code&gt;beta&lt;/code&gt; tag.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerelease Branches with &lt;code&gt;shipit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;shipit&lt;/code&gt; command will now also publish a prerelease when ran from a prerelease branch. You can use this in a few different ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Two release branches: &lt;code&gt;master&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Without &lt;code&gt;next&lt;/code&gt; Branch (&lt;code&gt;--only-graduate-with-release-label&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Multiple &lt;code&gt;next&lt;/code&gt; Branches (ex: &lt;code&gt;alpha&lt;/code&gt;, &lt;code&gt;beta&lt;/code&gt;, &lt;code&gt;rc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Feature Pre-releases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read more &lt;a href="https://intuit.github.io/auto/pages/generated/shipit.html#prereleases"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Label Configuration
&lt;/h2&gt;

&lt;p&gt;Label configuration just got a whole lot simpler 🎉.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Labels can now only be supplied as an array of label objects.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Version: Major"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Version: Minor"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"patch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Version: Patch"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Instead of using &lt;code&gt;skipReleaseLabels&lt;/code&gt; just set the label's &lt;code&gt;type&lt;/code&gt; to &lt;code&gt;skip&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NO!"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Overwrite default labels using &lt;code&gt;overwrite&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Version: Major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"overwrite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;none&lt;/code&gt; &lt;code&gt;releaseType&lt;/code&gt;. This will act as a &lt;code&gt;skip-release&lt;/code&gt; unless paired with a SEMVER label
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"releaseType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"documentation"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Changed &lt;code&gt;title&lt;/code&gt; to &lt;code&gt;changelogTitle&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"changelogTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"New Docs Yo!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"documentation"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Upload Assets - Globs
&lt;/h2&gt;

&lt;p&gt;You might want to upload multiple files or you might not know the file-name (ex: a vscode extension w/ a version number in the name), but you know the pattern of the filenames that you want to upload. So now you can use &lt;a href="https://github.com/mrmlnc/fast-glob#basic-syntax"&gt;globs&lt;/a&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"upload-assets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./path/**/to/*.file"&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  💥 Other Notable Breaking Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Deprecate &lt;code&gt;--very-verbose, -w&lt;/code&gt; Flag
&lt;/h3&gt;

&lt;p&gt;Using -w for very verbose logs was a very odd choice on my part (two &lt;code&gt;v&lt;/code&gt;s next to each other look like a &lt;code&gt;w&lt;/code&gt; 😓). Instead you can now just add another &lt;code&gt;-v&lt;/code&gt; and get the very verbose logs!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# old&lt;/span&gt;
auto shipit &lt;span class="nt"&gt;-w&lt;/span&gt;

&lt;span class="c"&gt;# new&lt;/span&gt;
auto shipit &lt;span class="nt"&gt;-vv&lt;/span&gt;
&lt;span class="c"&gt;# or&lt;/span&gt;
auto shipit &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;We hope you enjoy the new ways you can release your code!&lt;/p&gt;

&lt;p&gt;– Andrew Lisowski and the &lt;code&gt;auto&lt;/code&gt; Team&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/intuit/auto/releases/tag/v8.0.0"&gt;View the full release notes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>opensource</category>
      <category>git</category>
    </item>
  </channel>
</rss>
