<?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: Prafulla Raichurkar</title>
    <description>The latest articles on DEV Community by Prafulla Raichurkar (@prafulla-codes).</description>
    <link>https://dev.to/prafulla-codes</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%2F222877%2F6cf05b81-997a-42ad-bad5-f612ada6bc78.jpg</url>
      <title>DEV Community: Prafulla Raichurkar</title>
      <link>https://dev.to/prafulla-codes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prafulla-codes"/>
    <language>en</language>
    <item>
      <title>7 Things that helped me in my DEV Journey</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Thu, 29 Feb 2024 14:16:56 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/7-things-that-helped-me-in-my-dev-journey-59fh</link>
      <guid>https://dev.to/prafulla-codes/7-things-that-helped-me-in-my-dev-journey-59fh</guid>
      <description>&lt;p&gt;Hey Folks!!&lt;/p&gt;

&lt;p&gt;It's been a long time since I posted on this community.&lt;br&gt;
I'm glad to say I am back :)&lt;/p&gt;

&lt;p&gt;Here are 7 things which I have learnt along my DEV journey which has helped me personally to improve on my skills - &lt;/p&gt;
&lt;h2&gt;
  
  
  1. Solution before implementation
&lt;/h2&gt;

&lt;p&gt;I can assure you, if you don't do this you'll have to re-write multiple times.&lt;/p&gt;

&lt;p&gt;Whenever you are given with a problem - &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a flow diagram which envisions all the negative scenarios and what will happen when that negative scenario occurs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg562a14u8a9sa3nhy0l2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg562a14u8a9sa3nhy0l2.png" alt="Image description" width="503" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In case there are multiple systems involved, each system can be a point of failure hence you have to consider the scenario when any or all of them are down.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9m8ya63lzmqou61caps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9m8ya63lzmqou61caps.png" alt="Image description" width="674" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review with senior DEVs and subject matter experts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  2. It is what it says it is.
&lt;/h2&gt;

&lt;p&gt;Most of the times we overlook the error message and try to debug things by ourselves and end up in circles. I have observed that &lt;strong&gt;99%&lt;/strong&gt; of the times the error is exactly what it says it is and it also suggests how to solve it.&lt;/p&gt;

&lt;p&gt;Example :-&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="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="nx"&gt;student&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d6gujllpvbnt1mxuwyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d6gujllpvbnt1mxuwyq.png" alt="Image description" width="462" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The error is clearly mentioning that you cannot read an attribute of undefined&lt;/p&gt;

&lt;p&gt;In this case you are reading the &lt;strong&gt;'name'&lt;/strong&gt;, however the student object itself is undefined.&lt;/p&gt;

&lt;p&gt;I've been here too many times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning :&lt;/strong&gt; Always read the error, try to understand the message and exactly at what line it is occuring&lt;/p&gt;

&lt;h2&gt;
  
  
  3. PR over direct merges and build before commits
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If you are working on a project where there is a small team and code review flow is not setup, make it a habit to still make a pull request and review your own code.&lt;/li&gt;
&lt;li&gt;I took this tip from one of my friends and it works wonders, when we wear a developer hat we enter the developer mindset to get things done, but post development we need to wear the reviewer hat and actually review our own code without bias. This will help you cut down on a-lot of bad practices, think about clean code and reducing redundant DB / API calls.&lt;/li&gt;
&lt;li&gt;Always build your solution before committing code, we often over-look our code and miss out a semi-colon or have some typos.
Introducing a small build / compile step before you commit will help you gain a clean history and reduce &lt;strong&gt;"Fixed xyz"&lt;/strong&gt; commits&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Modularize and Reuse, Plug N Play
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Wherever possible try to identify a logic which does a generic thing and can be applied across solutions, remove that chunk out and keep it as a separate module which can be plug and play.&lt;/li&gt;
&lt;li&gt;Keeping these common modules logically grouped outside the system will help you maintain them easily. &lt;/li&gt;
&lt;li&gt;Learn concepts like unit of work, SOLID principles, segregation of layers, they will help you in the longer run.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. Logging is ART.
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Logs are like hints which will help you solve the crimes of the past.&lt;/li&gt;
&lt;li&gt;While adding logs always keep in mind the functional requirement and add the necessary meta data which you feel will be required to cover that functionality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example - You have a page for admins where they can modify / add users to the application&lt;/p&gt;

&lt;p&gt;In this context it is important to log the who, when, whom and why.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin : "Prafulla"
action : "AddUser"
user: "PrafullaB"
reason : "Requested access to the portal and fits the role"
timestamp : "25-02-2024 12:30:00"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above fields will change based on the functionality, however it is important to log the key fields by which you will have to search the logs to help you in times of difficulties / audits.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never logs passwords in your logs.&lt;/li&gt;
&lt;li&gt;Encrypt sensitive data while logging.&lt;/li&gt;
&lt;li&gt;Too much of logs (or anything) is bad for health. Log only the crucial things and in case of exception handling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example : You  have a method fetch_data_from_db() which fetches 1 million records from DB&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="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_data_from_db&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="s2"&gt;fetched data &lt;/span&gt;&lt;span class="dl"&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;❌&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log only the required things like the count of data fetched and in case of failure exception -&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;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_data_from_db&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="s2"&gt;`fetched &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; records`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;✅&lt;/span&gt;
 &lt;span class="k"&gt;catch&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to fetch data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's just a-lot of useful things we can do by optimizing the logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Prevention is better than cure
&lt;/h2&gt;

&lt;p&gt;Yes you read that right, you don't want to end up losing company reputation and tons of money by overlooking security measures.&lt;/p&gt;

&lt;p&gt;If you have an application with a-lot of users and contains sensitive data, it is extremely crucial to ensure the right security checks in place - &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Encrypt Passwords&lt;/li&gt;
&lt;li&gt;Mitigate Risks of SQL Injection&lt;/li&gt;
&lt;li&gt;Check that a proper role based authentication is established which functions correctly when new users are added and removed.&lt;/li&gt;
&lt;li&gt;Whitelist third party APIs
... (This list is never ending, implement security measures based on your application scale and criticality)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  7. Unlearning
&lt;/h2&gt;

&lt;p&gt;Many times we learn things and connect the dots unknowingly without knowing what's happening at the back-end. I have learnt that as I keep learning more about the systems and architecture I keep realizing how limited my knowledge is in the domain. &lt;/p&gt;

&lt;p&gt;The skill of unlearning has helped me tremendously cut down a-lot of misinformation and wrong methods which I learnt in the process and replace them with actual facts.&lt;/p&gt;

&lt;p&gt;That's a wrap for now. Thanks for reading ^_^ 💖&lt;br&gt;
Feel free to discuss and add your learnings in the comments.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sorting Hat</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Fri, 19 Nov 2021 18:04:07 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/sorting-hat-6b8</link>
      <guid>https://dev.to/prafulla-codes/sorting-hat-6b8</guid>
      <description>&lt;p&gt;Want to know which Hogwarts House would you fall into? Come and let the Sorting Hat cast judgement upon you! Fall into one of the 4 Great Houses of Hogwarts and win a GitHub Badge to showcase on your github profile! ✨&lt;/p&gt;

&lt;p&gt;⚡ &lt;a href="https://gh-sorting-hat.netlify.app/"&gt;https://gh-sorting-hat.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Badges 🛡️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjora7jaia2gsp6npsg75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjora7jaia2gsp6npsg75.png" alt="Image description" width="800" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info checkout our repository&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/sorting-hat"&gt;
        sorting-hat
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🧙 Want to know which Hogwarts House would you fall into? Come and let the Sorting Hat cast judgement upon you and win a README badge ✨
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>potterhead</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Created My Portfolio: From Thought Process To Deployment.</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Fri, 11 Sep 2020 08:08:59 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/how-i-created-my-portfolio-from-thought-process-to-deployment-4j3p</link>
      <guid>https://dev.to/prafulla-codes/how-i-created-my-portfolio-from-thought-process-to-deployment-4j3p</guid>
      <description>&lt;p&gt;It had always been in my bucket list to have a portfolio before entering the corporate world and I am glad to share that around a month ago that task has been completed🎉.&lt;/p&gt;

&lt;p&gt;You can check my portfolio at &lt;strong&gt;&lt;a href="https://prafulla.tech"&gt;https://prafulla.tech&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I would like to share my journey from thought process to deployment.&lt;/p&gt;

&lt;p&gt;I would break down the entire process in the following section&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Planning &amp;amp; Design&lt;/li&gt;
&lt;li&gt;Project Strucutre&lt;/li&gt;
&lt;li&gt;Optimization&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Planning &amp;amp; Design
&lt;/h1&gt;

&lt;p&gt;In this phase, I have used a browser-based design &amp;amp; prototype tool &lt;strong&gt;&lt;a href="https://www.figma.com/"&gt;Figma&lt;/a&gt;&lt;/strong&gt;. Other tools like Adobe XD, Sketch, etc would also work.&lt;/p&gt;

&lt;p&gt;This is the Figma planning board for my portfolio.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxqrbg4vqiow1dt71yfxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxqrbg4vqiow1dt71yfxb.png" alt="Figma Planning Board" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason why I have put the planning &amp;amp; designing phase on a single page is that it makes implementing thoughts into actions easier.&lt;/p&gt;

&lt;p&gt;The planning phase consists of two steps:&lt;/p&gt;
&lt;h4&gt;
  
  
  Objectives
&lt;/h4&gt;

&lt;p&gt;Writing down basic requirements expected out of the portfolio helps in generating a stronger purpose &amp;amp; makes one think twice if the implemented design &amp;amp; content will fulfill them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:-&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4w8fn1ucv9ltxjx5m4gj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4w8fn1ucv9ltxjx5m4gj.png" alt="Objectives" width="536" height="350"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;p&gt;Before directly jumping into development &amp;amp; design, it's better to refer some sample websites and list out some idea's you like about them.&lt;/p&gt;

&lt;p&gt;You can find reference websites easily by simply searching&lt;br&gt;
&lt;code&gt;Top portfolio websites in &amp;lt;xyz&amp;gt; field&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Following are some of the portfolios I referred:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://saurabhdaware.in/"&gt;saurabhdaware.in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rleonardi.com/"&gt;rleonardi.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make a note of features that you feel you must have in your portfolio.&lt;br&gt;
&lt;strong&gt;Example:-&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhtx0kdcnmhko6qgqyjhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhtx0kdcnmhko6qgqyjhb.png" alt="References" width="663" height="444"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Designing Phase
&lt;/h4&gt;

&lt;p&gt;This is the phase where I put the visualized design into action.&lt;/p&gt;

&lt;p&gt;I put my design in the following format for every page/section.&lt;br&gt;
&lt;code&gt;Requirements&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Light Mode Mobile &amp;amp; Desktop View&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Dark Mode Mobile &amp;amp; Desktop View&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:-&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3m2iqr2jksutxlv1qq7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3m2iqr2jksutxlv1qq7r.png" alt="Design" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Requirement specifies the components which I feel should be present in this page/section.&lt;/p&gt;

&lt;p&gt;Putting requirements besides section designs helps find creative ways to implement the requirement and also reduces the chances of missing out putting important details.&lt;/p&gt;
&lt;h1&gt;
  
  
  Project Structure
&lt;/h1&gt;

&lt;p&gt;In this section, I would like to talk more about the tech stack I have used &amp;amp; the way I have organized my code.&lt;/p&gt;

&lt;p&gt;I have used react.js to create my portfolio since I had just started learning about javascript frameworks at that point in time. &lt;/p&gt;

&lt;p&gt;My portfolio is totally static with no back-end requirement, hence there was no need to implement complex state management, database connectivity, etc.&lt;/p&gt;

&lt;p&gt;I have used SASS, which is a CSS Preprocessor which makes styling components more flexible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack Used&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React.js &lt;a href="https://reactjs.org/"&gt;Learn More&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SASS (For Styling) &lt;a href="https://sass-lang.com/"&gt;Learn More&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since I wanted a single page application(SPA), there was no need to even implement a react-router.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File Structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── src
    ├──📂components
         ├──📂about
              ├── 📄About.scss
              ├── 📄About.js
         ├──📂footer
         ├──📂....&lt;span class="o"&gt;(&lt;/span&gt;Other Components&lt;span class="o"&gt;)&lt;/span&gt;

│   └──📂services &lt;span class="o"&gt;(&lt;/span&gt;APIs&lt;span class="o"&gt;)&lt;/span&gt;  
|   └──📄App.js &lt;span class="o"&gt;(&lt;/span&gt;Root App&lt;span class="o"&gt;)&lt;/span&gt; 
|   └──📄index.js
|   └──📄_variables.scss &lt;span class="o"&gt;(&lt;/span&gt;Variables&lt;span class="o"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my codebase, every page/section of portfolio is &lt;strong&gt;React Class Based Component&lt;/strong&gt; stored in components directory with its respective style file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📄App.js&lt;/strong&gt;&lt;br&gt;
It is a root level component which consists of all the components in the desired order. Here is a rough template of my App.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="c1"&gt;// Module Imports&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Switch Theme as per time Logic&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="c1"&gt;// Console Log Messages&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;changeTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&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="c1"&gt;// Change Theme Helper Function&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="c1"&gt;// * Render the components as a SPA&lt;/span&gt;
    &lt;span class="k"&gt;return&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="nx"&gt;className&lt;/span&gt;&lt;span class="o"&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;App app-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&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;ThemeToggler&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;changeTheme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changeTheme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ThemeToggler&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;NavWidget&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/NavWidget&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;Landing&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Landing&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;Projects&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Projects&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;About&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/About&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;Skills&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Skills&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;Hobbies&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Hobbies&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;Footer&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&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;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Footer&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&amp;gt;&lt;/span&gt;&lt;span class="err"&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;The &lt;strong&gt;📂services&lt;/strong&gt; directory consists of helper methods which call the backend APIs needed (For example I use DEV's API to fetch my articles and display it on my portfolio)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📄_variables.scss&lt;/strong&gt; &lt;br&gt;
It is a SASS file which consist of color combinations &amp;amp; other helpful variables that can be imported in other styles to make them more reusable.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt; &lt;span class="c1"&gt;// Text Colors&lt;/span&gt;
  &lt;span class="nv"&gt;$lightPrimaryText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#3F3D56&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$darkPrimaryText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#FAFAFA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$darkSecondaryColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#FDCA13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$lightSecondaryColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#66BB6A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$lightTextColorGray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#828282&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$darkTextColorBlue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#0d47a1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// Container Colors&lt;/span&gt;
  &lt;span class="nv"&gt;$lightContainerColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#FFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$darkContainerColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;#202D36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;$maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main idea here is to &lt;strong&gt;Define things once, call multiple times&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Optimization
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Don't think your portfolio is good enough? How do you benchmark it?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are some of the tools which help you benchmark your websites with different parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://web.dev/"&gt;web.dev&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://gtmetrix.com/"&gt;gtmetrix.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/speed/pagespeed/insights/"&gt;Page Speed Insights&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These sites will benchmark your websites &amp;amp; will also provide a detailed report to help you make them better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp91xv9dl55tzqxk6w24q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp91xv9dl55tzqxk6w24q.png" alt="Report" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following are some of the steps which I found helpful to increase my SEO and Performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Content Delivery Network (CDN) to serve static assets (I use &lt;a href="http://cloudinary.com/"&gt;Cloudinary&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;Half of the SEO is meta tags (keywords, description, title, favicon, open-graph tags, etc) and the other half is content (make sure to include content related to keywords).&lt;/li&gt;
&lt;li&gt;Minify CSS &amp;amp; JS Files (You will find various tools online to do so)&lt;/li&gt;
&lt;li&gt;Lazy Load Images/Videos&lt;/li&gt;
&lt;li&gt;Use Compressed File Formats (Example &lt;strong&gt;.webp&lt;/strong&gt; for images)&lt;/li&gt;
&lt;li&gt;Use plugins to check color contrasts (Check &lt;a href="https://www.figma.com/community/plugin/733159460536249875/A11y---Color-Contrast-Checker"&gt;this&lt;/a&gt; for Figma)&lt;/li&gt;
&lt;li&gt;Have a xml sitemap, submit sitemap to google.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Deployment
&lt;/h1&gt;

&lt;p&gt;This is the last phase which consists of hosting your websites.&lt;/p&gt;

&lt;p&gt;Following are some the free hosting providers &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; (Provides free SSL)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://firebase.google.com/docs/hosting"&gt;Firebase hosting&lt;/a&gt; (Provides free SSL)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://in.000webhost.com/"&gt;000webhost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.heroku.com/"&gt;Heroku&lt;/a&gt; (One of the most popular to host full stack applications with both a client &amp;amp; a server) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following are some of the widely used paid providers&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://in.godaddy.com/"&gt;GoDaddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/"&gt;Digital Ocean&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use Netlify &amp;amp; Heroku mostly because it is easier to integrate with GitHub's Continuous Integration &amp;amp; Deployment.&lt;/p&gt;

&lt;h1&gt;
  
  
  💖 Feel free to share your portfolios and any other helpful resources in the comments.
&lt;/h1&gt;

</description>
      <category>showdev</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Express Autodocs - A GitHub Action to generate documentation (Submission)</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Mon, 07 Sep 2020 14:21:30 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/express-autodocs-a-github-action-to-generate-documentation-submission-i6g</link>
      <guid>https://dev.to/prafulla-codes/express-autodocs-a-github-action-to-generate-documentation-submission-i6g</guid>
      <description>&lt;p&gt;I am glad to announce my submission to the GitHub Actions Hackathon 😄&lt;/p&gt;

&lt;p&gt;Are you tired of &lt;strong&gt;maintaining&lt;/strong&gt; documentation for your APIs?&lt;/p&gt;

&lt;p&gt;Express AutoDocs is a GitHub action that solves this problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission Category:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Maintainer Must-Haves&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Workflow
&lt;/h2&gt;

&lt;p&gt;Express AutoDocs scans your codebase for express API definitions and automatically generates the documentation and deploys it to a GitHub branch.&lt;/p&gt;

&lt;p&gt;Example Repo - &lt;a href="https://github.com/Pika1998/MERN_shoppinglist"&gt;MERN_SHOPPINGLIST&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  YAML File
&lt;/h2&gt;

&lt;p&gt;Here's how you can integrate Express AutoDocs in your workflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This is a basic workflow to help you get started with Express AutoDocs Action&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Express AutoDocs.&lt;/span&gt;

&lt;span class="c1"&gt;# This specifies when the action should occur&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;master&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;generate_docs_job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generating Docs&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# this step checks out the master branch of your repo using checkout action.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checks out the repository&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;checksout-repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
      &lt;span class="c1"&gt;# this step generates the docs&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generating Docs.&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reading-file&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pika1998/express-autodocs@v0.0.1&lt;/span&gt;
      &lt;span class="c1"&gt;# Use the output from the `hello` step&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get the output time&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "The time was ${{ steps.reading-file.outputs.time }}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For a detailed configuration, checkout the official repository&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/express-autodocs"&gt;
        express-autodocs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub action which automatically generates documentation for your express APIs.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1a2168bc69cb27d9f394c4afd54339352819ecb21f5dcafc04dbb1681cf6c1e0/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966"&gt;&lt;img src="https://camo.githubusercontent.com/1a2168bc69cb27d9f394c4afd54339352819ecb21f5dcafc04dbb1681cf6c1e0/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966" width="100%"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/prafulla-codes/express-autodocsdocs/CONTRIBUTING.md"&gt;&lt;img src="https://camo.githubusercontent.com/81fadac1065e35b4a87ec17a124e893d7f0da1473c66eee669f37dbdd1e56603/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696f6e732d57656c636f6d652d696e666f726d6174696f6e616c3f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c436f6c6f723d626c61636b" alt="Contributions"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/70d69474b0d30bc19794c5a053516974bbd4f6ff5a2c76038ce3cf18391e87bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/70d69474b0d30bc19794c5a053516974bbd4f6ff5a2c76038ce3cf18391e87bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d0b432074fe53c4573dab8b97bab324e1621178989d9a16aaab0e8aa4e0871a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/d0b432074fe53c4573dab8b97bab324e1621178989d9a16aaab0e8aa4e0871a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt;
  &lt;a href="https://twitter.com/prafulla98" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7fd425ebe7837c8b92a0b95d51e52f0c0eccd1f42c88050ea43e496e8fe43657/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d466f6c6c6f77266d6573736167653d4050524146554c4c41393826636f6c6f723d316461316632267374796c653d666f722d7468652d6261646765266c6f676f3d74776974746572266c6162656c436f6c6f723d303030"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f6470581267e0a7035723751aa94f3e19d27c3259f033d0d6f50520d7e9e90ca/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/f6470581267e0a7035723751aa94f3e19d27c3259f033d0d6f50520d7e9e90ca/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💡 Introduction&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This action automatically scans for express APIs in your codebase and generates a documentation website&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Whats New?&lt;/h1&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Added JSDOC Like Syntax to define APIs (Thanks to &lt;a href="https://github.com/rahil1304"&gt;@rahil1304&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Refactored Code &amp;amp; Reduced Bugs (Thanks to &lt;a href="https://github.com/rosborne132"&gt;@rosborne132&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/KulkarniSuraj"&gt;@KulkarniSuraj&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added Unit Tests&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;How to add to your workflow ❔&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;To add this action to your workflow simply modify your workflows &lt;strong&gt;main.yml&lt;/strong&gt; file.&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This is a basic workflow to help you get started with Express AutoDocs Action&lt;/span&gt;
&lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Express AutoDocs.&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This specifies when the action should occur&lt;/span&gt;
&lt;span class="pl-ent"&gt;on&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;push&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;branches&lt;/span&gt;: &lt;span class="pl-s"&gt;[master]&lt;/span&gt;

&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;generate_docs_job&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;runs-on&lt;/span&gt;: &lt;span class="pl-s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Generating Docs&lt;/span&gt;
    &lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step checks out the master branch of your repo using checkout action.&lt;/span&gt;
      - &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Checks out the repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;id&lt;/span&gt;: &lt;span class="pl-s"&gt;checksout-repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;actions/checkout@v2&lt;/span&gt;
        &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
          &lt;span class="pl-ent"&gt;repository&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step generates the docs&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prafulla-codes/express-autodocs"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Info
&lt;/h2&gt;

&lt;p&gt;Easily Pass API Info using JSON in comments&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&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="cm"&gt;/*  
{
    "description":"Checks for token and gets the logged in user",
    "inputs":{
        "x-auth-token":"The JWT Token in header"
    },
    "label":"Public",
    "outputs":{
        "user":"The user object stored in database",
    }
}
*/&lt;/span&gt;
&lt;span class="nx"&gt;router&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="s2"&gt;/user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&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;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&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;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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-password&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="nf"&gt;then&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output Format
&lt;/h2&gt;

&lt;p&gt;Supports two output formats &lt;code&gt;markdown&lt;/code&gt; and &lt;code&gt;standard&lt;/code&gt;&lt;br&gt;
Default output example:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6anlhj2pgecppptozi7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6anlhj2pgecppptozi7d.png" alt="Output 1" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Easy CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;It is very easy to maintain the documentation website since the action deploys the output to a GitHub branch which can be easily set up as a deployment branch using Github pages, Netlify, etc.&lt;/p&gt;

&lt;p&gt;Checkout on &lt;a href="https://github.com/marketplace/actions/express-autodocs"&gt;GitHub MarketPlace&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  💖👨‍💻 It was fun and enlightening to participate in the actions hackathon.
&lt;/h1&gt;

</description>
      <category>actionshackathon</category>
      <category>showdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Working on Github Actions - Update 2 (Beta Release)</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Wed, 02 Sep 2020 09:54:58 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/working-on-github-actions-update-2-beta-release-b44</link>
      <guid>https://dev.to/prafulla-codes/working-on-github-actions-update-2-beta-release-b44</guid>
      <description>&lt;p&gt;It's been a while since I started working on express-autodocs, A GitHub action that generates documentation by scanning express APIs.&lt;/p&gt;

&lt;p&gt;Today I would like to gladly share the first public version of the action with the DEV community 🎉🎊&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/express-autodocs"&gt;
        express-autodocs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub action which automatically generates documentation for your express APIs.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1a2168bc69cb27d9f394c4afd54339352819ecb21f5dcafc04dbb1681cf6c1e0/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966"&gt;&lt;img src="https://camo.githubusercontent.com/1a2168bc69cb27d9f394c4afd54339352819ecb21f5dcafc04dbb1681cf6c1e0/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966" width="100%"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/prafulla-codes/express-autodocsdocs/CONTRIBUTING.md"&gt;&lt;img src="https://camo.githubusercontent.com/81fadac1065e35b4a87ec17a124e893d7f0da1473c66eee669f37dbdd1e56603/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696f6e732d57656c636f6d652d696e666f726d6174696f6e616c3f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c436f6c6f723d626c61636b" alt="Contributions"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/70d69474b0d30bc19794c5a053516974bbd4f6ff5a2c76038ce3cf18391e87bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/70d69474b0d30bc19794c5a053516974bbd4f6ff5a2c76038ce3cf18391e87bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d0b432074fe53c4573dab8b97bab324e1621178989d9a16aaab0e8aa4e0871a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/d0b432074fe53c4573dab8b97bab324e1621178989d9a16aaab0e8aa4e0871a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt;
  &lt;a href="https://twitter.com/prafulla98" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7fd425ebe7837c8b92a0b95d51e52f0c0eccd1f42c88050ea43e496e8fe43657/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d466f6c6c6f77266d6573736167653d4050524146554c4c41393826636f6c6f723d316461316632267374796c653d666f722d7468652d6261646765266c6f676f3d74776974746572266c6162656c436f6c6f723d303030"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f6470581267e0a7035723751aa94f3e19d27c3259f033d0d6f50520d7e9e90ca/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/f6470581267e0a7035723751aa94f3e19d27c3259f033d0d6f50520d7e9e90ca/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💡 Introduction&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This action automatically scans for express APIs in your codebase and generates a documentation website&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Whats New?&lt;/h1&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Added JSDOC Like Syntax to define APIs (Thanks to &lt;a href="https://github.com/rahil1304"&gt;@rahil1304&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Refactored Code &amp;amp; Reduced Bugs (Thanks to &lt;a href="https://github.com/rosborne132"&gt;@rosborne132&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/KulkarniSuraj"&gt;@KulkarniSuraj&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added Unit Tests&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;How to add to your workflow ❔&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;To add this action to your workflow simply modify your workflows &lt;strong&gt;main.yml&lt;/strong&gt; file.&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This is a basic workflow to help you get started with Express AutoDocs Action&lt;/span&gt;
&lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Express AutoDocs.&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This specifies when the action should occur&lt;/span&gt;
&lt;span class="pl-ent"&gt;on&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;push&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;branches&lt;/span&gt;: &lt;span class="pl-s"&gt;[master]&lt;/span&gt;

&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;generate_docs_job&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;runs-on&lt;/span&gt;: &lt;span class="pl-s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Generating Docs&lt;/span&gt;
    &lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step checks out the master branch of your repo using checkout action.&lt;/span&gt;
      - &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Checks out the repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;id&lt;/span&gt;: &lt;span class="pl-s"&gt;checksout-repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;actions/checkout@v2&lt;/span&gt;
        &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
          &lt;span class="pl-ent"&gt;repository&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step generates the docs&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prafulla-codes/express-autodocs"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Here is the working demo:&lt;/p&gt;

&lt;p&gt;✅ Tested on &lt;a href="https://github.com/Pika1998/MERN_shoppinglist/"&gt;Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Processing Output&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iyG5DTLc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--wYGeNzJH--/c_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1rx7p0thhaci93paa5sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iyG5DTLc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--wYGeNzJH--/c_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1rx7p0thhaci93paa5sn.png" alt="Processing output" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docs/readme.md&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9yo6xfd7iwwnl38zsy63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9yo6xfd7iwwnl38zsy63.png" alt="Readme" width="800" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docs/pages/api-items.md&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fndxv7o069zif4i2mq0wh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fndxv7o069zif4i2mq0wh.png" alt="api-items route" width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  💖 Feel free to try out this action &amp;amp; share your opinions about it :)
&lt;/h1&gt;

</description>
      <category>actionshackathon</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Working on Github Actions - Update 1 (The Idea)</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Thu, 20 Aug 2020 17:20:06 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/working-on-github-actions-update-1-the-idea-3age</link>
      <guid>https://dev.to/prafulla-codes/working-on-github-actions-update-1-the-idea-3age</guid>
      <description>&lt;p&gt;After checking out the &lt;a href="https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn"&gt;&lt;strong&gt;Github Actions Hackathon&lt;/strong&gt;&lt;/a&gt;, I started exploring more about GitHub actions and was amazed by learning the amount of power they possess.&lt;/p&gt;

&lt;p&gt;In this post, I would like to share the idea on which I am working for this hackathon (This is not a submission)&lt;/p&gt;

&lt;h1&gt;
  
  
  The Idea
&lt;/h1&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%2Ft4746b3w9ykb5i4rbhv2.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%2Ft4746b3w9ykb5i4rbhv2.png" alt="The Idea"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Current Progress
&lt;/h1&gt;

&lt;p&gt;Right now, the action scans the backend javascript file for express API Calls and just console logs them on each push to the repository&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%2Fskahktebjlpqzewtu07d.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%2Fskahktebjlpqzewtu07d.png" alt="Current Progress"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Description
&lt;/h1&gt;

&lt;p&gt;I plan to scan the backend server file for API calls and also scan the router routes for categorized API calls and then use the keywords get, post, etc to fetch the API call type. &lt;/p&gt;

&lt;p&gt;The backend file path, app variable name used can be given a custom input.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes" rel="noopener noreferrer"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/express-autodocs" rel="noopener noreferrer"&gt;
        express-autodocs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub action which automatically generates documentation for your express APIs.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fd04126435fccd84a52c478b9cf180e789f26a1b007c4c8e4a04a88f7321e842/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966"&gt;&lt;img src="https://camo.githubusercontent.com/fd04126435fccd84a52c478b9cf180e789f26a1b007c4c8e4a04a88f7321e842/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313539383838383734302f457870726573732532304175746f446f63732f657a6769662e636f6d2d6769662d6d616b65725f335f6563386a30732e676966" width="100%"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/prafulla-codes/express-autodocsdocs/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f19e132e1eee7657bc1d87b4a7f8b6d4b9e2f8b243aa810d44e1d008c5d91fc7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e747269627574696f6e732d57656c636f6d652d696e666f726d6174696f6e616c3f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c436f6c6f723d626c61636b" alt="Contributions"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/89a4aa357104f41146e77f2d1e5c4c817f6cb4366253472538fc33d12f170df9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/89a4aa357104f41146e77f2d1e5c4c817f6cb4366253472538fc33d12f170df9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c3e4916a9e9a2b9e38b2b58fe8a1a1cf1b879048ea9023f5b41ec2d8688b450d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/c3e4916a9e9a2b9e38b2b58fe8a1a1cf1b879048ea9023f5b41ec2d8688b450d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d626c61636b"&gt;&lt;/a&gt;
  &lt;a href="https://twitter.com/prafulla98" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ee4c12ccfa63bfe0a78324657d43ffcae691bf96147a6b274fbcb9764fe420df/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d466f6c6c6f77266d6573736167653d4050524146554c4c41393826636f6c6f723d316461316632267374796c653d666f722d7468652d6261646765266c6f676f3d74776974746572266c6162656c436f6c6f723d303030"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5719774842d081c86864513cf6eeb99a1014fe2ef8c87ebaac325012fd694b5b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/5719774842d081c86864513cf6eeb99a1014fe2ef8c87ebaac325012fd694b5b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f70696b61313939382f657870726573732d6175746f646f63733f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💡 Introduction&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This action automatically scans for express APIs in your codebase and generates a documentation website&lt;/p&gt;



&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Whats New?&lt;/h1&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Added JSDOC Like Syntax to define APIs (Thanks to &lt;a href="https://github.com/rahil1304" rel="noopener noreferrer"&gt;@rahil1304&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Refactored Code &amp;amp; Reduced Bugs (Thanks to &lt;a href="https://github.com/rosborne132" rel="noopener noreferrer"&gt;@rosborne132&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/KulkarniSuraj" rel="noopener noreferrer"&gt;@KulkarniSuraj&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added Unit Tests&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;How to add to your workflow ❔&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;To add this action to your workflow simply modify your workflows &lt;strong&gt;main.yml&lt;/strong&gt; file.&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This is a basic workflow to help you get started with Express AutoDocs Action&lt;/span&gt;
&lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Express AutoDocs.&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This specifies when the action should occur&lt;/span&gt;
&lt;span class="pl-ent"&gt;on&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;push&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;branches&lt;/span&gt;: &lt;span class="pl-s"&gt;[master]&lt;/span&gt;

&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;generate_docs_job&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;runs-on&lt;/span&gt;: &lt;span class="pl-s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Generating Docs&lt;/span&gt;
    &lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step checks out the master branch of your repo using checkout action.&lt;/span&gt;
      - &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Checks out the repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;id&lt;/span&gt;: &lt;span class="pl-s"&gt;checksout-repository&lt;/span&gt;
        &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;actions/checkout@v2&lt;/span&gt;
        &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
          &lt;span class="pl-ent"&gt;repository&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; this step generates the docs&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prafulla-codes/express-autodocs" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h1&gt;
  
  
  Suggestions and ideas are most welcome 👨‍💻💖
&lt;/h1&gt;

</description>
      <category>actionshackathon</category>
      <category>github</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What ideas did you consider while making your portfolio?</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Mon, 29 Jun 2020 13:57:04 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/what-ideas-did-you-consider-while-making-your-portfolio-d7f</link>
      <guid>https://dev.to/prafulla-codes/what-ideas-did-you-consider-while-making-your-portfolio-d7f</guid>
      <description>&lt;p&gt;Hi everyone. I am trying to create my portfolio using React.js and I would like to know what ideas y'all went through before creating yours.&lt;/p&gt;

&lt;p&gt;What would you think is one of the key elements for your portfolio? &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>React Native Wifi &amp; Hotspot Wizard.</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Sat, 20 Jun 2020 06:43:04 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/react-native-wifi-hotspot-wizard-550g</link>
      <guid>https://dev.to/prafulla-codes/react-native-wifi-hotspot-wizard-550g</guid>
      <description>&lt;p&gt;A react native library that will allow you to easily configure both Wifi &amp;amp; Hotspot settings programmatically using a single library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-native-wifi-and-hotspot-wizard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Auto Linking
&lt;/h2&gt;

&lt;p&gt;The library supports Auto Linking using the following command&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;react-native link react-native-wifi-and-hotspot-wizard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;
&lt;h2&gt;
  
  
  🧙‍♂️ Wizards
&lt;/h2&gt;

&lt;p&gt;Wizards will help you do all the necessary magic ✨ &lt;/p&gt;

&lt;p&gt;In this context, Wizards are javascript classes that contain functions that will help you configure settings.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;1. Wifi Wizard&lt;/b&gt; (for Wifi Related Configurations)&lt;br&gt;&lt;br&gt;
&lt;b&gt;2. Hotspot Wizard&lt;/b&gt; (for Hotspot Related Configurations)&lt;/p&gt;
&lt;h2&gt;
  
  
  Runtime Permissions
&lt;/h2&gt;

&lt;p&gt;Runtime permissions are automatically managed by the library.&lt;br&gt;
Permission will be asked on the device whenever they are required&lt;/p&gt;
&lt;h2&gt;
  
  
  Importing Wizards
&lt;/h2&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;WifiWizard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HotspotWizard&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-native-wifi-and-hotspot-wizard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Check out the API to learn some magic ✨
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://react-native-wifi-and-hotspot-wizard.netlify.app"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--crlLpSrm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/prafulla98/image/upload/v1592631858/React%2520Native%2520Wifi%2520and%2520Hotspot%2520Wizard/Frame_4get_started_button_fvscwx.png" width="491" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The documentation website is powered by &lt;a href="https://abelljs.org"&gt;AbellJS&lt;/a&gt; which is a static site generation framework.&lt;/p&gt;
&lt;h1&gt;
  
  
  For contributing check out
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/react-native-wifi-and-hotspot-wizard"&gt;
        react-native-wifi-and-hotspot-wizard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Configure essential Wifi and Hotspot Settings Easily
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>showdev</category>
      <category>reactnative</category>
      <category>npm</category>
    </item>
    <item>
      <title>Flutter - Stateless vs Stateful Widgets.</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Sat, 29 Feb 2020 14:32:27 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/flutter-stateless-vs-stateful-widgets-15l</link>
      <guid>https://dev.to/prafulla-codes/flutter-stateless-vs-stateful-widgets-15l</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Have you been wondering about what exactly is the difference between a stateless and a stateful widget?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What are widgets?&lt;/li&gt;
&lt;li&gt;Stateless Widgets&lt;/li&gt;
&lt;li&gt;Stateful Widgets&lt;/li&gt;
&lt;li&gt;Concept of External Data&lt;/li&gt;
&lt;li&gt;Differences Between Stateless and Stateful Widgets&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Widgets &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Widgets are the UI building blocks in Flutter. Everything that you see in a Flutter application is a widget. The entire Flutter Application is itself a widget.&lt;/p&gt;

&lt;p&gt;Widgets are classified into two main types:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stateless Widgets&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. Stateful Widgets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's dive deeper into both the types and later discuss the differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stateless Widgets &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let's start by creating a new widget to get a better understanding of these concepts.&lt;/p&gt;

&lt;p&gt;We will create a &lt;strong&gt;Tips&lt;/strong&gt; Widget which will display a list of tips for programmers to view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tips.dart&lt;/strong&gt;&lt;br&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%2F04hl6s8g3jpt9i9gkqzh.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%2F04hl6s8g3jpt9i9gkqzh.png" alt="Tips Stateless Widget Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  We have:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An array &lt;strong&gt;tips&lt;/strong&gt; which contains the list of tips we would like to show the user.&lt;/li&gt;
&lt;li&gt;A counter &lt;strong&gt;tipIndex&lt;/strong&gt; which will track the tip which is to be shown.&lt;/li&gt;
&lt;li&gt;A renderable &lt;strong&gt;Text()&lt;/strong&gt; which will render the tip at the current &lt;strong&gt;tipIndex&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A renderable &lt;strong&gt;RaisedButton()&lt;/strong&gt; with the label &lt;strong&gt;Next&lt;/strong&gt; which on clicked will render the next tip. Check out the logic of the onPressed function &lt;strong&gt;changeTip()&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Let's embed this widget in our &lt;strong&gt;main.dart&lt;/strong&gt; file.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;main.dart&lt;/strong&gt;&lt;br&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%2Fr75u5om65ai9gn0bfe17.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%2Fr75u5om65ai9gn0bfe17.png" alt="main.dart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Output
&lt;/h3&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%2F5yubqkkw7m53i3gc730k.jpeg" 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%2F5yubqkkw7m53i3gc730k.jpeg" alt="Tips Stateless Output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now in this case after clicking the &lt;strong&gt;Next&lt;/strong&gt; button, the &lt;strong&gt;tipIndex&lt;/strong&gt; must increment and thus the next tip at the index position &lt;strong&gt;1&lt;/strong&gt; should be rendered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUT IT DOESN'T :(&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHY?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because our widget is a &lt;strong&gt;stateless widget&lt;/strong&gt; as it extends the class &lt;strong&gt;StatelessWidget&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stateless Widgets do not have internal states as the name suggests.&lt;/li&gt;
&lt;li&gt;Stateless Widgets have no method by which the UI gets re-rendered whenever the internal values change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The only way a stateless widget can get re-rendered is by passing &lt;strong&gt;EXTERNAL DATA&lt;/strong&gt; which we will talk about after understanding Stateful Widgets.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stateful Widgets &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;These type of widgets do have their own internal states.&lt;/p&gt;

&lt;p&gt;We will convert our stateless tips widget into a stateful one for more understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tips.dart&lt;/strong&gt;&lt;br&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%2Fbp049dmi562ekd0lacem.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%2Fbp049dmi562ekd0lacem.png" alt="Tips Stateful Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Note the following to understand the conversion from stateless to stateful:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The Tips Class now extends StatefulWidget class&lt;/li&gt;
&lt;li&gt;The entire logic of the tips app have been moved to _TipsState class which extends &lt;strong&gt;State&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tips&lt;/strong&gt; Class has a function &lt;strong&gt;createState()&lt;/strong&gt; which returns the _TipState.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above are the three essential changes required to convert a stateless widget to a stateful widget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Output
&lt;/h3&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%2F5yubqkkw7m53i3gc730k.jpeg" 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%2F5yubqkkw7m53i3gc730k.jpeg" alt="Tips Stateful Output 1"&gt;&lt;/a&gt;&lt;br&gt;
After Clicking the next button&lt;br&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%2F5mwgmzfbol8xgg1ustbv.jpeg" 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%2F5mwgmzfbol8xgg1ustbv.jpeg" alt="Tips Stateful Output 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now this is the output which we needed and the main reason it works is because of &lt;strong&gt;setState()&lt;/strong&gt; method which is applied in &lt;strong&gt;changeTip()&lt;/strong&gt; function&lt;/em&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fih1ctvfb0qhwb2qyfpx9.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%2Fih1ctvfb0qhwb2qyfpx9.png" alt="setState Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;setState()&lt;/strong&gt; is a special function only available in Stateful Widgets which updates the state of the widget and re-renders the components that are affected by the change in state.&lt;/p&gt;

&lt;p&gt;We specify the state which is to be updated in setState() function &lt;strong&gt;[we incremented tipIndex]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In our case, only the &lt;strong&gt;Text()&lt;/strong&gt; which displays the tip is re-rendered because only that widget is associated with the change in &lt;strong&gt;tipIndex&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now, let's discuss how &lt;strong&gt;Stateless Widgets&lt;/strong&gt; can get re-rendered using External Data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept Of External Data &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EXTERNAL DATA&lt;/strong&gt; is the data provided to a widget through its constructor.&lt;/p&gt;

&lt;p&gt;Now it's time we split our &lt;strong&gt;Tips&lt;/strong&gt; Widget into two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TipsView &lt;strong&gt;(Just The Widget)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tips &lt;strong&gt;(Top Level Logic)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TipsView&lt;/strong&gt; will just consist of renderable components &lt;strong&gt;Text() and RaisedButton()&lt;/strong&gt; [Note that this is a stateless widget]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt; will contain the top-level logic. The list of tips and the functions to handle the state change will be in this part. [This is a stateful widget]&lt;/p&gt;

&lt;p&gt;This concept is similar to &lt;strong&gt;LIFTING THE STATE UP&lt;/strong&gt; used in web frameworks.&lt;/p&gt;

&lt;p&gt;Let us understand how a stateless widget can get-rendered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tips_view.dart&lt;/strong&gt;&lt;br&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%2F2fzmaczzlzdbsgqv4nkr.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%2F2fzmaczzlzdbsgqv4nkr.png" alt="TipsView Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TipsView is a stateless widget which has a constructor which takes 3 parameters &lt;strong&gt;tip, changeTip and tipIndex&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tip &lt;strong&gt;(The Tip To Be Displayed)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;changeTip &lt;strong&gt;(A pointer to the function which changes the tip)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;tipIndex &lt;strong&gt;(The Current Tip Index)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;tips.dart&lt;/strong&gt;&lt;br&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%2Frv45vlu9zpgdeh0cnk95.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%2Frv45vlu9zpgdeh0cnk95.png" alt="Tips Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the top-level widget which renders the TipsView and &lt;strong&gt;passes down the parameters tip, tipIndex and pointer to the changeTip function&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  FLOW
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;The build method of Tips will render the TipsView with the first tip.&lt;/li&gt;
&lt;li&gt;When &lt;strong&gt;Next&lt;/strong&gt; button inside the TipsView will be pressed, the changeTip function &lt;strong&gt;residing in Tips&lt;/strong&gt; will be called since it's pointer is passed down to TipsView.&lt;/li&gt;
&lt;li&gt;The tipIndex will get incremented and then the &lt;strong&gt;entire TipsView widget will be re-rendered&lt;/strong&gt; with changed parameters.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even after splitting the application it will still have the same functional result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note that in this case the entire stateless widget including Text() and RaisedButton() will be re-rendered and not just the Text()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So this is the use-case which shows re-rendering of stateless widgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Differences Between Stateless and Stateful Widgets &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Stateless widgets have no method to re-render themselves if &lt;strong&gt;INTERNAL DATA&lt;/strong&gt; changes.&lt;/li&gt;
&lt;li&gt;Stateless widgets can only be re-rendered when &lt;strong&gt;EXTERNAL DATA&lt;/strong&gt; changes.&lt;/li&gt;
&lt;li&gt;If a stateless widget is re-rendered then the entire widget is re-rendered.&lt;/li&gt;
&lt;li&gt;Stateful widgets can be re-rendered when &lt;strong&gt;INTERNAL as well as EXTERNAL&lt;/strong&gt; changes.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;setState()&lt;/strong&gt; method in Stateful widgets re-render components only associated with the change in state. It does not re-render the entire widget but only the necessary parts of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Thank you for reading this article 💖.
&lt;/h2&gt;

</description>
      <category>tutorial</category>
    </item>
    <item>
      <title>I created Git-Widget for websites/blogs.</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Wed, 26 Feb 2020 05:50:20 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/i-created-git-widget-for-websites-blogs-1nif</link>
      <guid>https://dev.to/prafulla-codes/i-created-git-widget-for-websites-blogs-1nif</guid>
      <description>&lt;p&gt;Showcase your project's open-source timeline on their websites/blogs using &lt;strong&gt;git-widget&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Check it out
&lt;/h1&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/Prafulla1998/embed/OJVNzxP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;h2&gt;
  
  
  - Via Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;git-widget&lt;/span&gt; &lt;span class="na"&gt;data-projectid=&lt;/span&gt;&lt;span class="s"&gt;"Pika1998/CYOMS"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/git-widget&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Place script tag before the end of the body tag --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/git-widget@1.0.0/dist/card.component.mjs"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  - Via NPM
&lt;/h2&gt;

&lt;p&gt;This can be used in React, Vue and almost any other frontend framework&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; &lt;span class="nt"&gt;--save&lt;/span&gt; git-widget
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Inside your framework component&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;git-widget&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then you can use&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;git-widget&lt;/span&gt; &lt;span class="na"&gt;data-projectid=&lt;/span&gt;&lt;span class="s"&gt;"Pika1998/CYOMS"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/git-widget&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Check out the detailed documentation at&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prafulla-codes"&gt;
        prafulla-codes
      &lt;/a&gt; / &lt;a href="https://github.com/prafulla-codes/Git-Widget"&gt;
        Git-Widget
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       Showcase your projects on their official websites/blogs. 👨‍💻👩‍💻
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Git Widget&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/21e3103bf2fdb4a6d5a685d6f88fbb58d02e3eab1ffbabfb77773fd9ab48f89a/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f6769742d776964676574"&gt;&lt;img src="https://camo.githubusercontent.com/21e3103bf2fdb4a6d5a685d6f88fbb58d02e3eab1ffbabfb77773fd9ab48f89a/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f6769742d776964676574" alt="NPM Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/prafulla-codes/Git-Widget#npm"&gt;&lt;img src="https://camo.githubusercontent.com/2033fc0d2704780b25ec9ff5c38f4e854cbc714cf334ac9a036ab66a65fe520e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6769742d776964676574" alt="NPM Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/prafulla-codes/Git-Widget#contributions"&gt;&lt;img src="https://camo.githubusercontent.com/6c9c6b171726cb8ac0d88a4a35470122603182b1db8f263983e47cbb10aeda47/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f6e747269627574696f6e732d77656c636f6d652d677265656e" alt="Contributions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Showcase your projects on their official websites/blogs. 👨‍💻👩‍💻&lt;/p&gt;
&lt;p&gt;A Detailed timeline of contributions done on your project. 💖&lt;/p&gt;
&lt;p&gt;Codepen - &lt;a href="https://codepen.io/Prafulla1998/pen/OJVNzxP" rel="nofollow"&gt;https://codepen.io/Prafulla1998/pen/OJVNzxP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/prafulla-codes/Git-Widget#installation-and-usage"&gt;&lt;img src="https://camo.githubusercontent.com/68f98aa70f85f541140471b6248cd3b7d45f9d5684c79a6e7a5b5db7104c9bed/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726166756c6c6139382f696d6167652f75706c6f61642f76313538323635313036312f6769742d7769646765742f6769742d7769646765742d73735f72737976706c2e706e67" alt="Screenshot of the Git Widget"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Installation &amp;amp; Usage&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;You can install git-widget using two ways.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;1 - Using Script&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;    &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;git-widget&lt;/span&gt; &lt;span class="pl-c1"&gt;data-projectid&lt;/span&gt;="&lt;span class="pl-s"&gt;Pika1998/CYOMS&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;git-widget&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="pl-c"&gt;&amp;lt;!-- Place script tag before the end of the body tag --&amp;gt;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;src&lt;/span&gt;="&lt;span class="pl-s"&gt;https://unpkg.com/git-widget@1.0.0/dist/card.component.mjs&lt;/span&gt;" &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;module&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;2 - As NPM Module&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This can be used in React, Vue and almost any other frontend framework&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install --save git-widget&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Inside your framework component&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s"&gt;'git-widget'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Attributes&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;attributes&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;data-projectid&lt;/td&gt;
&lt;td&gt;&amp;lt; Your Github UserID &amp;gt; / &amp;lt; Project you want to showcase&amp;gt;&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data-width&lt;/td&gt;
&lt;td&gt;Width of the card&lt;/td&gt;
&lt;td&gt;400px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data-height&lt;/td&gt;
&lt;td&gt;Height of the card&lt;/td&gt;
&lt;td&gt;500px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Changelog&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Pika1998/Git-Widget/releases"&gt;RELEASES&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Contribution&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Feel free to contribute to git widget, checkout &lt;a href="https://github.com/prafulla-codes/Git-WidgetCONTRIBUTING.md"&gt;CONTRIBUTING.md&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prafulla-codes/Git-Widget"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Github - &lt;a href="https://github.com/Pika1998/Git-Widget"&gt;https://github.com/Pika1998/Git-Widget&lt;/a&gt;&lt;br&gt;
 NPM - &lt;a href="https://npmjs.org/package/git-widget"&gt;https://npmjs.org/package/git-widget&lt;/a&gt;&lt;br&gt;
 Codepen - &lt;a href="https://codepen.io/Prafulla1998/pen/OJVNzxP"&gt;https://codepen.io/Prafulla1998/pen/OJVNzxP&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Feel free to make contributions to the project 💖 and 🌟 the repository.
&lt;/h1&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>2019 - My Year Of Awakening.</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Tue, 31 Dec 2019 16:21:49 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/2019-my-year-of-awakening-4dhi</link>
      <guid>https://dev.to/prafulla-codes/2019-my-year-of-awakening-4dhi</guid>
      <description>&lt;p&gt;2019 has been a year of challenges, hardwork, failures and success. Most importantly a year of &lt;strong&gt;&lt;em&gt;LEARNING&lt;/em&gt;&lt;/strong&gt; .&lt;/p&gt;

&lt;h4&gt;
  
  
  This year has certainly been a turning point in my life. Not because this year has brought good things in my life, but because I chose to make my life better from this year.
&lt;/h4&gt;

&lt;p&gt;I would like to share some of my achievements from this year. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  I worked on a freelancing project and &lt;strong&gt;earned&lt;/strong&gt; my first salary.&lt;/li&gt;
&lt;li&gt;  I completed 5 months paid internship and learnt alot of interesting technologies like Node.js, MongoDB, Express.js, Cloud Hosting and much more.&lt;/li&gt;
&lt;li&gt;  I got recruited during campus placements and will be starting &lt;strong&gt;my first job&lt;/strong&gt; as a Trainee Software Developer after graduation.&lt;/li&gt;
&lt;li&gt;  I started making &lt;strong&gt;contributions&lt;/strong&gt; to Open Source. &lt;strong&gt;Thanks to Hacktoberfest.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  I hosted my first desktop application - &lt;a href="https://cyoms.tech"&gt;https://cyoms.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  I &lt;strong&gt;learnt&lt;/strong&gt; to make the best out of every situation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well this is not just a year recap. &lt;strong&gt;I would like to share some things which have helped me in my journey.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Maintaining A Diary
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MevX2XNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/51wakvbiu0a97lkbvlhi.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MevX2XNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/51wakvbiu0a97lkbvlhi.jpeg" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started writing my daily events in a dairy and then later it turned into it a habit. I would definitely suggest maintaining a diary to get some routine in your life.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Your Time. Your Way.
&lt;/h3&gt;

&lt;p&gt;There is no key or a secret to achieve things. Everything indirectly &lt;strong&gt;depends on your time management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There will never be a crash course or a map to manage yourself. Working on yourself and creating your own routines is &lt;strong&gt;&lt;em&gt;the only way&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always feel free to explore and draw from your own experiences.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Feel free to share what helped you this year.&lt;/strong&gt;😄
&lt;/h3&gt;

&lt;h1&gt;
  
  
  Wishing the DEV Community a very Happy New Year🎉🍻🌌🌃🎆.
&lt;/h1&gt;

</description>
      <category>yearinreview</category>
      <category>career</category>
      <category>discuss</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Play Minecraft with friends easily using CYOMS. 👨‍💻👩‍💻</title>
      <dc:creator>Prafulla Raichurkar</dc:creator>
      <pubDate>Thu, 19 Dec 2019 13:32:28 +0000</pubDate>
      <link>https://dev.to/prafulla-codes/play-minecraft-with-friends-easily-using-cyoms-3a1b</link>
      <guid>https://dev.to/prafulla-codes/play-minecraft-with-friends-easily-using-cyoms-3a1b</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Craft Your Own Minecraft Server (CYOMS)&lt;/strong&gt; is a desktop application to easily create and configure minecraft servers.
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Want to play minecraft with friends, but don't know where to start? This is just the right tool for you!&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Download CYOMS from Official Website:-
&lt;/h3&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://cyoms.tech" rel="noopener noreferrer"&gt;https://cyoms.tech&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Visit Official website for downloading latest version of CYOMS and to view a detailed server setup using Hamachi.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzfhqzb9mdkprm3a9tz0j.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzfhqzb9mdkprm3a9tz0j.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 - Configure &amp;amp; Select Folder to create server
&lt;/h3&gt;

&lt;p&gt;CYOMS provides full vanilla support and will soon support craft-bukkit and spigot support.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdynolhel5pr7y3i4jtf9.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdynolhel5pr7y3i4jtf9.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 - You are all set, launch &amp;amp; test the server :)
&lt;/h3&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3xhip3o8ffw3nn0pp84r.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3xhip3o8ffw3nn0pp84r.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Feel free to share your experiences and ideas to improve CYOMS. Happy Crafting ⚒️😄
&lt;/h1&gt;

</description>
      <category>showdev</category>
      <category>tutorial</category>
      <category>tool</category>
      <category>application</category>
    </item>
  </channel>
</rss>
