<?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: Zeno Rocha</title>
    <description>The latest articles on DEV Community by Zeno Rocha (@zenorocha).</description>
    <link>https://dev.to/zenorocha</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%2F309978%2Fa224a1e6-543a-44f7-9873-b3fb7263d63d.jpeg</url>
      <title>DEV Community: Zeno Rocha</title>
      <link>https://dev.to/zenorocha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zenorocha"/>
    <language>en</language>
    <item>
      <title>How to send emails using Bun and React</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Wed, 20 Sep 2023 15:01:46 +0000</pubDate>
      <link>https://dev.to/zenorocha/how-to-send-emails-using-bun-and-react-59o1</link>
      <guid>https://dev.to/zenorocha/how-to-send-emails-using-bun-and-react-59o1</guid>
      <description>&lt;h2&gt;
  
  
  What is Bun again?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bun.sh"&gt;Bun&lt;/a&gt; is an all-in-one runtime for JavaScript. It comes with a bundler, test runner, and package manager.&lt;/p&gt;

&lt;p&gt;The best thing about Bun is its speed. It's way faster than Node.js and Deno, which makes it pretty compelling for edge computing.&lt;/p&gt;

&lt;p&gt;Since lots of emails are sent via background jobs running in edge functions, we decided to explore how to send emails using Bun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting the HTTP server
&lt;/h2&gt;

&lt;p&gt;To get started, we will create an &lt;code&gt;index.tsx&lt;/code&gt; file and include a simple HTTP server that returns a "Hello World" message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World!&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="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the local server by executing &lt;code&gt;bun index.tsx&lt;/code&gt; on the terminal. Once you navigate to &lt;code&gt;http://localhost:3000&lt;/code&gt;, you will see the message.&lt;/p&gt;

&lt;p&gt;Now that we have this foundation, we can add the actual email functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Resend for email sending
&lt;/h2&gt;

&lt;p&gt;First, we import the &lt;code&gt;resend&lt;/code&gt; package and create a new client that will authenticate using an &lt;a href="https://resend.com/api-keys"&gt;Resend API key&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then, we call the &lt;code&gt;send&lt;/code&gt; method and return the response object. In this example, we're sending an email using the &lt;code&gt;html&lt;/code&gt; property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Resend&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="s1"&gt;resend&lt;/span&gt;&lt;span class="dl"&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;resend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Resend&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;RESEND_API_KEY&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;fetch&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Acme &amp;lt;onboarding@resend.dev&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delivered@resend.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;It works!&amp;lt;/p&amp;gt;&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrating React Email templates
&lt;/h2&gt;

&lt;p&gt;Being able to send an email using HTML is nice, but being able to use an engine like &lt;a href="https://react.email"&gt;React Email&lt;/a&gt; is even better.&lt;/p&gt;

&lt;p&gt;To make things interesting, let's create a new &lt;code&gt;waitlist-email.tsx&lt;/code&gt; file that will render a beautiful waitlist email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&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="s1"&gt;@react-email/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;WaitlistEmailProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WaitlistEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;WaitlistEmailProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Head&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Preview&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Thank you for joining our waitlist and for your patience&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Preview&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Body&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Container&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Coming Soon.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          Thank you &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; for joining our waitlist and for your patience. We
          will send you a note when we have something new to share.
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;&amp;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;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 auto&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;96px 20px 64px&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;24px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;40px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 0 20px&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#aaaaaa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;14px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;24px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 0 40px&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have this template, we can import it into our &lt;code&gt;index.tsx&lt;/code&gt; file and use it to send an email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Resend&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="s1"&gt;resend&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;WaitlistEmail&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="s1"&gt;./waitlist-email&lt;/span&gt;&lt;span class="dl"&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;resend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Resend&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;RESEND_API_KEY&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;fetch&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Acme &amp;lt;onboarding@resend.dev&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delivered@resend.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Bun + Resend + React Email 🫓💌&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;react&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WaitlistEmail&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vitor&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By running &lt;code&gt;bun index.tsx&lt;/code&gt;, you should see the email being sent using React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;We're excited to see what you build with Bun and Resend.&lt;/p&gt;

&lt;p&gt;If you want to see the full code, you can check out the &lt;a href="https://github.com/resendlabs/resend-bun-example"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>email</category>
      <category>bunjs</category>
      <category>resend</category>
      <category>react</category>
    </item>
    <item>
      <title>Email Authentication: A Developer's Guide</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Fri, 25 Aug 2023 16:57:35 +0000</pubDate>
      <link>https://dev.to/zenorocha/email-authentication-a-developers-guide-dgm</link>
      <guid>https://dev.to/zenorocha/email-authentication-a-developers-guide-dgm</guid>
      <description>&lt;p&gt;Proper email authentication can be the difference between &lt;strong&gt;reaching the human or the spam folder&lt;/strong&gt;, but it is often overlooked or misunderstood.&lt;/p&gt;

&lt;p&gt;Think of your &lt;strong&gt;emails as a startup getting into a competitive accelerator program&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SPF (Receiving Applications)
&lt;/h2&gt;

&lt;p&gt;Competitive startup programs will receive 10's of thousands of applications. Their first step is to see which of these applications can be thrown out without being considered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.open-spf.org/"&gt;SPF (Sender Policy Framework)&lt;/a&gt; is similar. It's the first triage of the emails coming to an inbox, checking to make sure that each email should even be considered for delivery.&lt;/p&gt;

&lt;p&gt;The DNS record for SPF declares a list of origins (servers) that are allowed to send email for this domain, and the inbox will confirm that the message they received matches one of them. If a server isn't on the list, it's like an application being tossed out because it wasn't fully filled or the business idea is illegal.&lt;/p&gt;

&lt;p&gt;Every domain or subdomain can only have one SPF policy, and policies on the root/apex domain (domain.com) are &lt;strong&gt;not applied to subdomains&lt;/strong&gt; (sub.domain.com).&lt;/p&gt;

&lt;p&gt;Your SPF policy, specified in a TXT record, probably looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RIHmgr4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-spf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RIHmgr4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-spf.jpg" alt="Diagram explain SPF record" width="800" height="548"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:amazonses.com ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v=spf1&lt;/strong&gt;: The version of SPF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;include:_spf.google.com&lt;/strong&gt;: Allows Google servers to send emails on your domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;include:amazonses.com&lt;/strong&gt;: Allows AWS servers to send emails on your domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~all&lt;/strong&gt;: The policy which tells the server what to do if the SPF check fails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a mailbox receives a message from you, it will look at the &lt;strong&gt;Return-Path&lt;/strong&gt; in the email header and expects it to map back to one of the origins specified in the record.&lt;/p&gt;

&lt;h2&gt;
  
  
  DKIM (Application Vetting)
&lt;/h2&gt;

&lt;p&gt;If the application passes that initial check, then the vetting process begins to make sure all the claims the applicants made are true.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dkim.org/"&gt;DKIM (DomainKeys Identified Mail)&lt;/a&gt; plays a similar role to confirm the legitimacy of the message by adding a signature on each message that verifies the email sender is who they say they are.&lt;/p&gt;

&lt;p&gt;DKIM is set with a private/public key pairing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You set a public key in your DNS records (usually a CNAME or TXT record)&lt;/li&gt;
&lt;li&gt;Each email you send includes a DKIM signature&lt;/li&gt;
&lt;li&gt;When an inbox receives your message, it compares the signature with the public record to confirm a pair&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Especially as your company becomes more well known, there are more incentives for &lt;strong&gt;hackers to send an email as if it is from you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The DKIM, like a strong login password, is an essential way to prove who you are by providing information only you know.&lt;/p&gt;

&lt;p&gt;It is common to have multiple DKIM records, usually one or more per email provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  DMARC (Selection Policy)
&lt;/h2&gt;

&lt;p&gt;What if an applicant fails one of these steps? How should their application be handled?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://resend.com/docs/dashboard/domains/dmarc"&gt;DMARC (Domain-based Message Authentication, Reporting &amp;amp; Conformance)&lt;/a&gt; is &lt;strong&gt;the selection policy&lt;/strong&gt;. It sets rules for what happens if an applicant lies on an application (DKIM) vs. not demonstrate enough traction (SPF). For email, DMARC establishes your policy as a sender for what should happen to your messages if they fail DKIM or SPF.&lt;/p&gt;

&lt;p&gt;You would likely have one DMARC policy set for your entire domain, including subdomains, in a TXT record that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Q5iJUln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-dmarc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Q5iJUln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-dmarc.jpg" alt="Diagram explain SPF record" width="800" height="548"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1;p=quarantine;pct=100;rua=mailto:dmarc@domain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v&lt;/strong&gt;: The version of DMARC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p&lt;/strong&gt;: What the mailbox should do (policy) if SPF or DKIM fails (none, quarantine, reject)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pct&lt;/strong&gt;: The percentage of failed messages that should be affected by the policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rua&lt;/strong&gt;: A valid inbox where the providers should send their DMARC reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementing DMARC, particularly with a policy of &lt;strong&gt;quarantine&lt;/strong&gt; or &lt;strong&gt;reject&lt;/strong&gt;, enhances your domain's reputation. This is because inbox providers can rely on your commitment to prevent the delivery of suspicious messages, thereby improving their user experience within the inbox.&lt;/p&gt;

&lt;p&gt;Check out our full guide on &lt;a href="https://resend.com/docs/dashboard/domains/dmarc"&gt;how to set up DMARC&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  BIMI (Exclusive Access)
&lt;/h2&gt;

&lt;p&gt;Making it into a startup accelerator is an amazing feat, but if you want to be exceptional, you need to gain the attention of the industry leaders and pioneers. There are no hacks or shortcuts to this, you simply need to prove yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://resend.com/docs/dashboard/domains/bimi"&gt;BIMI (Brand Indicators for Message Identification)&lt;/a&gt; is this kind of access in the inbox. It sets you apart from all the others by showcasing your brand and legitimacy to your users in the inbox by displaying your logo and, in some cases, a verified checkmark.&lt;/p&gt;

&lt;p&gt;With over 347 billion emails sent every day, this is an exceptional way to stand out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ckn8luya--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-bimi-inbox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ckn8luya--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-bimi-inbox.png" alt="BIMI in the inbox" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obtaining BIMI is exclusive because of the long, hard process it takes to complete the verification. Here are a few things you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DMARC&lt;/strong&gt;: The DMARC policy must be at quarantine or reject and at 100%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trademarked Logo&lt;/strong&gt;: The logo you want to showcase must be trademarked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMC&lt;/strong&gt;: The certificate which verifies your identity, domain, and trademark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--grpFU8aF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-bimi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--grpFU8aF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resend.com/static/posts/email-authentication-bimi.jpg" alt="Diagram explain BIMI record" width="800" height="548"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=BIMI1; l=https://vmc.digicert.com/00-00.svg; a=https://vmc.digicert.com/00-00.pem;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v&lt;/strong&gt;: The version of BIMI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;l&lt;/strong&gt;: The location of the SVG logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;a&lt;/strong&gt;: The location of the Verified Mark Certificate (VMC)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out our full guide on &lt;a href="https://resend.com/docs/dashboard/domains/bimi"&gt;how to set up BIMI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivery is the Goal
&lt;/h2&gt;

&lt;p&gt;The good news is that &lt;strong&gt;SPF and DKIM are handled for you when using Resend&lt;/strong&gt;. All you need to do is &lt;a href="https://resend.com/domains"&gt;add a domain&lt;/a&gt; and we take care of the rest.&lt;/p&gt;

&lt;p&gt;Ultimately, inbox providers aim to only show the emails their users want to see, and spoofed or compromised emails are not on the list.&lt;/p&gt;

&lt;p&gt;Without these protocols, &lt;strong&gt;they can't tell you from a spammer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Assure them you're legit, and they'll prioritize your emails. It's a win-win.&lt;/p&gt;

</description>
      <category>email</category>
      <category>dkim</category>
      <category>dmarc</category>
      <category>spf</category>
    </item>
    <item>
      <title>How to configure Supabase to send emails from your domain</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Thu, 10 Aug 2023 16:02:54 +0000</pubDate>
      <link>https://dev.to/zenorocha/how-to-configure-supabase-to-send-emails-from-your-domain-ci8</link>
      <guid>https://dev.to/zenorocha/how-to-configure-supabase-to-send-emails-from-your-domain-ci8</guid>
      <description>&lt;p&gt;One of the coolest things about &lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; is that it has a built-in authentication system that allows you to send emails to your users.&lt;/p&gt;

&lt;p&gt;These emails typically include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm signup&lt;/li&gt;
&lt;li&gt;Invite user&lt;/li&gt;
&lt;li&gt;Magic link&lt;/li&gt;
&lt;li&gt;Reset password&lt;/li&gt;
&lt;li&gt;Change email address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you get ready to move to production, you might want to consider sending emails from a custom SMTP service. Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge of sending emails via Supabase
&lt;/h2&gt;

&lt;p&gt;All of the &lt;a href="https://supabase.com/docs/guides/auth" rel="noopener noreferrer"&gt;Supabase Auth&lt;/a&gt; emails are sent from &lt;code&gt;noreply@mail.app.supabase.io&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Although this is good enough to get started, you probably want these emails to be sent from your own domain for brand recognition.&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%2Fejpqzqqcikd2vx9d0z5d.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%2Fejpqzqqcikd2vx9d0z5d.png" alt="Supabase integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apart from that, you can only send up to &lt;strong&gt;4 emails per hour&lt;/strong&gt;. That's a &lt;a href="https://github.com/orgs/supabase/discussions/15896" rel="noopener noreferrer"&gt;recent change&lt;/a&gt; caused by an influx of spam messages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The default email system we provide is only for testing purposes - it is not intended for production use. This means that the deliverability will not be great, because everyone is using it for testing and is a major reason we don't recommend using it for production." - Paul Copplestone (CEO at Supabase)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Beyond rate limits, a managed SMTP server might also help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deliverability and IP reputation management&lt;/li&gt;
&lt;li&gt;Compliance and anti-spam practices&lt;/li&gt;
&lt;li&gt;Analytics and webhooks&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Integrate to have full control and visibility
&lt;/h2&gt;

&lt;p&gt;Supporting existing tools is one of Supabase's product principles, so they have made it easy to configure a custom SMTP server, or any other tool you need.&lt;/p&gt;

&lt;p&gt;On top of that, we've built an integration that allows you to connect your Supabase project to Resend.&lt;/p&gt;

&lt;p&gt;All you need to do is navigate to the &lt;a href="https://resend.com/settings/integrations" rel="noopener noreferrer"&gt;Integrations page&lt;/a&gt; and follow the steps.&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%2Fwsszy0jh6jjw0v7dlluz.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%2Fwsszy0jh6jjw0v7dlluz.png" alt="Supabase integration Email"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you're done, you'll be able to send emails from your own domain.&lt;/p&gt;

&lt;p&gt;This will give you full control and visibility over your email delivery.&lt;/p&gt;

&lt;p&gt;No more &lt;em&gt;"Hey, I didn't get your email"&lt;/em&gt; from your users. Now you can see exactly what's happening with your emails - if they were sent, delivered, bounced, or marked as spam.&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%2Fvhdlly4tyozzu1sl1o1b.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%2Fvhdlly4tyozzu1sl1o1b.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a video showing the integration end-to-end:&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure a custom SMTP server manually
&lt;/h2&gt;

&lt;p&gt;If you prefer to configure your SMTP server manually, you can do that as well.&lt;/p&gt;

&lt;p&gt;Navigate to your Supabase project, click on &lt;strong&gt;Project Settings&lt;/strong&gt;, then navigate to &lt;strong&gt;Auth&lt;/strong&gt;. Over there you'll find the &lt;strong&gt;SMTP Settings&lt;/strong&gt; section.&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%2Fhbi2pvh8o4hor2afby1l.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%2Fhbi2pvh8o4hor2afby1l.png" alt="Supabase - SMTP Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you toggle the &lt;strong&gt;Enable Custom SMTP&lt;/strong&gt; option, you'll be able to configure your SMTP server. You can change the host, port number, username, password, sender email, and sender name.&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%2Fw4nlouwudcm7g0wk9ooj.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%2Fw4nlouwudcm7g0wk9ooj.png" alt="Supabase - SMTP Configurations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can copy-and-paste all of these values from the &lt;a href="https://resend.com/settings/smtp" rel="noopener noreferrer"&gt;Resend SMTP&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Check the &lt;a href="https://resend.com/docs/send-with-supabase-smtp" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; to learn more about integrating SMTP with Supabase.&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>email</category>
      <category>resend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>14 Best Free Fonts for Programming</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Wed, 10 Feb 2021 16:45:45 +0000</pubDate>
      <link>https://dev.to/zenorocha/14-best-free-fonts-for-programming-10l6</link>
      <guid>https://dev.to/zenorocha/14-best-free-fonts-for-programming-10l6</guid>
      <description>&lt;p&gt;We spend the entire day using code editors, terminal emulators, and other developer tools. Using a font that feels comfortable to your eyes can make a huge difference and improve your productivity.&lt;/p&gt;

&lt;p&gt;Here's a compilation of the best free monospace fonts for coding, along with additional comments and download links.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fira Code
&lt;/h2&gt;

&lt;p&gt;I've used Monaco for 10+ years until I finally met Fira Code. This font has more than 53,600 stars on GitHub, and it's popular for a reason. Nikita Prokopov puts a lot of effort into the ligatures, which transforms characters into single logical tokens. It's my favorite font nowadays.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tonsky/FiraCode/releases/download/5.2/Fira_Code_v5.2.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/tonsky/FiraCode"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/tonsky/FiraCode"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gh37ferT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-a.png" alt="Fira Code"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. IBM Plex Mono
&lt;/h2&gt;

&lt;p&gt;The Plex family was created to replace Helvetica as the IBM corporate typeface after more than 50 years. The italics look great, and it features very crisp and easy-to-read glyphs. Unfortunately, it doesn't include ligatures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IBM/plex/archive/v5.1.3.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/IBM/plex"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ibm.com/plex"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I3pHNwLE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-b.png" alt="IBM Plex Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Source Code Pro
&lt;/h2&gt;

&lt;p&gt;This was one of the first open source fonts made by Adobe. After its release in 2012, the font got extremely popular and was adopted by many developers. It preserves the design features and vertical proportions of Source Sans, but alters the glyph widths so that they are uniform across all weights.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/adobe-fonts/source-code-pro/archive/2.038R-ro/1.058R-it/1.018R-VAR.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/adobe-fonts/source-code-pro"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://adobe-fonts.github.io/source-code-pro"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dv7yTWKj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-c.png" alt="Source Code Pro"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Monoid
&lt;/h2&gt;

&lt;p&gt;If you're one of those people who hate horizontal scrolling, this is the right font for you. It's optimized for coding with bitmap-like sharpness at 12px/9pt even on low res displays. There's also a Font Awesome integration called Monoisome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/larsenwork/monoid/archive/0.61.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/larsenwork/monoid"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://larsenwork.com/monoid"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wh1yJd-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-d.png" alt="Monoid"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Hack
&lt;/h2&gt;

&lt;p&gt;This is one of the most customizable fonts of all. It has 1,573 glyphs, and you can change the details of each one yourself. Powerline glyphs are also included in the regular set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/source-foundry/Hack/archive/v3.003.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/source-foundry/Hack"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sourcefoundry.org/hack"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9cBeg36C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-e.png" alt="Hack"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Iosevka
&lt;/h2&gt;

&lt;p&gt;This font provides a slender outfit by default: glyphs are exactly 1/2em wide. Compared to the competitors, you could fit more columns within the same screen width. It also has two widths, Normal and Extended, so if you prefer more breeze between the character, go with the Extended version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/be5invis/Iosevka/archive/v4.5.0.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/be5invis/Iosevka"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://typeof.net/Iosevka"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--os23a-h3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-f.png" alt="Iosevka"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. JetBrains Mono
&lt;/h2&gt;

&lt;p&gt;JetBrains, the company behind IntelliJ, WebStorm, and so many other IDEs, surprised us all in 2020 when it came with its own font. Their approach is to keep code lines to the length that developers expect, making each letter occupy more pixels. They do that by having characters remain standard in width, but the height of the lowercase is maximized.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JetBrains/JetBrainsMono/releases/download/v2.225/JetBrainsMono-2.225.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/JetBrains/JetBrainsMono"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/lp/mono"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TYJvxSdP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-g.png" alt="JetBrains Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Fantasque Sans Mono
&lt;/h2&gt;

&lt;p&gt;Designed with functionality in mind, this is the kind of font that adds an extra touch to your code. Its handwriting-like fuzziness makes it a really cool option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/belluzj/fantasque-sans/archive/v1.8.0.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/belluzj/fantasque-sans"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fontlibrary.org/en/font/fantasque-sans-mono"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yo_6PtsL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-h.png" alt="Fantasque Sans Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Ubuntu Mono
&lt;/h2&gt;

&lt;p&gt;Especifically created to complement the Ubuntu tone of voice. It has a contemporary style and contains characteristics unique to the Ubuntu brand that convey a precise, reliable, and free attitude. If you enjoy Linux but have to work in Windows or MacOS, this font gives you a little happiness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://assets.ubuntu.com/v1/0cef8205-ubuntu-font-family-0.83.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://design.ubuntu.com/font/"&gt;Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://design.ubuntu.com/font/"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rNa2qrzK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-i.png" alt="Ubuntu Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Anonymous Pro
&lt;/h2&gt;

&lt;p&gt;The cool thing about this font is that characters that could be mistaken for each other like 0 (zero) vs O (capital O) are intentionally differentiated. It's a family of four fixed-width fonts designed especially with coding in mind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.marksimonson.com/assets/content/fonts/AnonymousPro-1_002.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://www.marksimonson.com/fonts/view/anonymous-pro"&gt;Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.marksimonson.com/fonts/view/anonymous-pro"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jD11V5si--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-j.png" alt="Anonymous Pro"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Inconsolata
&lt;/h2&gt;

&lt;p&gt;An open source alternative to the proprietary Consolas font from Microsoft. It's a monospace font designed for printed code listings, terminal emulators, and similar uses. Comes with ligatures for a great coding experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/googlefonts/Inconsolata/archive/v3.000.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/googlefonts/Inconsolata"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://levien.com/type/myfonts/inconsolata.html"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yZxmTA_S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-k.png" alt="Inconsolata"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Victor Mono
&lt;/h2&gt;

&lt;p&gt;This typeface is clean, crisp and narrow, with a large x-height and clear punctuation, making it legible and ideal for code. It comes in seven weights and Roman, Italic and Oblique styles. It also has optional semi-connected cursive italics and programming symbol ligatures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rubjo/victor-mono/archive/v1.4.2.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/rubjo/victor-mono"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rubjo.github.io/victor-mono/"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3fX6585b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-l.png" alt="Victor Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Space Mono
&lt;/h2&gt;

&lt;p&gt;Developed explicitly for use in headline and display typography, the letterforms infuse a geometric slab core with novel over-rationalized forms. It supports a Latin Extended glyph set, enabling typesetting for English and other Western European languages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/googlefonts/spacemono/archive/f5ebc1e1c0.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/googlefonts/spacemono"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.colophon-foundry.org/custom/spacemono/"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AC6_u23a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-m.png" alt="Space Mono"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Hasklig
&lt;/h2&gt;

&lt;p&gt;Based on Source Code Pro, this font solves the problem the way typographers have always solved ill-fitting characters, which co-occur often: ligatures. The underlying code stays the same — only the representation changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/i-tu/Hasklig/archive/v1.2.zip"&gt;Download&lt;/a&gt; • &lt;a href="https://github.com/i-tu/Hasklig"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/i-tu/Hasklig"&gt;&lt;br&gt;
  &lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xad0B38w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://draculatheme.com/static/img/blog/best-free-fonts-for-programming-n.png" alt="Hasklig"&gt;&lt;br&gt;
  &lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's your favorite one?
&lt;/h2&gt;

&lt;p&gt;Fonts, just like themes, are a very personal subject. Different developers like different fonts. Some love ligatures, others hate. Some love italics, others hate.&lt;/p&gt;

&lt;p&gt;Hopefully, this compilation was useful to identify what works best for you. Give it a shot, try them for a couple of days, and you'll notice the difference.&lt;/p&gt;

&lt;p&gt;I'd love to hear which one you like the most. Hit me up on &lt;a href="https://twitter.com/zenorocha"&gt;Twitter&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>fonts</category>
      <category>typography</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Do you speak English?</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Sat, 25 Jul 2020 18:11:06 +0000</pubDate>
      <link>https://dev.to/zenorocha/do-you-speak-english-4kl6</link>
      <guid>https://dev.to/zenorocha/do-you-speak-english-4kl6</guid>
      <description>&lt;p&gt;I've noticed a pattern recently.&lt;/p&gt;

&lt;p&gt;&lt;a class="comment-mentioned-user" href="https://dev.to/dvassallo"&gt;@dvassallo&lt;/a&gt;
 [1], &lt;a class="comment-mentioned-user" href="https://dev.to/arvidkahl"&gt;@arvidkahl&lt;/a&gt;
 [2], and I [3] wrote books in English but we're not native English speakers.&lt;/p&gt;

&lt;p&gt;Some may see this as a weakness. I see this as a strength.&lt;/p&gt;

&lt;p&gt;It doesn't matter where you are from. Don't be afraid to share knowledge.&lt;/p&gt;

&lt;p&gt;[1] - &lt;a href="https://www.indiehackers.com/post/released-an-ebook-17k-sales-in-the-first-2-days-7128933ef2"&gt;$17K sales in the first 2 days&lt;/a&gt;&lt;br&gt;
[2] - &lt;a href="https://www.indiehackers.com/post/zero-to-sold-1000-books-sold-in-7-days-here-are-the-numbers-0954b31c39"&gt;1000+ Books Sold in 7 Days&lt;/a&gt;&lt;br&gt;
[3] - &lt;a href="https://www.indiehackers.com/post/made-3-954-32-in-48-hours-with-my-first-e-book-f1d8ef7b02"&gt;$3,954.32 in 48 hours with my first e-book&lt;/a&gt;&lt;/p&gt;

</description>
      <category>books</category>
    </item>
    <item>
      <title>Working from home</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Mon, 16 Mar 2020 16:32:34 +0000</pubDate>
      <link>https://dev.to/zenorocha/working-from-home-4860</link>
      <guid>https://dev.to/zenorocha/working-from-home-4860</guid>
      <description>&lt;p&gt;For the next two weeks, I'll be working from home.&lt;/p&gt;

&lt;p&gt;I once worked for one year and a half remotely and learned a lot about maintaining focus.&lt;/p&gt;

&lt;p&gt;Here are some tips for those of you who are going through this experience for the first time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Resist the temptation of waking up and starting to work right away. Take your time. Have breakfast. Read a little bit. Then start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go exercise and have a shower before the day starts. This will completely change your productivity. It's an investment of time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routine is not your enemy. Routine is your best ally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be patient and educate others who live with you. They are probably not used to having you at the house.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't eat at your desk. Have lunch away from your computer (and phone).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overcommunicate and be transparent. If you have to step away for some reason, just change your Slack status and let your team know.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Know when to stop.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What are your personal tips?&lt;/p&gt;

</description>
      <category>remote</category>
      <category>wfh</category>
      <category>remotework</category>
    </item>
    <item>
      <title>I made a Color Scheme for Programming Using Math</title>
      <dc:creator>Zeno Rocha</dc:creator>
      <pubDate>Tue, 11 Feb 2020 15:36:39 +0000</pubDate>
      <link>https://dev.to/zenorocha/i-made-a-color-scheme-for-programming-using-math-2ne6</link>
      <guid>https://dev.to/zenorocha/i-made-a-color-scheme-for-programming-using-math-2ne6</guid>
      <description>&lt;p&gt;It's been almost 7 years since I launched Dracula as an open source project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today I'm launching &lt;a href="https://draculatheme.com/pro"&gt;Dracula PRO&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 The problem
&lt;/h2&gt;

&lt;p&gt;In 2013, my laptop was stolen, so I had to re-configure everything. At that time, there were thousands of color schemes for programming out there, but none of them were appealing to me. So I decided to create my own.&lt;/p&gt;

&lt;p&gt;Fast forward to 2020, Dracula is one of the most popular themes in the world with more than 2 million downloads. Still, I felt that something was missing. I wanted to help with &lt;strong&gt;more than just a theme&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 My solution
&lt;/h2&gt;

&lt;p&gt;I decided to create a new color scheme using mathematical concepts to &lt;strong&gt;normalize lightness and saturation&lt;/strong&gt;. I also tested the contrast ratio for better visibility on low-light environments.&lt;/p&gt;

&lt;p&gt;Besides that, I hand-picked 4 monospaced programming fonts that fit perfectly with the theme. These fonts have &lt;strong&gt;built-in ligature support&lt;/strong&gt; that improves readability.&lt;/p&gt;

&lt;p&gt;Dracula PRO is everything I know about color schemes, typography, and productivity tips into one package.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧛‍♂️ What do you think?
&lt;/h2&gt;

&lt;p&gt;I would love to hear your thoughts on this. And if you have any questions, please do comment&lt;/p&gt;

</description>
      <category>darkmode</category>
      <category>theme</category>
      <category>dracula</category>
      <category>vscode</category>
    </item>
  </channel>
</rss>
