<?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: Gus</title>
    <description>The latest articles on DEV Community by Gus (@gdbroman).</description>
    <link>https://dev.to/gdbroman</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%2F872037%2Fae68d88e-d89d-4444-9bd4-4e794e48af61.jpeg</url>
      <title>DEV Community: Gus</title>
      <link>https://dev.to/gdbroman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gdbroman"/>
    <language>en</language>
    <item>
      <title>How to Add a Newsletter to Your Markdown Blog</title>
      <dc:creator>Gus</dc:creator>
      <pubDate>Sat, 13 Aug 2022 19:42:00 +0000</pubDate>
      <link>https://dev.to/gdbroman/how-to-add-a-newsletter-to-your-markdown-blog-1b8g</link>
      <guid>https://dev.to/gdbroman/how-to-add-a-newsletter-to-your-markdown-blog-1b8g</guid>
      <description>&lt;p&gt;Let's say we have a markdown blog that is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using GitHub for its content&lt;/li&gt;
&lt;li&gt;Hosted on Vercel, Netlify, GitHub Pages, or the like&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How do we add a newsletter on top of this whilst keeping all our writing on GitHub? This tutorial shows how.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create an account on GitLetter
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://gitletter.vercel.app"&gt;gitletter.vercel.app&lt;/a&gt; and create an account.&lt;/p&gt;

&lt;p&gt;Full disclaimer: I'm the sole creator of this tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Connect your repo
&lt;/h2&gt;

&lt;p&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; and click &lt;strong&gt;Connect to GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once back in GitLetter, select the repository and directory where your markdown content is stored (this is where your email issues will be deployed).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. (Optional) Add a sign up form to your blog
&lt;/h2&gt;

&lt;p&gt;Go to &lt;strong&gt;Subscribers&lt;/strong&gt; and click &lt;strong&gt;Manage &amp;gt; Add form to your blog&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Copy-paste this sign up form to an apt place on your blog – like your home page.&lt;/p&gt;




&lt;p&gt;Enjoy automatic deploys! 🎉&lt;/p&gt;

&lt;p&gt;Now every time you send an issue, your blog will be automatically updated.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>github</category>
      <category>gitletter</category>
    </item>
    <item>
      <title>What Makes an Effective Engineer?</title>
      <dc:creator>Gus</dc:creator>
      <pubDate>Thu, 04 Aug 2022 21:54:00 +0000</pubDate>
      <link>https://dev.to/gdbroman/what-makes-an-effective-engineer-1op9</link>
      <guid>https://dev.to/gdbroman/what-makes-an-effective-engineer-1op9</guid>
      <description>&lt;p&gt;How come Twitter has 7500 employees, whereas FTX – the crypto exchange company – grew to $18B with just 6 engineers?&lt;/p&gt;

&lt;p&gt;If you ask their CEO, Sam Bankman-Fried, this is not an accident.&lt;/p&gt;

&lt;p&gt;In fact, many of their 10- and 100x-ers were rejected by bigger employers like Twitter.&lt;/p&gt;

&lt;p&gt;Sam claims these engineers learned to be effective &lt;em&gt;on the job.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So what makes them special?&lt;/p&gt;

&lt;p&gt;Effective engineers do not work more hours.&lt;/p&gt;

&lt;p&gt;They simply follow 3 simple rules:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1/ Prioritize High-Leverage Work&lt;br&gt;
2/ Give Accurate Time-Estimates&lt;br&gt;
3/ Grow Your Team&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I summarized them here:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9nKM8KbqvKE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>leadership</category>
    </item>
    <item>
      <title>How to Self-Teach CS</title>
      <dc:creator>Gus</dc:creator>
      <pubDate>Sat, 30 Jul 2022 16:56:23 +0000</pubDate>
      <link>https://dev.to/gdbroman/how-to-self-teach-cs-4g92</link>
      <guid>https://dev.to/gdbroman/how-to-self-teach-cs-4g92</guid>
      <description>&lt;p&gt;There are two types of programmer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Those who understand what's happening under the hood.&lt;/li&gt;
&lt;li&gt;Those who just get by because they're familiar with a few high-level tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Don't know about you, but I do &lt;em&gt;not&lt;/em&gt; want to be a &lt;em&gt;code monkey.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want to evolve too, you'll have to self-teach CS.&lt;/p&gt;

&lt;p&gt;I summarized the 9 fundamental CS topics every practicing software engineer should know:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jwpLMo_2qts"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>One-Click Sign In with Next Auth</title>
      <dc:creator>Gus</dc:creator>
      <pubDate>Tue, 14 Jun 2022 19:23:55 +0000</pubDate>
      <link>https://dev.to/gdbroman/one-click-sign-in-with-next-auth-27if</link>
      <guid>https://dev.to/gdbroman/one-click-sign-in-with-next-auth-27if</guid>
      <description>&lt;p&gt;In the frontend it's as simple as...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signIn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-auth/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
  &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;callbackUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;Sign&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And your &lt;code&gt;api/auth/[...nextauth].ts&lt;/code&gt; route stays the same, no extra configuration needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;GoogleProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GOOGLE_OAUTH_CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GOOGLE_OAUTH_CLIENT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;PrismaAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;NextAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;authHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>nextjs</category>
      <category>nextauth</category>
    </item>
    <item>
      <title>How to configure Vercel deploys for a monorepo package</title>
      <dc:creator>Gus</dc:creator>
      <pubDate>Sun, 05 Jun 2022 17:08:28 +0000</pubDate>
      <link>https://dev.to/gdbroman/how-to-trigger-fewer-vercel-deploys-for-your-monorepo-4ok1</link>
      <guid>https://dev.to/gdbroman/how-to-trigger-fewer-vercel-deploys-for-your-monorepo-4ok1</guid>
      <description>&lt;p&gt;Without configuration, Vercel will create a new deployment any time your repository updates, which is not ideal for monorepos.&lt;/p&gt;

&lt;p&gt;With multiple packages, you're probably only hosting one or two on Vercel. So deploying every time any package is changed is unnecessary and might eat up your deployment quota (&lt;a href="https://vercel.com/docs/concepts/limits/overview" rel="noopener noreferrer"&gt;100/day&lt;/a&gt; for the free plan). Luckily, Vercel makes it easy to configure deployments to only happen when a specific package is changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Navigate to Git settings
&lt;/h2&gt;

&lt;p&gt;Open your Vercel project's dashboard, go to "Settings" &amp;gt; "Git", and scroll to "Ignored Build Step".&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add a Git command
&lt;/h2&gt;

&lt;p&gt;If you've configured the Root Directory in Vercel to be the same package you want to trigger deploys, add the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git diff HEAD^ HEAD &lt;span class="nt"&gt;--quiet&lt;/span&gt; ./


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;But if you've for some reason left the Root Directory as its default value &lt;code&gt;./&lt;/code&gt;, you''ll need to use the package's absolute path instead:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git diff HEAD^ HEAD &lt;span class="nt"&gt;--quiet&lt;/span&gt; ./packages/your-package/


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Tip: If you're unsure what your Vercel project's Root Directory is, go to "Settings" &amp;gt; "General" and scroll to "Root Directory".&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Enjoy fewer deploys
&lt;/h2&gt;

&lt;p&gt;Success! When pushing a change to &lt;em&gt;outside&lt;/em&gt; of &lt;code&gt;packages/your-package&lt;/code&gt;, Vercel will no longer create a new deployment.&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%2Fjsbexddlxlt0pu2xt6gl.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%2Fjsbexddlxlt0pu2xt6gl.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you push a change to &lt;code&gt;packages/your-package&lt;/code&gt;, Vercel will build and deploy as usual.&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%2Ftks187ricaeupg9xltn5.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%2Ftks187ricaeupg9xltn5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;May you stay on the free plan for a little bit longer ;)&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>vercel</category>
      <category>monorepo</category>
      <category>github</category>
    </item>
  </channel>
</rss>
