<?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: Gustavo Isensee</title>
    <description>The latest articles on DEV Community by Gustavo Isensee (@gustavoisensee).</description>
    <link>https://dev.to/gustavoisensee</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%2F154244%2F690a4174-5b94-4ceb-b89b-ab838b4a355b.jpg</url>
      <title>DEV Community: Gustavo Isensee</title>
      <link>https://dev.to/gustavoisensee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gustavoisensee"/>
    <language>en</language>
    <item>
      <title>🏃‍♂️State management with Zustand!</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Sun, 21 Sep 2025 21:00:00 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/state-management-with-zustand-14h3</link>
      <guid>https://dev.to/gustavoisensee/state-management-with-zustand-14h3</guid>
      <description>&lt;h2&gt;
  
  
  Managing State in React with Zustand
&lt;/h2&gt;

&lt;p&gt;State management in React can get pretty messy if you don’t pick the right tool. You start with &lt;code&gt;useState&lt;/code&gt;, then you raise it up to &lt;code&gt;useContext&lt;/code&gt;, then suddenly your app feels like it's participating in a circus and juggling props all over the place. That’s where &lt;strong&gt;Zustand&lt;/strong&gt; strolls in, clean and minimal, like that one friend who doesn’t overcomplicate dinner plans.  &lt;/p&gt;

&lt;p&gt;Let’s explore how to manage a &lt;strong&gt;list of users&lt;/strong&gt; across multiple components using Zustand.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Zustand?
&lt;/h2&gt;

&lt;p&gt;Zustand is a &lt;strong&gt;small but powerful&lt;/strong&gt; state management library. Unlike Redux (which sometimes feels like filing taxes), Zustand has no boilerplate ceremony, just plain simple functions.  &lt;/p&gt;

&lt;p&gt;Key benefits:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tiny and fast 🏎️
&lt;/li&gt;
&lt;li&gt;No reducers, actions, or ceremony 🎉
&lt;/li&gt;
&lt;li&gt;Works great with React hooks 👌
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Requirements Recap
&lt;/h2&gt;

&lt;p&gt;To run this little app, you just need:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React (v18+)
&lt;/li&gt;
&lt;li&gt;Node &amp;amp; npm installed
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zustand&lt;/code&gt; package installed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Store
&lt;/h2&gt;

&lt;p&gt;Let’s create a store for our users.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now, define a store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// store/userStore.js&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;create&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;zustand&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;useUserStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kd"&gt;set&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="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;

  &lt;span class="na"&gt;addUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newUser&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;set&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newUser&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;

  &lt;span class="na"&gt;removeUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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;set&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;useUserStore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what’s happening:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;users&lt;/code&gt; holds our list of users.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;addUser&lt;/code&gt; lets us push a new user.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;removeUser&lt;/code&gt; helps us clean up users 👋.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Displaying the User List
&lt;/h2&gt;

&lt;p&gt;We’ll need a component to &lt;strong&gt;show&lt;/strong&gt; the users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/UserList.js&lt;/span&gt;
&lt;span class="k"&gt;import&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;useUserStore&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;../store/userStore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserList&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUserStore&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&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;removeUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUserStore&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &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;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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="nx"&gt;user&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="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;removeUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;❌&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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;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="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we’re pulling users directly from the store with &lt;code&gt;useUserStore&lt;/code&gt;. No prop drilling. No tears.  &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a New User
&lt;/h2&gt;

&lt;p&gt;We also need a form (or a button) to add users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/AddUser.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&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&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="nx"&gt;useUserStore&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;../store/userStore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;AddUser&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="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;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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;addUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUserStore&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addUser&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;addUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&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="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="nx"&gt;value&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;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&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;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter user name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;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;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Add&lt;/span&gt; &lt;span class="nx"&gt;User&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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AddUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a way to actually &lt;em&gt;add&lt;/em&gt; new users.  &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It Together
&lt;/h2&gt;

&lt;p&gt;Finally, use both components in your &lt;code&gt;App&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// App.js&lt;/span&gt;
&lt;span class="k"&gt;import&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AddUser&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;./components/AddUser&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="nx"&gt;UserList&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;./components/UserList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Zustand&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;Management&lt;/span&gt; &lt;span class="err"&gt;🐻&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AddUser&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserList&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Zustand makes state management less painful. Instead of dealing with reducers and dispatchers (hello, Redux), you just &lt;strong&gt;call functions&lt;/strong&gt;. Your code stays readable, and your state stays centralized.  &lt;/p&gt;

</description>
      <category>react</category>
      <category>state</category>
      <category>zustand</category>
    </item>
    <item>
      <title>🚀 Expose your localhost with 1 command line!</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Wed, 20 Aug 2025 09:07:37 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/expose-your-localhost-with-1-command-line-7d3</link>
      <guid>https://dev.to/gustavoisensee/expose-your-localhost-with-1-command-line-7d3</guid>
      <description>&lt;h2&gt;
  
  
  Expose your wepapp with localtunnel
&lt;/h2&gt;

&lt;p&gt;Ever needed to show a local app to a teammate, a webhook, or a QA engineer who “doesn’t run things locally”? Enter localtunnel: the zero-config way to publish your localhost to the internet with a sharable URL. It’s like handing your app a passport and telling it to go see the world—safely, temporarily, and without DNS rituals.&lt;/p&gt;

&lt;p&gt;Below is a quick guide with a tiny Node.js + Express “Hello, world!” and how to expose it using the localtunnel library.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What is localtunnel?
&lt;/h2&gt;

&lt;p&gt;localtunnel creates a secure tunnel from a public URL to a port on your machine. You run your app on, say, localhost:3000, and localtunnel gives you a URL like &lt;a href="https://curly-pigs-play.loca.lt" rel="noopener noreferrer"&gt;https://curly-pigs-play.loca.lt&lt;/a&gt; that forwards traffic to your local server. Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing webhooks from Stripe/GitHub/Twilio&lt;/li&gt;
&lt;li&gt;Sharing in-progress UI with teammates&lt;/li&gt;
&lt;li&gt;Quick demos without deploying&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+ (or at least a modern LTS)&lt;/li&gt;
&lt;li&gt;npm or yarn&lt;/li&gt;
&lt;li&gt;An open port (we’ll use 3000)&lt;/li&gt;
&lt;li&gt;Internet connection (the tunnel fairy needs it)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Project Setup
&lt;/h2&gt;

&lt;p&gt;Let’s spin up a tiny Express app and then tunnel it.&lt;/p&gt;

&lt;p&gt;1) Initialize a project&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;mkdir &lt;/span&gt;lt-express-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;lt-express-demo
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Create a minimal Express server&lt;/p&gt;

&lt;p&gt;Create a file named server.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="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="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="nf"&gt;send&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&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="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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Local server listening on http://localhost:3000&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;3) Run it locally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it works at &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;. You should see “Hello, world! 👋”.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Using localtunnel via CLI
&lt;/h2&gt;

&lt;p&gt;You can run your server as usual and in another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx localtunnel &lt;span class="nt"&gt;--port&lt;/span&gt; 3000
&lt;span class="c"&gt;# or with subdomain&lt;/span&gt;
npx localtunnel &lt;span class="nt"&gt;--port&lt;/span&gt; 3000 &lt;span class="nt"&gt;--subdomain&lt;/span&gt; my-snazzy-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prints a public URL. Keep that process running to keep the tunnel open.&lt;/p&gt;

&lt;p&gt;You or whoever access the URL will be asked a password, so, when you share you localtunnel link make sure you run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://loca.lt/mytunnelpassword
&lt;span class="c"&gt;# or&lt;/span&gt;
wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; - https://loca.lt/mytunnelpassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grab the IP address from the output, and share it with the person you're sharing your localtunnel link, because they'll be asked for a password and the IP address you got is the password 😉.&lt;br&gt;
Just paste the password and hit Submit and that's it.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Tips, Quirks, and Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subdomains are “best-effort.” If it’s taken, localtunnel will hand you a random animal-party URL. Embrace the chaos.&lt;/li&gt;
&lt;li&gt;Tunnels are temporary. When the process dies, the URL goes poof.&lt;/li&gt;
&lt;li&gt;For webhooks, set the service’s callback URL to your public tunnel URL (e.g., &lt;a href="https://purple-mongoose-123.loca.lt/webhooks/stripe" rel="noopener noreferrer"&gt;https://purple-mongoose-123.loca.lt/webhooks/stripe&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Don’t expose sensitive admin panels without auth. Tunnels are public by design.&lt;/li&gt;
&lt;li&gt;Firewalls/Corporate networks can be “fun.” If the tunnel can’t connect, check outbound restrictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;localtunnel is a tiny tool that punches way above its weight—perfect for demos, webhooks, and “can you just check this real quick?” moments. Pair it with a simple Express “Hello, world!” and you’ve got the world’s fastest shareable prototype. Now go forth and tunnel like it’s 1999 dial-up, but faster and much less screechy.&lt;/p&gt;

</description>
      <category>localtunnel</category>
      <category>exposelocalhost</category>
      <category>localhost</category>
    </item>
    <item>
      <title>🐳 Setting up MySQL on Docker container in 2 minutes</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Thu, 21 Dec 2023 08:28:03 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/setting-up-mysql-on-docker-container-in-2-minutes-5b5o</link>
      <guid>https://dev.to/gustavoisensee/setting-up-mysql-on-docker-container-in-2-minutes-5b5o</guid>
      <description>&lt;p&gt;I wanna bring you today something simple that helped me a lot and I hope it can help some of you.&lt;/p&gt;

&lt;p&gt;Let's set up our environment to support all this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. First make sure you have docker installed (&lt;a href="https://formulae.brew.sh/formula/docker" rel="noopener noreferrer"&gt;brew&lt;/a&gt; | &lt;a href="https://docs.docker.com/desktop/" rel="noopener noreferrer"&gt;docker website&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;2. then download &lt;a href="https://hub.docker.com/r/mysql/mysql-server/" rel="noopener noreferrer"&gt;mysql-server&lt;/a&gt; image.&lt;/li&gt;
&lt;li&gt;3. and finally creating the container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just follow these steps:&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;# 1. Installing docker via Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;docker

&lt;span class="c"&gt;# 2. Downloading mysql-server image to docker context&lt;/span&gt;
docker pull mysql/mysql-server

&lt;span class="c"&gt;# 3. Creating the container with the image downloaded&lt;/span&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_container &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;% &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_database &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; 3306 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; mysql/mysql-server:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you wanna know more about the variables I'm setting up there you can find all the details &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-environment-variables" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;you can quickly run &lt;code&gt;docker stats&lt;/code&gt; just to see if you container is up and running.&lt;/p&gt;

&lt;p&gt;if all is good, you should be able to connect via &lt;a href="https://sequel-ace.com/" rel="noopener noreferrer"&gt;Sequel Ace&lt;/a&gt; now.&lt;/p&gt;

&lt;p&gt;but before run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker port my_container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so you know which ports to connect.&lt;br&gt;
on my case I had this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;3306/tcp -&amp;gt; 0.0.0.0:60245
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means if I open Sequel Ace now I should fill the form as following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Name: whatever you like
Host: localhost
Username: root
Password: root
Database: my_database
Port: 60245:3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà!&lt;/p&gt;

&lt;h3&gt;
  
  
  Backup your container
&lt;/h3&gt;

&lt;p&gt;In order to backup the container we have to take a few steps here:&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;# 1. We need to commit to create a local image. copy the &lt;/span&gt;
&lt;span class="c"&gt;# image id returned on this step.&lt;/span&gt;
docker commit my_container

&lt;span class="c"&gt;# 2. Rename your image by creating a tag&lt;/span&gt;
docker tag image_id new_image_name

&lt;span class="c"&gt;# 3. We save the local image into a .tar file&lt;/span&gt;
docker save &lt;span class="nt"&gt;-o&lt;/span&gt; ./Documents/my_image_backup.tar new_image_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Import and use the Backup
&lt;/h3&gt;

&lt;p&gt;And in order to import we need to follow these steps:&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;# 4. We need to load the .tar file &lt;/span&gt;
docker load &lt;span class="nt"&gt;-i&lt;/span&gt; ./Documents/my_image_backup.tar

&lt;span class="c"&gt;# 5. Finally we can create our new container with the new image.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_container_v2 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;% &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_database &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; 3306 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; new_image_name:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, that's it, as I said it's quite simple, just a few commands and we have mysql up and running, and you also learned how to backup and restore the container/image.&lt;/p&gt;

&lt;p&gt;I hope this was helpful, see you on the next one!&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>docker</category>
    </item>
    <item>
      <title>🔨 Scrum in a very short story!</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Wed, 31 Aug 2022 20:44:42 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/scrum-in-a-very-short-story-5g2n</link>
      <guid>https://dev.to/gustavoisensee/scrum-in-a-very-short-story-5g2n</guid>
      <description>&lt;p&gt;Are you a little tired of all those huge explanation about Scrum? well then, this text is for you.&lt;br&gt;
Here I have summarised what scrum is, its main events and tools, roles and responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 Let's get started with, What's Scrum?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scrum is a framework that helps teams work together.&lt;/li&gt;
&lt;li&gt;It focus on incremental delivers and helps to generate value through adaptive solutions for complex problems.&lt;/li&gt;
&lt;li&gt;Scrum encourages teams to learn through experiences, self-organize while working on a problem, and reflect on their wins and losses to continuously improve.&lt;/li&gt;
&lt;li&gt;With scrum, a product is built in a series of iterations called sprints that break down big, complex projects into bite-sized pieces.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Scrum pillars:&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;Transparency: work must be visible to those performing the work as well as those receiving the work. it enables inspection.&lt;/li&gt;
&lt;li&gt;Inspection: the work needs to be inspect to detect potential issues. it enables adaptation.&lt;/li&gt;
&lt;li&gt;Adaptation: if the work is out of acceptable, adaptation are required as soon as possible to minimize further deviation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Scrum values:&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;Commitment, Focus, Openness, Respect and Courage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Scrum mechanisms/events/tools consist on:&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;Backlog&lt;/li&gt;
&lt;li&gt;Sprint (usually 1 month cycle or less)&lt;/li&gt;
&lt;li&gt;Sprint planning (sprint start)&lt;/li&gt;
&lt;li&gt;Daily meetings also known as stand-ups&lt;/li&gt;
&lt;li&gt;Sprint review (demo)&lt;/li&gt;
&lt;li&gt;Retrospective&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🪣 What’s a backlog?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A product backlog is a prioritised list of work for the development team that is derived from the roadmap and its requirements.&lt;/li&gt;
&lt;li&gt;Product owner is responsible for prioritise, organize and define it, with the help of scrum master and the development team.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📅 What’s a Sprint?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A sprint is a short, time-boxed period when a scrum team works to complete a set amount of work.&lt;/li&gt;
&lt;li&gt;They’re usually time-boxed in 1 month or less (on my team we do 2 weeks).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📃 What’s Sprint planning?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sprint planning is an event in scrum that kicks off the sprint.&lt;/li&gt;
&lt;li&gt;Define what can be delivered in the sprint and how that work will be achieved.&lt;/li&gt;
&lt;li&gt;It is done in collaboration with the whole scrum team.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤝🏻 What are Daily meetings / Stand-ups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Daily meetings as they name suggests, are very short meetings to share some issues, blockers and possible highlights, try not to dive too much in details here.&lt;/li&gt;
&lt;li&gt;It keeps the team informed, connected, and calibrated throughout the sprint.&lt;/li&gt;
&lt;li&gt;Also kwon as daily scrum, and reinforces “we” to keep everyone aware of the team’s landscape and progress.&lt;/li&gt;
&lt;li&gt;Try to keep it simple, what did you do yesterday, doing today and if there’s any blocker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✨ What’s Sprint review?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A sprint review is about demonstrating the hard work of the entire team.&lt;/li&gt;
&lt;li&gt;Team members gather around a desk for informal demos and describe the work they’ve done for that iteration.&lt;/li&gt;
&lt;li&gt;Sharing in success is an important part of building an agile team.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏢 What’s Retrospective
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A retrospective is anytime your team reflects on the past to improve the future.&lt;/li&gt;
&lt;li&gt;Basically a meeting to reflect about what has been good, bad and improvements for the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🫂 Building up a Scrum team
&lt;/h2&gt;

&lt;p&gt;Scrum team should be composed of 3 main roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development (Designers, Architect, Developers, Writes and etc)&lt;/li&gt;
&lt;li&gt;Scrum master&lt;/li&gt;
&lt;li&gt;Product Owner&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Development
&lt;/h2&gt;

&lt;p&gt;The development team should be able to self-organize so they can make decisions to get work done.&lt;/p&gt;

&lt;p&gt;The development team’s responsibilities are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivering the work through the sprint.&lt;/li&gt;
&lt;li&gt;Ensure transparency during the daily meetings.

&lt;ul&gt;
&lt;li&gt;Daily meetings provide a dedicated place for team members to seek help, talk about success and highlight issues and blockers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Attend to meeting and contribute with ideas and/or solutions.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  🦮 Scrum Master
&lt;/h2&gt;

&lt;p&gt;The scrum master is the role responsible for gluing everything together and ensuring that scrum is being done well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helps the product owner define value&lt;/li&gt;
&lt;li&gt;Helps the product owner to better understand and communicate value, to manage the backlog, help them plan the work with the team and break it down.&lt;/li&gt;
&lt;li&gt;Helps the development team to self-organize, focus on outcomes, get to a “done increment,” and manage blockers.&lt;/li&gt;
&lt;li&gt;Helps the organization to understand what scrum is and create an environment that supports scrum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the scrum master’s responsibilities are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilitate (scrum meetings in general)&lt;/li&gt;
&lt;li&gt;Transparency&lt;/li&gt;
&lt;li&gt;Self organization&lt;/li&gt;
&lt;li&gt;Protecting the team&lt;/li&gt;
&lt;li&gt;Empiricism&lt;/li&gt;
&lt;li&gt;Scrum values&lt;/li&gt;
&lt;li&gt;Remove blockers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🙂 Product Owner
&lt;/h2&gt;

&lt;p&gt;The owner of the product has lots of decisions to make and lots of responsibilities, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting a clear goal for the sprint&lt;/li&gt;
&lt;li&gt;Ensure that they are delivering the most value&lt;/li&gt;
&lt;li&gt;Managing stakeholders expectation&lt;/li&gt;
&lt;li&gt;Managing the scrum backlog&lt;/li&gt;
&lt;li&gt;And he/she should not only understand the customer, but also have a vision for the value the scrum team is delivering to the customer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Some sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.scrum.org/resources/what-is-scrum" rel="noopener noreferrer"&gt;Scrum.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/agile/scrum" rel="noopener noreferrer"&gt;Atlassian Scrum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scrumguides.org/" rel="noopener noreferrer"&gt;Scrum Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what I have to share so far, I might be increment it a little bit here and there in the near future.&lt;br&gt;
Another thing I'd like to add, is that on my team currently we also have a meeting called refinements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refinements (technical or not), are important when the proposed solution made by PO and UX might lack on details or how to achieve that, on these meetings we try to include the whole scrum team to discuss better how we can achieve that goal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you have enjoyed it! have a great week!&lt;/p&gt;

&lt;p&gt;Cheers&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>agile</category>
    </item>
    <item>
      <title>🔌 How to become a Senior developer</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Mon, 18 Jul 2022 18:15:48 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/how-to-become-a-senior-developer-42fl</link>
      <guid>https://dev.to/gustavoisensee/how-to-become-a-senior-developer-42fl</guid>
      <description>&lt;h2&gt;
  
  
  First things first
&lt;/h2&gt;

&lt;p&gt;Before anything, try to do a few things: be kind and flexible.&lt;/p&gt;

&lt;h4&gt;
  
  
  🙂 Be kind
&lt;/h4&gt;

&lt;p&gt;This isn't just a quality to be a great senior but take it to life, be kind to the person next to you and they'll be kind back to you, for sure, kindness only creates kindness.&lt;/p&gt;

&lt;h4&gt;
  
  
  😎 Be flexible
&lt;/h4&gt;

&lt;p&gt;Believe me when I tell you that I've met "senior" devs that said to me, this is the only way, and I won't do any different, and that's it. flexible in this context is be open, listen, try new things and be eager to learn from whoever has something to teach you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secondly
&lt;/h2&gt;

&lt;p&gt;Being a Senior involves more than coding or communicating, it's a combination of lots of things, in my humble opinion.&lt;/p&gt;

&lt;p&gt;Personal and Technical skills. you might have seen this in other blog posts as Soft and Hard Skills, basically the same thing, but personally I don't like to call them Soft and Hard skills.&lt;/p&gt;

&lt;p&gt;I want to share with you what I consider important personal and technical skills for work, you might think some of them are unnecessary or a little exaggeration, and you know what, that's fine, because being flexible and accept what others have to say about you or your coding skills is part of the process to be a great Senior.&lt;/p&gt;

&lt;p&gt;So, let's have a look at the Personal skills first.&lt;/p&gt;

&lt;h2&gt;
  
  
  👩‍🎤 Personal Skills
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;li&gt;Proactivity&lt;/li&gt;
&lt;li&gt;Self-taught&lt;/li&gt;
&lt;li&gt;Flexible&lt;/li&gt;
&lt;li&gt;Teamwork&lt;/li&gt;
&lt;li&gt;Problem-solving&lt;/li&gt;
&lt;li&gt;Time management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then, the Technical Skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧳 Technical Skills
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Concept, designs and methodology domain&lt;/li&gt;
&lt;li&gt;Coding&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Software deployment process&lt;/li&gt;
&lt;li&gt;Foreign language proficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And these are all the keys I consider the principle of being a great Senior, and of course I'll go through each of them, and I know I might loose some of you, but believe me, you want to understand each of these keys to achieve some seniority 😄.&lt;/p&gt;

&lt;p&gt;Anyways, less talk more explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  👩‍🎤 Personal Skills
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Communication
&lt;/h3&gt;

&lt;p&gt;Being communicative does not mean, keep chatting all day long with your colleagues, although some chatting is nice to have. it is about process, talk to your designs, talk to your PO/PM, say what you think, contribute with your knowledge, explain to other devs kindly what can be improved, inform the team of issues, really participate on daily meeting (standup), be there, present, ask questions, listem to them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proactivity
&lt;/h3&gt;

&lt;p&gt;Did you finish your ticket? nothing else todo? well, be proactive, ask a colleague if there's anything you can help with, pick up the next thing, read a blog post, test some new tech, create technical improvements tickets, try something, I'm sure you can find something to have some fun as developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-taught
&lt;/h3&gt;

&lt;p&gt;Tech is always changing, so do you, read a book, check tech twitter ever now and then, follow tech influencers, library/frameworks blog, youtube is your friend, lots of content there, make a todo list of things you wanna learn, you don't necessarily need to be an expert on what you're learning, but have fun and study!&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexible
&lt;/h3&gt;

&lt;p&gt;Honestly, this is my favorite, be flexible will help you not just at work, but in you personal life, accept criticism, reflect about it, change if you must, or not, but listen more and respect each other, be kind, he/she might be your colleague for a very long time, better to have a friend than an enemy at work 😅.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teamwork
&lt;/h3&gt;

&lt;p&gt;If you work for a company, you and your colleagues are in the same boat rowing to the same direction, if just 1 person rows while the other 9 watch, you might not end up in anywhere, and it is also pretty unfair with your colleague. so, let's help each other, on meetings, or your day-to-day check with your colleagues, if there is anything you can help with, of course, manage your time between helping your colleagues and finishing your tasks, but be there when they need you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem-solving
&lt;/h3&gt;

&lt;p&gt;Catch a problem up, give some suggestions, solutions or any alternative, if nothing comes to your mind, be smart about it, say you do not have a solution from the top of your head, but you already took notes, and you're gonna research about and bring a possible solution as soon as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time management
&lt;/h3&gt;

&lt;p&gt;In your daily basis you might have so many things to do, read emails, tickets and other instructions, then a few meetings, coding, helping colleagues. I know it is a lot, but manage your time with tools like google calendar, organize your personal agenda, take notes of everything that you say that you'd check later, go through a step-by-step, give estimation, be reasonable again, flexible, not because it's written in your notes that is set in stone.&lt;/p&gt;

&lt;p&gt;well, I think this cover a bit of each of the personal skills, let's go for the Technical skills:&lt;/p&gt;

&lt;h2&gt;
  
  
  🧳 Technical Skills
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Concept, designs and methodology domain
&lt;/h3&gt;

&lt;p&gt;Nowadays there are a lot of new developers out there, lots of them don't know any concept, designs and methodology, they simply build CRUDs without thinking of scalability, maintainability and etc. Understanding how a language is converted to binary might be too much in some cases, but it helps, make sure you know basic concepts like functional programming and object oriented programming, singleton, inheritance, polymorphism, interfaces, recurring, etc and learn also about designs systems, agile methodology and more, even if you're a Frontend developer, be aware of all the things that happen in the Backend, and other way around, and make sure you know the most used technologies, study the advanced techniques, understand the language and the most useful of its API, go beyond!&lt;/p&gt;

&lt;h3&gt;
  
  
  Coding
&lt;/h3&gt;

&lt;p&gt;Despite of any framework, library or language, developers should learn one thing first: Algorithm.&lt;br&gt;
If you wanna be a Senior Developer, do not be a X language developer, be Algorithm Developer, language is learnable over time, algorithm is the core of anything and must be learn at first because as a developer, that's the thing you'll use everyday, sometimes, even when you're not actually coding, but thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;I know for some of you test is boring, doesn't aggregate on the feature itself you might be thinking, but try to see it from another perspective, what if your function of 50 lines is used all around the code base, more than 100 times called, and someone has to do a few changes on it, probably two things will happen, it's gonna break in the other 99 places, or the saint developer mapped all the places it was used and tested all the possible places and fixed them all but spent way too much time doing an undesirable work. testing is about maintenance, make sure your code won't break, that you product is reliable, solid and functional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software deployment process
&lt;/h3&gt;

&lt;p&gt;Again, you don't need to be a DevOps expert to at least understand how deployment process work, execute it is another story, and nowadays you might not need to do anything because there's a dedicated team to take care of the projects deployment, but again, study about continuous deployment, continuous integration, build and deploy processes, artifacts, docker, kubernetes and etc. also each company is a different company and the way they deploy might differ from one another, however being aware of how these things work make you more trustworthy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foreign language proficiency
&lt;/h3&gt;

&lt;p&gt;In my humble opinion, communication (Personal skill) is of the keys to be a great developer, perhaps second is foreign language proficiency, because it walks along with communication, but in short, express yourself, make sure people understand what you say, try to practice the idiom more, listen and read in the foreign language, without practising you won't reach the proficiency required from you, so, make an effort and be also great in foreign language proficiency.&lt;/p&gt;

&lt;p&gt;And this concludes all the topics I had to share, I really hope these things give you some insights, I also know that I'm not a writer and some things might had come a bit wrongly but the idea here, is to bring you some of my own ideas of what I consider a good set of skills to be a great senior developer. feel free to comment, discuss and disagree, I'm all ears. wish you all the best and thanks for sticking until the end!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Building your own Javascript Library with bare minimum</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Wed, 29 Jun 2022 15:15:56 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/building-your-own-javascript-library-with-bare-minimum-4c5h</link>
      <guid>https://dev.to/gustavoisensee/building-your-own-javascript-library-with-bare-minimum-4c5h</guid>
      <description>&lt;h2&gt;
  
  
  😄 Summarizing a bit, shall we?:
&lt;/h2&gt;

&lt;p&gt;As you might know there are a lot of Javascript bundlers out there, such as &lt;a href="https://webpack.js.org/" rel="noopener noreferrer"&gt;webpack&lt;/a&gt;, &lt;a href="https://sucrase.io/" rel="noopener noreferrer"&gt;sucrase&lt;/a&gt;, &lt;a href="https://parceljs.org/" rel="noopener noreferrer"&gt;parcel&lt;/a&gt;, &lt;a href="https://rollupjs.org/guide/en/" rel="noopener noreferrer"&gt;rollup&lt;/a&gt; and etc.&lt;br&gt;
Bear in mind, not because they have thousands of stars on Github that means they're the best. sometimes new libs are as good as the popular ones but they're still building up their image/popularity in the community. what I bring today is a not sooooo, popular JS bundler called &lt;a href="https://esbuild.github.io/" rel="noopener noreferrer"&gt;esbuild&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those who don't really know what a bundler does, here is a very simple explanation:&lt;br&gt;
Your Javascript application might get bigger and bigger, so, you break it down in several files but you want to export everything in one or a few files, bundlers compile, transpile, compact, uglify, minify and other things for you. some have more features than others, and you need to analyse which one is better for your case.&lt;/p&gt;

&lt;p&gt;But I will focus on &lt;strong&gt;esbuild&lt;/strong&gt; in this article. so, let's check it out.&lt;/p&gt;
&lt;h2&gt;
  
  
  🏢 Why esbuild?
&lt;/h2&gt;

&lt;p&gt;It supports all the new ecmascript specification and it is extremely faster than parcel, webpack and rollup.&lt;br&gt;
you might be asking, but how? here are some points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's written in Go and compiles to native code.&lt;/li&gt;
&lt;li&gt;Parallelism is used heavily.&lt;/li&gt;
&lt;li&gt;Everything in esbuild is written from scratch.&lt;/li&gt;
&lt;li&gt;Memory is used efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read more about each of these items &lt;a href="https://esbuild.github.io/faq/#why-is-esbuild-fast" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;br&gt;
and here some comparison I took from esbuild &lt;a href="https://esbuild.github.io/" rel="noopener noreferrer"&gt;website&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl98jf2f80ndc3jl49o0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl98jf2f80ndc3jl49o0m.png" alt=" " width="782" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, now that's proved that esbuild is very very veeeeery fast, let's get started with our first Javascript library.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧑‍💻 Start coding
&lt;/h2&gt;

&lt;p&gt;I love the KISS principle, so, let's keep it simple, open your terminal, navigate where you wanna have your project folder and follow these steps:&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Let's just create the folder and get in:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-library &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-library
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Initialise git and package.json
&lt;/h4&gt;

&lt;p&gt;I'll be using &lt;a href="https://yarnpkg.com/getting-started/install" rel="noopener noreferrer"&gt;yarn&lt;/a&gt;, if you wanna use yarn make sure you have it installed, or use npm equivalents commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
yarn init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and don't forget to add these lines on your &lt;code&gt;.gitignore&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Now let's install some packages
&lt;/h4&gt;

&lt;p&gt;I'll be installing, only 3 packages: &lt;code&gt;esbuild&lt;/code&gt;, &lt;code&gt;rimraf&lt;/code&gt; and &lt;code&gt;typescript&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;yarn add esbuild rimraf typescript &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rimraf&lt;/code&gt; makes sure you can clean the folder specified in any OS, in case you have a CI on Windows, linux os macOS, all should be cleaned by rimraf.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;typescript&lt;/code&gt; is very powerful and if you're not using it yet, please consider reading about the benefits of it.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Editing &lt;code&gt;package.json&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Add in your package.json file the following lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib/index.js"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib/index.d.ts"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&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;"ts-types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rimraf lib &amp;amp;&amp;amp; yarn ts-types &amp;amp;&amp;amp; node ./esbuild.js"&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;h4&gt;
  
  
  5. Create esbuild config
&lt;/h4&gt;

&lt;p&gt;Create a file called &lt;code&gt;esbuild.js&lt;/code&gt; on the root of the project:&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;esbuild.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;esbuild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esbuild&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;esbuild&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;entryPoints&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;src/index.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;outdir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sourcemap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;minify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;splitting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;target&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;esnext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;ignoreAnnotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope they're self-explanatory, if not, you can check the esbuild configuration api &lt;a href="https://esbuild.github.io/api/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.: If you're building a library for applications that don't support &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;export&lt;/code&gt; from &lt;code&gt;esm&lt;/code&gt; format, then consider using &lt;code&gt;format: "cjs"&lt;/code&gt;. then remove &lt;code&gt;splitting&lt;/code&gt; and edit format to &lt;code&gt;"cjs"&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Let's create &lt;code&gt;tsconfig.json&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;In case you decided not to have typescript, you can skip this step, otherwise follow these:&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;tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;"compilerOptions"&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;"emitDeclarationOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"declaration"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lib"&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;"es6"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"noImplicitAny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"esModuleInterop"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moduleResolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skipLibCheck"&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="nl"&gt;"include"&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;"src/**/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&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;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/*.test.*"&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;Again, I hope they're self-explanatory, if not you can check typescript config api &lt;a href="https://www.typescriptlang.org/docs/handbook/tsconfig-json.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  7. You're ready to start coding
&lt;/h4&gt;

&lt;p&gt;First, let's create a &lt;code&gt;src&lt;/code&gt; folder and a &lt;code&gt;index.ts&lt;/code&gt; file:&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;mkdir &lt;/span&gt;src &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;src/index.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's do something very simple for testing purpose,&lt;br&gt;
Create a sum and times functions that are exported, so we check them later from another context.&lt;br&gt;
open your &lt;code&gt;index.ts&lt;/code&gt; and add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&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;times&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&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;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  8. Now let's use it
&lt;/h4&gt;

&lt;p&gt;if you used &lt;code&gt;format: "esm"&lt;/code&gt; make sure you application supports &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;export&lt;/code&gt; feature. then you can simply do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;times&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;./lib/index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// path might differ where you are.&lt;/span&gt;

&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;span class="nf"&gt;times&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and in case you're using &lt;code&gt;format: "csj"&lt;/code&gt;, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myLib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;myLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;span class="nx"&gt;myLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In conclusion
&lt;/h2&gt;

&lt;p&gt;I know it's quite a long post, but still, very simple and pragmatic. In practice we created a super tiny javascript library with &lt;code&gt;esbuild&lt;/code&gt; and &lt;code&gt;typescript&lt;/code&gt; with only 3 libs, and this can be improved even more, maybe &lt;code&gt;nodemon&lt;/code&gt; to rebuild every time you change something in your src folder, testing with &lt;code&gt;jest&lt;/code&gt;, or publishing it to npm, and other nice things. but so far, we got something useful, powerful and simple, easy to maintain and way faster than some of the bundlers mentioned, so, I hope you liked it, more posts coming up soon, see you next soon!&lt;/p&gt;

</description>
      <category>library</category>
      <category>esbuild</category>
    </item>
    <item>
      <title>✨ Challenges to get a job in Europe</title>
      <dc:creator>Gustavo Isensee</dc:creator>
      <pubDate>Tue, 21 Jun 2022 20:01:56 +0000</pubDate>
      <link>https://dev.to/gustavoisensee/challenges-to-get-a-job-in-europe-256g</link>
      <guid>https://dev.to/gustavoisensee/challenges-to-get-a-job-in-europe-256g</guid>
      <description>&lt;p&gt;I wrote this article around 5 years ago when I recently moved to the Netherlands, although it was in Portuguese, this is a mere translation but I thing it is still valid for those who are on the same battle I fought years ago: trying to get a job in Europe not being an European.&lt;/p&gt;

&lt;p&gt;So, here you go 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I'll try to be very succinct, practical and objective so that the reading doesn't get so boring. For those who don't know me, I'm Gustavo and I've been working on web development for 9 years, I started with Java, then VB.NET with webforms, then C# with MVC.NET and Kendoui, in case you do not know what kendoui is, click on the &lt;a href="https://www.telerik.com/kendo-ui" rel="noopener noreferrer"&gt;link&lt;/a&gt; and check it out ;) and finally currently working more focused on the frontend with React + Redux and of course, NodeJS. super summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why leave Brazil?
&lt;/h2&gt;

&lt;p&gt;In 2010 I had something called epiphany, I felt that Brazil was changing and things would get better, protests, corrupt politicians falling among other things, but then I thought, I'm young, 22 years old, and I'm sure this will take some time, at least about 30 to 50 years, I don't want to go through this phase, I want a nice life, travel, tranquility and etc, at the time I researched many places and saw a possibility of moving to Canada, the country is beautiful, clean, organised, everything  works very well and I thought, that's where I'm going to live, so, closing this topic this was my motivation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next plans
&lt;/h2&gt;

&lt;p&gt;Is it possible for us simple human beings in the technology field to immigrate to Canada? yes, IT IS! and IT folks are very welcome in Canada, however, Canada has a scoring scheme and it is "slightly" competitive. I only had a technical course at the time and I decided to start my bachelor, this was in 2011, because one of the things you certainly get a lot of points for, is with the damn bachelor degree, so I drew up the following plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bachelor degree&lt;/li&gt;
&lt;li&gt;English&lt;/li&gt;
&lt;li&gt;Immigrate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Easy, very simple, it would still be competitive, but it would be ahead of many other candidates, then the battle started, I was not born in a golden cradle, so my dear friends, it was 8 hours of working day, 4 hours of college at night, and around midnight 1 hour of gym because yes, and I like it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graduated and going for English
&lt;/h2&gt;

&lt;p&gt;So, I graduated in June 2015, and I thought, I'm tired as fuck of studying, I don't even want to know about English now, haha, I spent 6 months relaxing, important tip: busy mind doesn't work, sometimes it is necessary to relax, maybe not 6 months, but a few weeks is cool, it's part of the game. but I started to focus in January 2016 again, I started studying English with my dear Teacher Jakeline, to whom I am very grateful for all the learning.&lt;/p&gt;

&lt;p&gt;I ended up not telling it at first because it wasn't the focus, but in May 2016 my girlfriend and I were completing 10 years together, and I wanted to do something special for her, she always wanted to visit France, seeing that pile of cluttered iron that everyone loves, this, that thing, eh, Eiffel Tower, this one, anyway. I thought and rethought, the money is short but it's ok, let's go to Amsterdam, &lt;strong&gt;What???&lt;/strong&gt; wait, wasn't it Paris?, Eh, more or less, short in money, not very proficient in English yet, I thought I'm going to Amsterdam, because I have friends living there, I stay at their place, I know a nice place and I still give her a great  dating gift, and guys, it went very well, she and I went to Amsterdam, it was fun, the city is beautiful, fantastic, as perfect as Canada or even more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change of plans
&lt;/h2&gt;

&lt;p&gt;Coming back from Europe, I had many ideas in my head, my girlfriend had already mentioned several times about going to live in Europe before Canada, for thousands of reasons, but the ones that weighed the most on this decision were: Cost and Time, if I lived in Canada, I would certainly like to travel to Europe from time to time, visit other countries, and my friends there, when you get on an 11 hours flight to travel from continent to continent, even more so when you are 191 cm tall, in the economy class, it's just sad, and very painful and the f**king time doesn't pass. All this and other things made me think about my decision of where to live, and I thought I'm going to continue studying English for another year and then I'm going to start applying to Europe, I'm not going to get out of my plans so much, I just changed the country, so, let's go.&lt;/p&gt;

&lt;h2&gt;
  
  
  One year later
&lt;/h2&gt;

&lt;p&gt;Not graduated in English, as they were private classes, usually two classes of 1.5 hours, totalling 3 hours a week, with some absences and setbacks, I believe that 1 year and 4 months of English I was already communicating, this means that I could have a conversation, explains things, talk about code and many other things, it's equivalent to an intermediate level, from then on it's vocabulary, phrasal verbs and practice. In April 2017 I really started applying for some vacancies, I think in a total of 25, I had interviews every week, the &lt;code&gt;no's&lt;/code&gt;, &lt;code&gt;maybe's&lt;/code&gt; and &lt;code&gt;yeses&lt;/code&gt; came with time.&lt;/p&gt;

&lt;p&gt;You must be wondering, my God, 25 CVs, this guy sent CVs everywhere. so, it was almost like that, I had seen some requirements which I didn't fill completely but I sent the CVs anyways, perhaps that was my initial mistake, and some companies simply replied, Sorry but you don't fill the requirements. really, Europeans aren't rude, they just go straight to the point, I like that, a thousand times they cut me off at the beginning saying they don't want a profile like that, than, having HR interview, practical test, technical interview, interview with the director, passing everything and in the end, receiving an answer like this: unfortunately we decided to continue the process with other candidates with the profile closer to what we were looking for. Annoying folks, but this has happened to me a few times.&lt;/p&gt;

&lt;h2&gt;
  
  
  No, almost, and a yes/99.9%
&lt;/h2&gt;

&lt;p&gt;This story of the &lt;code&gt;no's&lt;/code&gt; may seem silly, but it's not, it's very demotivating, it was difficult to keep my head up, taking a beating, doing various types of tests, one more bizarre than the other, I remember that a guy once asked me: what's the result of this? &lt;code&gt;1 + 2 + ,,3" + 4 + ,,5"&lt;/code&gt; so I said: syntax error, and he told me: no, it's actually &lt;code&gt;3345&lt;/code&gt;, anyways, I'm not here to judge, just to show that there are several types of questions, and sometimes through nervousness I came across simple things and couldn't solve them, after he answered me '3345' I realised that the guy had just mistyped the quotes and typed two commas, it happens.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;almost&lt;/code&gt; was more or less like this, two companies I passed an HR interview, tests, technical interview but at the very end, in the almost, they decided to continue the process with another candidate, it varies, sometimes because in the last interview I answered a wrong question, sometimes because there really was another candidate, even more so that there are European candidates who they don't need to pay relocation and visa process. Several really, don't be discouraged if you receive an answer like that at the end of a process, if you got until there it's because you're good.&lt;/p&gt;

&lt;p&gt;And the story of &lt;code&gt;yes/99.9%&lt;/code&gt; was funny and sad, I basically passed in all the processes, the director even congratulated me, and said I want to see you as soon as possible here with us, this happened on a Friday, the HR person told me that on Monday she would send me the formal proposal by email to accept or negotiate adjustments. and when Monday arrives, with my heart in my hand, I receive an email asking for a new step, an interview with another developer, and guys, I was terrified, the interview was difficult, conceptual, questions like, what is the difference between object-oriented programming and functional programming, I know, the problem is that at the time of nervousness + no domain of English + pressure + talk about concepts in English, basically nothing useful came out, my interview was horrible, a disaster. I wasn't approved by the interviewer, and I'll say more, I wouldn't approve myself either, it wasn't cool, and maybe I wasn't ready for that vacancy, HR just replied that I wasn't approved and they wouldn't continue the process with me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally Approved!
&lt;/h2&gt;

&lt;p&gt;After 25 CVs and the most varied &lt;code&gt;no's&lt;/code&gt; possible I realised that it was already at the beginning of July 2017, I was terrified, because I really wanted to go until June at the most, so, I decided to apply for 25 more vacancies. a few more &lt;code&gt;no's&lt;/code&gt;, interviews and tests and finally, the blessed company that approved me, I had a HR interview, one of the worst, because my listening in English wasn't very good yet, and the recruiter was in an open room, without furniture, a lot of echo, without a proper microphone, just the laptop, and there were people dragging something, probably the new furniture they were installing.&lt;/p&gt;

&lt;p&gt;I remember she asked me, do you have a portfolio? if you have, send it to me, because we will pass it on to the dev team to evaluate your code, otherwise we will send you a test for you to do, I passed some projects on my Github and went on with life, this was on a Tuesday, on a Thursday of the same week, the recruiter send me a message, saying that the dev team liked my code and that they wanted to schedule the second step, a technical interview with the IT director, I scheduled it on Friday, I had the interview, it was cool, I prepared a lot this time, and it was cool, advanced conversation about concept and all the react lifecycle. I've made just one mistake, and in the end they told me, Gustavo, we have other candidates to interview, I believe that by the end of next week we will have an answer, I said: ok, I'll be waiting for your email.&lt;/p&gt;

&lt;p&gt;On Monday of the following week I woke up very early because I had another interview with a British company, when I took my cell phone in my hand, I saw the following message: Hello Gustavo, Would you have time for a quick call? We've got good news for you, I jumped out of the bed and said, Yes of course, and then I got the news that I'd made it, Finally, after taking several &lt;code&gt;no's&lt;/code&gt; and sending out about 50 resumes, I finally got it. a job in Europe!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips and Conclusions
&lt;/h2&gt;

&lt;p&gt;Study the market where you want to go to work and live.&lt;br&gt;
Based on the market studied you will know whether or not a degree is necessary and thus perhaps save you a lot of time or apply your time better, for example I have some friends working as Senior Devs in Europe without a degree so make yours research.&lt;/p&gt;

&lt;p&gt;English, always study English, it is very, very important, I never liked English, I went to learn it after I was “old” at 26, it was more difficult, but with time, classes, exercises and a lot of practice, it worked out. Oh, and I must say, there is no magic course to learn English or any language, there is only one way: study, exercise and practice a lot of listening, reading, writing and speaking.&lt;/p&gt;

&lt;p&gt;Portfolio, always have projects or codes that you can present at hand.&lt;/p&gt;

&lt;p&gt;Get ready, know everything possible and important about the company and the vacancy, make a check-list, lock yourself in your room and talk to yourself in English, ask yourself: talk about yourself, what do you do in your current job?, what methodologies do you use, why do you use them and do you like them? What are the processes of the company you work for? uses Scrum or some other agile methodology and so on.&lt;/p&gt;

&lt;p&gt;Be nice, smile, you don't have to smile all the time, but show sympathy, be friendly, for example: a friend of mine from Europe said he had a very good guy technically but the guy didn't smile at all, and wasn't a good fit for the team, too introspective.&lt;/p&gt;

&lt;p&gt;Be very organised, Europeans don't like delays or forgetfulness, there are some good cell phone apps for calendars, so plan ahead.&lt;/p&gt;

&lt;p&gt;LinkedIn updated and in English, if you are looking for an opportunity abroad, use the language as close to universal as possible, post projects, write what you do, technologies you used/use, add all useful information, don't bullshit, be direct and objective.&lt;/p&gt;

&lt;p&gt;Meetups and events, some people say you don't learn anything there and basically with a 10 minute internet reading you know as much as the speaker. in my humble opinion, yes it is partially true you can read this in 10 minutes on the internet, and you should, but don't discard the idea of ​​attending these meetups and events, because that's where you sometimes find out about new technologies, make a cool networking, meet new people and companies, vacancies, discuss about many things and in a somewhat generalist way, Devs are a bit introverted, get out of the comfort zone, go beyond, make friends, see what they work with, learn new technologies or update yourself on what you like, one day I will make a post only about meetup and events, as there are many things to talk about, for now, that's enough.&lt;/p&gt;

&lt;p&gt;In addition to all the advice and tips I gave above, I really want to make a conclusion, simple but valid, I'm not the best, maybe that's why 50 CVs, but I'm very persevering, dedicated and committed to myself, I said I would make it and I would achieve these things, I went after that, ran, fought and here I am, there are lucky people and better people than me, who will just send one CV and pass the first time, YES, of course, but what I want you to understand is, don't let yourself be carried away by the &lt;code&gt;no's&lt;/code&gt;, they may appear, but move on, put it in your head that you're going to make it and run after your dream, I'll close up here, I hope I've inspired and helped you all.&lt;/p&gt;

</description>
      <category>jobs</category>
      <category>challenges</category>
      <category>europe</category>
    </item>
  </channel>
</rss>
