<?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: Serhii Kucherenko</title>
    <description>The latest articles on DEV Community by Serhii Kucherenko (@serhii_kucherenko).</description>
    <link>https://dev.to/serhii_kucherenko</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%2F155900%2F7f979091-ea0d-4146-928a-7281d0f437fc.jpg</url>
      <title>DEV Community: Serhii Kucherenko</title>
      <link>https://dev.to/serhii_kucherenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serhii_kucherenko"/>
    <language>en</language>
    <item>
      <title>Introducing Wisdom — Your Daily Dose of Inspiration</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Wed, 01 Feb 2023 16:17:10 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/introducing-wisdom-your-daily-dose-of-inspiration-3j37</link>
      <guid>https://dev.to/serhii_kucherenko/introducing-wisdom-your-daily-dose-of-inspiration-3j37</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2Aw9MhDWL7vBX6nl9Q" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2Aw9MhDWL7vBX6nl9Q" width="752" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/wisdom-daily-quotes/id1665478736" rel="noopener noreferrer"&gt;Download Now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am thrilled to announce the launch of my latest creation — the Wisdom app. Designed to help you cultivate wisdom and lead a more meaningful life, Wisdom delivers daily quotes from five categories — Success, Inspiration, Wisdom, Friendship, and Famous Quotes — to help you get through each day with lessons and insights from successful individuals. With over 4,000 quotes and daily notifications, the Wisdom app provides daily inspiration to help you navigate life’s challenges.&lt;/p&gt;

&lt;p&gt;In addition to the daily quotes, Wisdom also offers daily reminders, so you never miss an opportunity to be inspired. And for iOS users, we have added a home widget so you can have quick access to a daily quote right from your home screen.&lt;/p&gt;

&lt;p&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%2F75pw4157i6jpqlqjmotv.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%2F75pw4157i6jpqlqjmotv.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also proudly stand with Ukraine and are committed to bringing positivity and inspiration to people worldwide.&lt;/p&gt;

&lt;p&gt;If you’re looking for a tool to help you stay motivated and inspired, be sure to check out the Wisdom app. Available now on the App Store, the Wisdom app is your ultimate guide to personal growth and wellness. Download it now at: &lt;a href="https://apps.apple.com/us/app/wisdom-daily-quotes/id1665478736" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/wisdom-daily-quotes/id1665478736&lt;/a&gt; and follow us on Instagram at &lt;a href="https://www.instagram.com/wisdom_dailyquotes/" rel="noopener noreferrer"&gt;https://www.instagram.com/wisdom_dailyquotes/&lt;/a&gt; for more daily inspiration.&lt;/p&gt;

&lt;p&gt;Start your journey to a more inspired life today! Download Wisdom now on the App Store. #WisdomApp #AppStore #Launch #Motivation #Inspiration 💫&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>crypto</category>
    </item>
    <item>
      <title>Next.js 13 with Tailwind and MUI Boilerplate</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Sat, 10 Dec 2022 01:03:59 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/nextjs-13-with-tailwind-and-mui-boilerplate-lhh</link>
      <guid>https://dev.to/serhii_kucherenko/nextjs-13-with-tailwind-and-mui-boilerplate-lhh</guid>
      <description>&lt;p&gt;In this crazy boilerplate, I've prepared the setup with the latest up-to-date stack for the Frontend. Let's see what's inside.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Next.js 13&lt;/strong&gt; with its latest features like the &lt;strong&gt;app directory&lt;/strong&gt; (you check how it works in this &lt;a href="https://blog.logrocket.com/next-js-13-new-app-directory/" rel="noopener noreferrer"&gt;excellent article&lt;/a&gt; by &lt;a href="https://medium.com/u/197147636da0" rel="noopener noreferrer"&gt;Kapeel Kokane&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mui.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Material UI (or MUI&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt; to speed up the development with pre-made components and excellent theme support&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://medium.com/u/d8c8c34e2236" rel="noopener noreferrer"&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;&lt;/a&gt; --- I hate writing CSS(SCSS) from scratch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those, who, like me, like to be confident in their code and help others to follow the same set of rules, I've added must-have tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;ESLint&lt;/strong&gt;, to ensure you and your teammates follow the same rules that prevent you from well-known bugs like "&lt;strong&gt;Invalid Hooks Call.&lt;/strong&gt;"&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Prettier&lt;/strong&gt; because it's just heart-breaking when you have differently formatted code across the app&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Optionally&lt;/strong&gt;, among the scripts in the package.json file, you would find the "&lt;strong&gt;push-check&lt;/strong&gt;" command I usually run before push or as a part of the CI process which checks types and linter errors. And you can take a step even further, and install the &lt;a href="https://github.com/typicode/husky" rel="noopener noreferrer"&gt;&lt;strong&gt;Husky&lt;/strong&gt;&lt;/a&gt; package so it runs this command automatically on push, or on commit. But it's out of the scope of this article, as I add husky only if there's a R-E-A-L need for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AH-UZ9O7Je3OCnoZTlee6Yg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AH-UZ9O7Je3OCnoZTlee6Yg.png" alt="1"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Afterword
&lt;/h3&gt;

&lt;p&gt;You can find the source code in my &lt;a href="https://github.com/serhii-kucherenko/nextjs-typescript-materialui-tailwind" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub account&lt;/strong&gt;&lt;/a&gt;, and for those who like to check things from the browser, I prepared a &lt;a href="https://nextjs-typescript-materialui-tailwind.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;DEMO of the deployed app&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(&lt;/strong&gt;dark mode by default).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: You can choose whatever framework or library or package you want, but in the end, you would be responsible for the outcomes. So choose wisely, and don't make rush decisions by blindly cloning the repo if you're not confident in what you're working with.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I hope the article was helpful. Please subscribe so you don't miss the following articles, and feel free to contact me if you have any questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kucherenko_web" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sergey-kucherenko/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>How To Be 1KX Faster With GitHub Copilot</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Thu, 08 Dec 2022 18:06:37 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/how-to-be-1kx-faster-with-github-copilot-1c48</link>
      <guid>https://dev.to/serhii_kucherenko/how-to-be-1kx-faster-with-github-copilot-1c48</guid>
      <description>&lt;p&gt;If you have never heard about GitHub Copilot, I'm jealous as a friend because, after this article, you will experience the same positive shock I did when I tried it for the first time.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is GitHub Copilot?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f0ayQF6I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2Ak-EtfF4u2LeovDnilx7mUQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f0ayQF6I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2Ak-EtfF4u2LeovDnilx7mUQ.png" alt="1" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once upon a time, there was a dog. His name was Copilot, but &lt;a href="https://medium.com/u/8df3bf3c40ae"&gt;GitHub&lt;/a&gt; proposed him a raise. And instead of this cuttie ↑, we got this cutie ↓ (write in the comment which one you like more)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l65VWkHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2AiBwh5SWF7QRGAZLyU7_feQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l65VWkHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2AiBwh5SWF7QRGAZLyU7_feQ.jpeg" alt="gh-copilot" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He not only looks nice but can do magic with your code. Right from your editor, GitHub Copilot uses the OpenAI Codex to suggest code and entire functions in real time. Simply put, he helps you write code faster by learning from your code (and millions of lines of code from other contributors across the web) to predict your next step or give you a snippet from a comment you would provide. You write, "Create a function that generates 1000 random users with images," and the result will be generated instantly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create a function that generates 1000 random users with images&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;faker&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;faker&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;generateUsers&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="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="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&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="nx"&gt;i&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="nx"&gt;faker&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;findName&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar&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;return&lt;/span&gt; &lt;span class="nx"&gt;users&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;Let me show you how it works with a real-world example. Recently, I've got the task to create two screens in &lt;a href="https://medium.com/u/64c68a690f89"&gt;React Native&lt;/a&gt; where the first one will conduct a random today joke, and the second will display a list of all previous jokes. All data should be persisted and stored in AsyncStorage. That means, every day, we have to save fetch a new joke, and the current one goes to history. Let's summarize it in terms of actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  For the Today screen, we need to &lt;strong&gt;get a joke from API&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Then &lt;strong&gt;save the joke and current date in the AsyncStorage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Add a checker&lt;/strong&gt; for 24-h expiration&lt;/li&gt;
&lt;li&gt;  If expired  -  fetch a new joke&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;And put&lt;/strong&gt; the current one &lt;strong&gt;in the history list in the AsyncStorage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  For the History screen, we only need to &lt;strong&gt;get a history of jokes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's see how GitHub Copilot can help us with it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was thinking about GIF format, but with video it's even better and it takes only 1 min&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I hope you saw the video and got that positive shock I had. Just imagine how outstanding you will be with this tool by snapping your fingers (or clicking the Tab key).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8--gskKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/0%2A0erK0loC6_e6eUV6" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8--gskKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/0%2A0erK0loC6_e6eUV6" alt="2" width="500" height="213"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How much?
&lt;/h3&gt;

&lt;p&gt;Previously, this tool was free. But it's not anymore. So let's talked about pricing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mUuSqo23--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2ABT9rq6u-3bcahMEFksnjjA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mUuSqo23--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2ABT9rq6u-3bcahMEFksnjjA.png" alt="3" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, December 8th, 2023, costs $10 bucks per month or $100 per year, which is less than I expected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eDotFxBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2A-WlJU0luBET7xcPbv3SALg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eDotFxBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/1%2A-WlJU0luBET7xcPbv3SALg.png" alt="4" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But there's some good news; you don't have to pay in advance. Start a free trial, test it, taste it, and decide if it is something you want in your personal arsenal.&lt;/p&gt;




&lt;p&gt;I hope the article was helpful. Please subscribe so you don't miss the following article, and feel free to contact me if you have any questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kucherenko_web"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sergey-kucherenko/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to set up an Express.js project with TypeScript</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Thu, 08 Dec 2022 00:12:10 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/how-to-set-up-an-expressjs-project-with-typescript-353a</link>
      <guid>https://dev.to/serhii_kucherenko/how-to-set-up-an-expressjs-project-with-typescript-353a</guid>
      <description>&lt;p&gt;Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications. Honestly, I haven’t been using it for quite some time, but now I want to update my old experience with Express.js and a TypeScript setup. Besides, Express.js version 5 (beta) is now available and maybe in future articles, I’ll share my thoughts and experience about it. But today, we’re going to create a setup with TypeScript and Express.js with an easy-to-use folder structure. And the first thing we need is to generate an Express.js project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Express.js project
&lt;/h2&gt;

&lt;p&gt;As a first step, we need to have Node.js itself installed on the machine. Open a terminal and type ‘node -V’ and if it shows you a version, you’re good to go. For those who see an error, please follow &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;the link&lt;/a&gt;, download the Node.js LTS version, and install it by following the instructions on the site.&lt;/p&gt;

&lt;p&gt;Next, create a folder where you want to have your project. You can name it whatever you want. For the example let’s name it ‘server’.&lt;/p&gt;

&lt;p&gt;Open your terminal and past the commands below and run them one after another:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Navigate to the folder you're going to have you project in
cd ~/path/to/any/folder/you/re/going/to/have/your/project/in

# Generate in that folder a new folder with name 'server'
mkdir server
# Initialize a package.json file with default values
npm init --yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After executing these 3 commands, you’ll have a package.json file which is going to look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "work",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;amp;&amp;amp; exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And now, let’s add Express.js to the project by running the command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It will generate a package-lock.json file and a node_modules folder in the server folder. And also, in the package.json file, a new block “dependencies” with express.js will appear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2724%2F0%2ALKWwZF9kMHn1Qyxk" 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%2Fcdn-images-1.medium.com%2Fmax%2F2724%2F0%2ALKWwZF9kMHn1Qyxk" alt="1" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Hello World server app with Express.js
&lt;/h2&gt;

&lt;p&gt;Creating a simple server with Express.js is a 3 steps deal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Import express.js from the modules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define routes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn on express.js to listen to a specific port.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Take a look at the picture, can you identify each step on your own?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AT1S20TzAE9jWe5Xz" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AT1S20TzAE9jWe5Xz" alt="2" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start from the start. Go to the ‘server’ folder and create a new file index.js which is going to be the entry point (the file node.js is going to run first) where we are going to put our server’s configuration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Now, let’s import express.js from the modules&lt;/p&gt;

&lt;p&gt;const express = require("express");&lt;br&gt;
const app = express();&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define one route which is going to respond to a GET request to the &lt;a href="http://localhost:8080/" rel="noopener noreferrer"&gt;http://localhost:8080/&lt;/a&gt; URL with the text “Hello world!” as a response.&lt;/p&gt;

&lt;p&gt;app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
    res.send("Hello world!");&lt;br&gt;
});&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn on express.js to listen to port 8080&lt;/p&gt;

&lt;p&gt;app.listen(8080, () =&amp;gt; {&lt;br&gt;
    console.log(&lt;code&gt;server started at http://localhost:${8080}&lt;/code&gt;);&lt;br&gt;
});&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that’s it. Our Node.js server with Express.js is ready. But how can we run it? That’s where we would ask Node.js to help us. Open your terminal and run the command&lt;/p&gt;

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

&lt;/div&gt;

&lt;p&gt;This command will tell Node.js to run our index.js file with the Express.js server and when it’s done, you should the console.log we declared in step 3&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2A3W1nIf7Ehns0KS9p" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2A3W1nIf7Ehns0KS9p" alt="3" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you would open your browser at &lt;a href="http://localhost:8080/" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; you’ll see the text “Hello world!” we declared in step 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2156%2F0%2AKfpzU46MKSaZTkx6" 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%2Fcdn-images-1.medium.com%2Fmax%2F2156%2F0%2AKfpzU46MKSaZTkx6" alt="4" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait a minute, should we run this ‘node index.js’ command from the terminal each time? Of course not. Besides, this command is gonna be much longer with TypeScript support, so let’s place it in the package.json file:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2660%2F0%2A5XbylcD0MqlVgZjf" 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%2Fcdn-images-1.medium.com%2Fmax%2F2660%2F0%2A5XbylcD0MqlVgZjf" alt="5" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dot instead of index.js as before is just a shortcut for an index file in the folder. So now, we just need to run npm run start and everything is going to work as before.&lt;/p&gt;

&lt;p&gt;As we have our express.js up and running, let’s add TypeScript support, because we’re great developers and want to have types to protect ourselves from ourselves :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re going to make changes, to this setup, you would need to restart your server manually via the terminal. At the end of the article, I’ll put a Bonus section on how to fix that.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add TypeScript Support
&lt;/h2&gt;

&lt;p&gt;Since we’re in the world of Node.js, I mean, in the Node.js environment, and it only understands the JavaScript language, the TypeScript code needs to be transpiled to JavaScript before the app is used in runtime. And for that we’re going to use ts-node which transforms TypeScript into JavaScript, enabling you to directly execute TypeScript on Node.js without precompiling.&lt;/p&gt;

&lt;p&gt;The first step we need to install the typescript and ts-node packages, but since it’s only the development-related packages we would add the -D flag which indicates that the packages are going to be installed for development mode and will be deleted on production.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install typescript ts-node -D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Each time I install packages I’d like to verify it was added successfully to the package.json file. This time, packages should be added to the “devDependencies” section&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2322%2F0%2A3VhlobF3q2fpzNBq" 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%2Fcdn-images-1.medium.com%2Fmax%2F2322%2F0%2A3VhlobF3q2fpzNBq" alt="6" width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to configure the TypeScript. To do that, we need to create a ‘tsconfig.json’ file in the ‘server’ folder and put the following config there:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "rootDir": "./",
    "esModuleInterop": true
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It’s just a basic config, and the information about all properties you can find in the &lt;a href="https://www.typescriptlang.org/docs/" rel="noopener noreferrer"&gt;official TypeScript documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, we can change the extension of the main file from index.js to index.ts.&lt;/p&gt;

&lt;p&gt;Open the package.json file and update the “main” property as well from js to ts.&lt;/p&gt;

&lt;p&gt;And the last step is to update our “start” script. Instead of “node” we’re going to use “ts-node” now. As simple as that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AAaeUZ13LBaTnRksn" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AAaeUZ13LBaTnRksn" alt="7" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can run our server with the same “npm run start” command and open the &lt;a href="http://localhost:8080/" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; and we’ll see the text “Hello world!” as before. But what now?&lt;/p&gt;

&lt;p&gt;Now we can use types. For the express.js project, we only need to add support for node.js and express.js types. We can install it as a dev dependency with the command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @types/node @types/express -D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;(Don’t forget to verify that they were added successfully to the package.json “devDependencies” section)&lt;/p&gt;

&lt;p&gt;Now, we can use types with the latest ES6 features like imports. Let’s update our index.js code with a TypeScript version&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import express, { Request, Response } from 'express'

const app = express();

app.get("/", (req: Request, res: Response) =&amp;gt; {
    res.send( "Hello world!" );
});

app.listen(8080, () =&amp;gt; {
    console.log(`server started at http://localhost:${8080}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you see, now, since we have specific types of requests and responses that come from the ‘express’ module (actually from the @types/express) we can be sure of what types we’re using across our server application. And also we can now see all things our variables support all thanks to TypeScript&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2930%2F0%2AllZ7zQOeZD5eoLaX" 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%2Fcdn-images-1.medium.com%2Fmax%2F2930%2F0%2AllZ7zQOeZD5eoLaX" alt="8" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;As I promised, the bonus part is going to be about watching mode. Developing apps without hot-reloading is a sin in the IT world (and I saw a lot of examples of projects even with senior developers on them). You should not waste your time in such a way. Besides, it’s not that hard to fix it. All you need is to use a nodemon package.&lt;/p&gt;

&lt;p&gt;Since we only need it in development mode let’s put the -D flag when installing&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install nodemon -D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When it’s done, add a new serve command to the package.json file&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"serve": "nodemon index.ts"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;At the end the “package.json” should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AF9px_BqEGfEx7jps" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F0%2AF9px_BqEGfEx7jps" alt="9pm " width="800" height="817"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now, you can run the server with hot-reloading&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2004%2F0%2AkhojZImzFNlGoWEt" 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%2Fcdn-images-1.medium.com%2Fmax%2F2004%2F0%2AkhojZImzFNlGoWEt" alt="10" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you see, it’s watching for extensions .ts and .json. That means if any files in the server folder with that extension would be updated the nodemon will automatically rebuild them and so you can now focus on the development process and don’t be distracted by restarting the server after changing a file.&lt;/p&gt;

&lt;p&gt;Congratulations, you made it. This one was a bit longer than I expected. Please subscribe so you don't miss the next article, and feel free to contact me if you have any questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kucherenko_web" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sergey-kucherenko/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>How To Be Productive With WebStorm</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Thu, 08 Dec 2022 00:08:12 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/how-to-be-productive-with-webstorm-10bi</link>
      <guid>https://dev.to/serhii_kucherenko/how-to-be-productive-with-webstorm-10bi</guid>
      <description>&lt;p&gt;I’ve been using WebStorm as my default code editor for the last 3 years, and it’s amazing. I think you do have one of your own. But do you know how you can boost your speed as a developer with it? If not, let’s do this. fast; it will take just a couple of minutes, I promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live templates
&lt;/h2&gt;

&lt;p&gt;How many times have you created a new file with the same structure? If it happens more than twice, Huston, you know the drill. As developers, we shouldn’t repeat ourselves, remember? For that, you can use &lt;strong&gt;Live Templates (aka Snippets)&lt;/strong&gt;. I’m sure you've seen it before but haven’t used it.&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%2Fcdn-images-1.medium.com%2Fmax%2F2824%2F0%2A47rVulPpRLoEgkep.gif" 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%2Fcdn-images-1.medium.com%2Fmax%2F2824%2F0%2A47rVulPpRLoEgkep.gif" alt="2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are a lot of pre-built live templates that come with the plugins you install. Go to &lt;strong&gt;Preferences-&amp;gt;Editor-&amp;gt;Live Templates&lt;/strong&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F4048%2F1%2A7hBVxBozWEhFPpiQa9kIJg.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%2Fcdn-images-1.medium.com%2Fmax%2F4048%2F1%2A7hBVxBozWEhFPpiQa9kIJg.png" alt="3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And what is great about it is that you can create your own live templates and never repeat yourself again. To do so, just click the “+” button and paste your template, providing an abbreviation for it. For 3 years, I’ve created around 50 most-used abbreviations for React, React Native, Node.js, Next.js, and other projects I’m working on most of the time.&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%2Fcdn-images-1.medium.com%2Fmax%2F3028%2F1%2Ac2oKiLQBs8nSAjkktimtEg.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%2Fcdn-images-1.medium.com%2Fmax%2F3028%2F1%2Ac2oKiLQBs8nSAjkktimtEg.png" alt="4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to dive deeper into Live Templates, please go to the &lt;a href="https://www.jetbrains.com/help/webstorm/using-live-templates.html" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Macros
&lt;/h2&gt;

&lt;p&gt;How many steps would you need to make to create a file in the root folder of your project or in the "components" folder when bootstrapping your project?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Find a folder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call the context menu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click create a new file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name it&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even with the terminal way, you would need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the terminal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move to the folder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a file with a name&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But we can do it faster with &lt;strong&gt;Macroses&lt;/strong&gt;. It gives you control over repetitive tasks. You just create a record, edit and play back macros, assign a shortcut to them, and share them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Record a macro
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the Edit menu, point to Macros, and click Start Macro Recording.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perform necessary actions that you want to be recorded.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Press 🟥 or select Edit -&amp;gt; Macros -&amp;gt; Stop Macro Recording.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Enter Macro Name dialog, specify the name for the new macro and click OK.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the macro is intended for temporary use only, you can leave the name blank.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F2400%2F0%2AX1etwx88ARYwnfE3.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%2Fcdn-images-1.medium.com%2Fmax%2F2400%2F0%2AX1etwx88ARYwnfE3.png" alt="5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s easy to use when you know how it works. Stop reading for a moment and consider three ways you can use Macroses in your current project. Dive deeper into the &lt;a href="https://www.jetbrains.com/help/webstorm/using-macros-in-the-editor.html" rel="noopener noreferrer"&gt;official documents&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep It Simple
&lt;/h2&gt;

&lt;p&gt;Just imagine how much time you will save by investing a few minutes in learning and setting up these tools, which you would use to focus more on the logic of your features instead of the routine things you repeat time after time. And it’s just the tip of the iceberg, so I encourage you to go further and find your own list of things you can automate, delegate to machines, or make in less time by applying a non-trivial approach.&lt;/p&gt;

&lt;p&gt;I hope this article was useful. Please subscribe so you don't miss the next article, and feel free to contact me if you have any questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/kucherenko_web" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/sergey-kucherenko/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>webstorm</category>
    </item>
    <item>
      <title>3 Ways To Optimize Lists Rendering</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Wed, 07 Dec 2022 01:09:10 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/3-ways-to-optimize-lists-rendering-59gh</link>
      <guid>https://dev.to/serhii_kucherenko/3-ways-to-optimize-lists-rendering-59gh</guid>
      <description>&lt;p&gt;A lot of web apps are struggling with heavy data rendering problems. As your project evolves it becomes a bottleneck. Users' attention is really hard to catch, and nobody is gonna wait for a long response, but rather would go to Google and will find an alternative to your product. That's the reality. So as a web developer you need to be smart about this. And in today's article, I'm going to cover 3 ways in which we can improve the data rendering on your web apps drastically which will lead to more users staying on your site which will lead to higher revenue.&lt;/p&gt;

&lt;p&gt;To simplify the examples, let's imagine we received a task from a manager to fix the problem with a long time to wait before all articles on the company website are rendered. So our initial data is a list of articles. You started investigating the problem and find out that you received 1000 articles from the server and the browser is trying to render all 1000 at once. How can we fix that?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pagination
&lt;/h2&gt;

&lt;p&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%2Fklrdzqm36mvm5l7lfce1.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%2Fklrdzqm36mvm5l7lfce1.png" alt="pagination" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first approach seems the most obvious one, but still, I've seen a lot of websites without this feature.&lt;/p&gt;

&lt;p&gt;Pagination - is a fancy word for splitting data into chunks, which means instead of getting and showing all 1000 articles at once we can ask the server for the first 20 or even 50 articles, and let us know how many there are left, so we can know where to stop.&lt;/p&gt;

&lt;p&gt;The basic info we need from the server to successfully set up the pagination is a limit and an offset. Some implementations can contain totalPages or hasNext.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be aware, that this feature would require additional changes from the server side.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Infinite Scrolling
&lt;/h2&gt;

&lt;p&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%2Fnfnwdo4w54un78vfbe5q.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%2Fnfnwdo4w54un78vfbe5q.png" alt="infinite scrolling" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next approach uses the same pagination logic under the hood, by splitting data into chunks, but instead of showing controls to the user, you should automatically request the next chunk of data when a user reaches the end of the list. For better UX it's better to start requesting the next chunk a bit earlier than the end of the list, so for the user it's going to feel like everything was already loaded and we just showed her everything right away.&lt;/p&gt;

&lt;p&gt;Honestly, of all 3 ways, this one seems the most user-friendly to me and I like it the most. But for all tasks, there is the right technique. Some users like to click the button, and on some projects, instead of automatically loading the next page you might need to add a "Load More" button, so always clarify the expectations with your client/manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtualized Lists (VL)
&lt;/h2&gt;

&lt;p&gt;For this approach, I couldn't find the right image, but what is better than seeing something? Right, is to try it by yourself. Instead of an image, I prepared a demo of how the virtualized list(VL) works. In this example, I randomly generate 10 000 users with images and render them using virtualized list(VL) approach. Check, how fast it is. Without VL it could even freeze the page, especially on mobile. But how it works?&lt;br&gt;
&lt;iframe src="https://codesandbox.io/embed/reverent-browser-ewtcj7"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Virtualized list does what it says --- creates a virtual list of items. That means, that instead of rendering all items right away it defines the visible view size based on the parameters we provided --- height and width of the visible area and height of each item. Based on that info VL can calculate how many items should be rendered right away and what should be rendered when a user scrolls the through the list.&lt;/p&gt;

&lt;p&gt;Sounds like magic, but it's not. And there are plenty of ready-to-use solutions for different web stacks. In my example, I used a ready-to-use component from the &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/u/9d99f1b2974b?source=post_page-----d2dc731f409b--------------------------------" rel="noopener noreferrer"&gt;Material-UI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; library which you can check &lt;a href="https://mui.com/material-ui/react-list/#virtualized-list" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;For the example with the articles optimization, first of all, you need to clarify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  How many more articles are we expecting to have?&lt;/li&gt;
&lt;li&gt;  How fast the solution should be?&lt;/li&gt;
&lt;li&gt;  How much effort we can make and whether we can update the server(since in the first two ways we would need to adjust it as well as the frontend)?&lt;/li&gt;
&lt;li&gt;  Are there any specific requirements for UI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And based on those answers the to choose will be obvious.&lt;/p&gt;

&lt;p&gt;Thanks for spending your time with me and if you'll have any questions, please, let me know, I'll be glad to help you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/serhii-kucherenko/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/serhii-kucherenko/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/kucherenko_web/" rel="noopener noreferrer"&gt;https://twitter.com/kucherenko_web/&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>How does Senior start a project?</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Thu, 18 Feb 2021 20:42:29 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/how-does-senior-start-a-project-41l8</link>
      <guid>https://dev.to/serhii_kucherenko/how-does-senior-start-a-project-41l8</guid>
      <description>&lt;p&gt;When I was a &lt;del&gt;child&lt;/del&gt; junior developer I used to start my projects by adding a framework and ... That's pretty much all. Just my "favorite" (the only one I knew😆) framework and solo-coding for 10-14 hours per day. I heard from other developers about linter, prettier, git-flow, best practices, but I was like: "I don't need things I haven't had time learning to be added to my project". There was no rush, basically, I just wanted to start coding.&lt;br&gt;
If you're like me, I will save you some time by saying: "Stop right there and listen to me!"👆&lt;/p&gt;

&lt;p&gt;Let's say you're going to play hookey. Could you go to the ice without special equipment? You can, but it's risky for your health. The same is with the initial setup. It's your project's special equipment, the superpower.&lt;/p&gt;

&lt;p&gt;After many years, I've become a Senior Developer. I've &lt;del&gt;learnt&lt;/del&gt; learned from my mistakes and here's my own list of "Steps before I start the brand new project".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take care of your code formatting&lt;/li&gt;
&lt;li&gt;Check with the best practices&lt;/li&gt;
&lt;li&gt;Take care of other developers by adding ReadME&lt;/li&gt;
&lt;li&gt;Check your code on compile - TS, Flow, etc&lt;/li&gt;
&lt;li&gt;Use the latest versions from the start&lt;/li&gt;
&lt;li&gt;Define terminology&lt;/li&gt;
&lt;li&gt;Git and Branch naming&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Take care of your code formatting 🤖
&lt;/h2&gt;

&lt;p&gt;As a first step, I take care of my code by defining the rules and turn on autoformatting. For that I always add 2 tools to the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESLint - helps me to define specific rules for the code I write and stick to that rules by showing warnings and errors if I try to break them;&lt;/li&gt;
&lt;li&gt;Prettier - helps me to forget about single/double quotes, tab, spaces, everything regarding the code styling. You just set up it and all your code will be autoformatted by this tool;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Check with the best practices ✅
&lt;/h2&gt;

&lt;p&gt;At this step, I research as much as I can because as good developers we shouldn't reinvent the wheel, right? So I'm trying to find good boilerplates with things I would need in my own project. Don't make a mistake by skipping this step because it can save you a ton of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Take care of other developers by adding ReadME 🤝
&lt;/h2&gt;

&lt;p&gt;I like to have 2 files in my project from the start - ReadME and Conventions. I use ReadME to add general info about the project and instruction on how it can be run. And in Conventions, I always add some description about the code styling, approaches I use and advise how other developers can continue to work and scale the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Check your code on compile - TS, Flow, etc 👔
&lt;/h2&gt;

&lt;p&gt;I'm not a big fan of working without TypeScript or Flow. I'm a human and I make mistakes but with these tools, I can at least be assured that I work with the proper User object and I will get returned from a function an array of Users and not an array of Animals. Besides, it's easier to debug and understand code in this way.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use the latest versions from the start 🆕
&lt;/h2&gt;

&lt;p&gt;This one is pretty much straightforward. If you start a project - &lt;code&gt;don't go back&lt;/code&gt;, but rather stay &lt;code&gt;present&lt;/code&gt; and use everything up to date since new versions can have great features, and the code will be better tested and less buggy.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Define terminology 🈳
&lt;/h2&gt;

&lt;p&gt;Before I start coding I want to know the terminology I would be using in the project and stick to it. I don't like to spend time thinking about names for my entities but rather think about the logic I want to implement. Also, at this step, I define the folder structure since I have all information it seems a logical step.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Git and Branch naming ⚙️
&lt;/h2&gt;

&lt;p&gt;As the last step, I make an initial commit and put the project to one of the version control services and when I work on feature/task/bugfix I create a separate branch for each of them with the following convention - &lt;code&gt;work-type/short-description&lt;/code&gt;. Also, I use branching since in that case, I'm able to show any feature/task/bugfix to a client separately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summarizing
&lt;/h2&gt;

&lt;p&gt;When all steps are done I can go to the ice and play hockey without any health risk 🥷🥷🥷.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My code smart - I don't need to remember all rules and how to format code properly;&lt;/li&gt;
&lt;li&gt;I follow best practices and learn something new each time so my project is easy to scale;&lt;/li&gt;
&lt;li&gt;I can give the project to any developer and they can start without my help by using ReadME and Conventions;&lt;/li&gt;
&lt;li&gt;I'm safe with TypeScript, I write better code and can refactor code easier, therefore faster;&lt;/li&gt;
&lt;li&gt;I can use the latest features of libs in the project;&lt;/li&gt;
&lt;li&gt;I can understand the project itself by looking at its structure, models, and types;&lt;/li&gt;
&lt;li&gt;I can always show to a client any feature I create, merge any tasks, or a bug I fix. Also, it's easier to work in a team with good git-flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What are your steps? Please, share in the comments ✍️&lt;/p&gt;

</description>
      <category>fronted</category>
      <category>architecture</category>
      <category>senior</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React withGraphQL: Optimistic Response - What &amp; Why</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Sat, 06 Feb 2021 18:34:23 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/react-withgraphql-optimistic-response-what-why-2h02</link>
      <guid>https://dev.to/serhii_kucherenko/react-withgraphql-optimistic-response-what-why-2h02</guid>
      <description>&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%2Fi%2F3ct191g70lxq20xm1ekc.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%2Fi%2F3ct191g70lxq20xm1ekc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You start your new project with React &amp;amp; GraphQL. It's super cool &amp;amp; you tried to make it super-fast. But your backend is reaaaally slow and all these loaders are unbelievably annoying. You are a client-oriented developer and trying your best to solve this problem. Likely for you, as you used GraphQL, we can use the Optimistic UI approach.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Official definition:&lt;/strong&gt; &lt;em&gt;Optimistic UI&lt;/em&gt; is a pattern that you can use to simulate the results of a mutation and update the UI even before receiving a response from the server. Once the response is received from the server, the optimistic result is thrown away and replaced with the actual result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I couldn't say better:)&lt;br&gt;
So we only simulate that the backend sends us the response right away so from the user's perspective every response comes instantly.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to use?
&lt;/h2&gt;

&lt;p&gt;When we call a mutation we can also pass an additional &lt;code&gt;optimisticResponse&lt;/code&gt; property and describe what we're going to retrieve from it. That one we would eventually receive from the backend. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt; &lt;span class="nf"&gt;updateComment&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;  
      &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;commentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;commentContent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;optimisticResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
          &lt;span class="na"&gt;__typename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mutation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
          &lt;span class="na"&gt;updateComment&lt;/span&gt;&lt;span class="p"&gt;:&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="nx"&gt;commentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
              &lt;span class="na"&gt;__typename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Comment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
              &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;commentContent&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basically, when you call this mutation GraphQL will update the cache for this comment with new data instantly.&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%2Fi%2Fobb44y1ol8fjsu6yrjyl.gif" 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%2Fi%2Fobb44y1ol8fjsu6yrjyl.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Also, you can update the cache manually when data will arrive from the backend but it's a totally new story. For now, check this feature out and write in the comments what do you think about it.&lt;/p&gt;

&lt;p&gt;For more details go to the official &lt;a href="https://www.apollographql.com/docs/react/performance/optimistic-ui/" rel="noopener noreferrer"&gt;GraphQL documentation&lt;/a&gt; &lt;/p&gt;

</description>
      <category>react</category>
      <category>graphql</category>
      <category>api</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to update multiple git repositories for 1 project?</title>
      <dc:creator>Serhii Kucherenko</dc:creator>
      <pubDate>Tue, 02 Feb 2021 22:11:05 +0000</pubDate>
      <link>https://dev.to/serhii_kucherenko/how-to-update-multiple-git-repositories-for-1-project-239c</link>
      <guid>https://dev.to/serhii_kucherenko/how-to-update-multiple-git-repositories-for-1-project-239c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FIOZBV1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/7wyo0btvn16b0202k38p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FIOZBV1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/7wyo0btvn16b0202k38p.png" alt="Alt Text" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The problem
&lt;/h1&gt;

&lt;p&gt;Image a situation where you started a project locally, developed some codebase and pushed that code to your github | gitlab | bitbucket. Then you ask your friend or a colleague to help with a feature. You added hime to the repo and we both work on 1 project. Then the client comes and says that he created an account on github and setup the auto-deploy to the server so you just need to push your code in their repo. &lt;/p&gt;

&lt;h2&gt;
  
  
  First solution
&lt;/h2&gt;

&lt;p&gt;Simply copy the project, reinitiate the git config and change remote-url to the client's one. But then you change code in your repo &amp;amp; clone it to another manually. That's a stupid, time-consuming operation. &lt;/p&gt;

&lt;h2&gt;
  
  
  Right solution
&lt;/h2&gt;

&lt;p&gt;So as a lazy developer, you don't want to do such things and you don't need to do it. You can configure your git to fetch data from your own repo and push new changes to both repos simultaneously.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote set-url --add --push origin path/to/YOUR/repo
git remote set-url --add --push origin path/to/CLIENT/repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this, when you'll next time run &lt;code&gt;git push&lt;/code&gt; the changes will be pushed to the both gits. Check it by yourself. Isn't that awesome?&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>project</category>
      <category>repository</category>
    </item>
  </channel>
</rss>
