<?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: Manoj Naidu</title>
    <description>The latest articles on DEV Community by Manoj Naidu (@manojnaidu619).</description>
    <link>https://dev.to/manojnaidu619</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%2F78926%2F4a75efb7-dbf1-46c1-be27-63ac8a58915c.png</url>
      <title>DEV Community: Manoj Naidu</title>
      <link>https://dev.to/manojnaidu619</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manojnaidu619"/>
    <language>en</language>
    <item>
      <title>Rails Deployment to AWS EC2</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Thu, 08 Oct 2020 12:46:54 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/rails-deployment-to-aws-ec2-27pa</link>
      <guid>https://dev.to/manojnaidu619/rails-deployment-to-aws-ec2-27pa</guid>
      <description>&lt;p&gt;Hello developers! A link to the detailed video explaining the deployment process and additional resources are attached below. Please ❤️ this post if you like the content.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/F0FsgktWf34"&gt;
&lt;/iframe&gt;
&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/manojnaidu619" rel="noopener noreferrer"&gt;
        manojnaidu619
      &lt;/a&gt; / &lt;a href="https://github.com/manojnaidu619/manojnaidu619" rel="noopener noreferrer"&gt;
        manojnaidu619
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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 href="https://manojnaidu.now.sh" rel="nofollow noopener noreferrer"&gt;
&lt;img src="https://camo.githubusercontent.com/5b05504150a911b0108792965dad513c0c2cf3f5141265d9f44484202982dfcc/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726163746963616c6465762f696d6167652f66657463682f732d2d434d6d36754f374f2d2d2f635f66696c6c2c665f6175746f2c666c5f70726f67726573736976652c715f6175746f2c685f3330302c775f3530302f68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f757365722f70726f66696c655f696d6167652f37383932362f34613735656662372d646266312d343663312d626532372d3633616338613538393135632e706e67"&gt;
&lt;/a&gt;
&lt;/p&gt;    

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

&lt;/div&gt;

&lt;p&gt;I'm Manoj Naidu, just a simple dude 😁  who loves to build things.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/80cb3ca60c99d53f9d3697322bd75f8d265de9e8da3fc6228f8d135a6785661d/68747470733a2f2f677076632e6172747572696f2e6465762f6d616e6f6a6e61696475363139"&gt;&lt;img src="https://camo.githubusercontent.com/80cb3ca60c99d53f9d3697322bd75f8d265de9e8da3fc6228f8d135a6785661d/68747470733a2f2f677076632e6172747572696f2e6465762f6d616e6f6a6e61696475363139" alt="Profile views"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech &amp;amp; Tools ⚙️&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ea17bbc5b409daa35a68adfc1218fe84562de48c977910f72d5c25de20943b2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f527562792d66697265627269636b3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/7ea17bbc5b409daa35a68adfc1218fe84562de48c977910f72d5c25de20943b2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f527562792d66697265627269636b3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0ea9e612cf43137f8c1eab1eaa36829ff606ee39d3db432ff6f96317a58ef471/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d626c75653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/0ea9e612cf43137f8c1eab1eaa36829ff606ee39d3db432ff6f96317a58ef471/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d626c75653f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;   &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/67696be6a4fd4c31f9c909df56121888a0040b218d31351b28781efb74a47324/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5261696c732d6461726b7265643f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/67696be6a4fd4c31f9c909df56121888a0040b218d31351b28781efb74a47324/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5261696c732d6461726b7265643f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5fcea9916354c80afb0c3ea3814bd97a88b55ee7b2488016d3fe9b6e13e4bf54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6176617363726970742d676f6c64656e726f643f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/5fcea9916354c80afb0c3ea3814bd97a88b55ee7b2488016d3fe9b6e13e4bf54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6176617363726970742d676f6c64656e726f643f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/722eeccc8c7248957f41f6dd271654836908513fc811f90d750d3b4052ae9268/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64654a532d677265656e3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/722eeccc8c7248957f41f6dd271654836908513fc811f90d750d3b4052ae9268/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64654a532d677265656e3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1689ad56b46e68cfa094bc47eaed8b960934832baede8819a965202e30435d0b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72656163742d64656570736b79626c75653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/1689ad56b46e68cfa094bc47eaed8b960934832baede8819a965202e30435d0b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72656163742d64656570736b79626c75653f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/98717b7be71792ff836ea8ef7faf3f227bf93d384c6739332b977caae004b7ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d7973716c2d626c75653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/98717b7be71792ff836ea8ef7faf3f227bf93d384c6739332b977caae004b7ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d7973716c2d626c75653f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5fb57c0c8bb83e4ae842436c1125e1b987b18769c3d3f0837cec85066e6cf8c8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f7374677265732d646f64676572626c75653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/5fb57c0c8bb83e4ae842436c1125e1b987b18769c3d3f0837cec85066e6cf8c8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f7374677265732d646f64676572626c75653f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a1cc58663dc70ad92b1b4b36395425af0fcdc381205658251b1c810ee237078a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656469732d6372696d736f6e3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/a1cc58663dc70ad92b1b4b36395425af0fcdc381205658251b1c810ee237078a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656469732d6372696d736f6e3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/56f94ca1f1d650c31ff681f0b9c66f85571aee6252be7a7994311d9dd4586313/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769746875622d626c61636b3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/56f94ca1f1d650c31ff681f0b9c66f85571aee6252be7a7994311d9dd4586313/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769746875622d626c61636b3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c12989794dc5c8e0dfd651f2798116966ad350873e47f1533150f3f9d9330583/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f526573746170692d6c69676874736561677265656e3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/c12989794dc5c8e0dfd651f2798116966ad350873e47f1533150f3f9d9330583/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f526573746170692d6c69676874736561677265656e3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2dcd692b1ba2b64c38e1919793f0ad541c94326651e1f9ddcbe9d15efd861b2c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f756e69782d677261793f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/2dcd692b1ba2b64c38e1919793f0ad541c94326651e1f9ddcbe9d15efd861b2c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f756e69782d677261793f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;     &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/411e80a9d7370bfe1d142f26aa3a8965299aeb5e57a14c491edec5db357f9b7b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6865726f6b752d707572706c653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/411e80a9d7370bfe1d142f26aa3a8965299aeb5e57a14c491edec5db357f9b7b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6865726f6b752d707572706c653f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e433adf36d7955641021f2327d8f6a76299a9d41cc5d06b88364486ade8728f3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6177732d73616e647962726f776e3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/e433adf36d7955641021f2327d8f6a76299a9d41cc5d06b88364486ade8728f3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6177732d73616e647962726f776e3f7374796c653d666f722d7468652d6261646765" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Github Stats 📈&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/manojnaidu619" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://camo.githubusercontent.com/834d1aff08bb0688b26ed2dc0028e4a73e6549d98d7035708d8e1cd1e875619e/68747470733a2f2f6769746875622d726561646d652d73746174732e76657263656c2e6170702f6170692f746f702d6c616e67732f3f757365726e616d653d6d616e6f6a6e6169647536313926686964653d7675652c637373267469746c655f636f6c6f723d66666666666626746578745f636f6c6f723d6339636163632669636f6e5f636f6c6f723d3262626338612662675f636f6c6f723d323832613336"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Reach me&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/manojnaidu619/manojnaidu619mailto:manojnaidu619@gmail.com" rel="noopener noreferrer"&gt;&lt;br&gt;
    &lt;img src="https://camo.githubusercontent.com/d5f5f566bfa2ea8cd41788ff5281c02d1423522a09cc2659c158b8cfe6984a16/68747470733a2f2f696d672e69636f6e73382e636f6d2f666c75656e742f34382f3030303030302f676d61696c2e706e67"&gt;&lt;br&gt;
&lt;/a&gt; &lt;br&gt;
     &lt;br&gt;
&lt;a href="https://www.linkedin.com/in/manoj-kumar-d-b65394159/" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
    &lt;img src="https://camo.githubusercontent.com/90f2c064850bf54f18d4a9c0be3d09b08c2f1d2254835889a11ce9f0f9e45391/68747470733a2f2f696d672e69636f6e73382e636f6d2f636f6c6f722f34382f3030303030302f6c696e6b6564696e2d322e706e67"&gt;&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
     &lt;br&gt;
&lt;a href="https://dev.to/manojnaidu619" rel="nofollow"&gt;&lt;br&gt;
  &lt;img src="https://camo.githubusercontent.com/c5cc08110a39dd0c98e653c9a5bb83b0eb7b8ff04adf435cf41ac706e8ad8ed0/68747470733a2f2f6432666c746978307632653073622e636c6f756466726f6e742e6e65742f6465762d62616467652e737667" alt="Manoj Naidu's DEV Profile" height="40" width="40"&gt;&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
     &lt;br&gt;
&lt;a href="https://manojnaidu.now.sh" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://camo.githubusercontent.com/5e6729a31e74652fe1a02a3cf81a7b9248d0fea1c843ca42cdbf4bb696b2fd9d/68747470733a2f2f696d672e69636f6e73382e636f6d2f666c75656e742f34302f3030303030302f6c696e6b2e706e67"&gt;&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/manojnaidu619/manojnaidu619" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>ruby</category>
      <category>aws</category>
      <category>rails</category>
      <category>learning</category>
    </item>
    <item>
      <title>AlphaVantage Action Bot - renders realtime chart of a stock/cryptocurrency inside Readme</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Thu, 17 Sep 2020 11:41:20 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/alphavantage-action-bot-3d05</link>
      <guid>https://dev.to/manojnaidu619/alphavantage-action-bot-3d05</guid>
      <description>&lt;p&gt;Hello programmers, hope you are all doing fantastic!🥳 .We all know that Readme file is crucial for any repository, it serves as a user manual and helps us in getting started. &lt;/p&gt;

&lt;p&gt;This action makes the best use of Readme file to show the trajectory of stock prices in order to gauge your company’s general health.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AlphaVantage Action Bot&lt;/strong&gt; is a Github action that renders the realtime chart of a stock/cryptocurrency inside the readme file. We will be using the &lt;a href="https://www.alphavantage.co/" rel="noopener noreferrer"&gt;Alpha Vantage Public Stock APIs&lt;/a&gt; to build the action bot. You may also check out &lt;a href="https://medium.com/@patrick.collins_58673/stock-api-landscape-5c6e054ee631" rel="noopener noreferrer"&gt;this finance API guide&lt;/a&gt; that surveys some of the popular stock and crypto data APIs in the market.&lt;/p&gt;

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

&lt;p&gt;Wacky Wildcards&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;BITCOIN open price trajectory&lt;/li&gt;
&lt;/ul&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%2Fjtg3iiwe2f6ap5qzwx9d.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%2Fjtg3iiwe2f6ap5qzwx9d.png" alt="Bitcoin open trajectory"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;close price trajectory of APPLE&lt;/li&gt;
&lt;/ul&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%2Fxvdexkflg343fvhtmtzx.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%2Fxvdexkflg343fvhtmtzx.png" alt="Apple close trajectory"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Market Capital(USD) of BTC&lt;/li&gt;
&lt;/ul&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%2F8m331eiavjx3531yd8r7.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%2F8m331eiavjx3531yd8r7.png" alt="BTC market capital"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Setup?
&lt;/h2&gt;

&lt;p&gt;This action could be adopted easily into your project in just 3 steps...&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Step 1&lt;/em&gt; - Adding script file into your repo.
&lt;/h3&gt;

&lt;p&gt;This step is pretty simple, all you need to do is..&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create folder named &lt;code&gt;alphavantage&lt;/code&gt; in the root of your repo.&lt;/li&gt;
&lt;li&gt;Inside &lt;code&gt;alphavantage&lt;/code&gt; folder, add a new python script file with name &lt;code&gt;alphavantage-bot.py&lt;/code&gt; and paste the complete code below&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;From line 8-50, the variables could be customized to requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;So now, your repo will contain a python script file, whose path is &lt;code&gt;YOUR_REPO_NAME/alphavantage/alphavantage-bot.py&lt;/code&gt;. It should look like this...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjbn0ga6gokbg4x8qfmm0.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%2Fjbn0ga6gokbg4x8qfmm0.png" alt="Script Path"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Step 2&lt;/em&gt; - Adding AlphaVantage API key to repo secrets.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Since we are using &lt;a href="https://www.alphavantage.co/documentation/" rel="noopener noreferrer"&gt;AlphaVantage's&lt;/a&gt; API to get the data, we need to obtain API key from them to utilize their service. &lt;a href="https://www.alphavantage.co/support/#api-key" rel="noopener noreferrer"&gt;Click here to get API key&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After filling the basic details, you should get your API key instantly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgc624m1ae2n6rd75bhq8.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%2Fgc624m1ae2n6rd75bhq8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, paste the API key inside your repo secrets with the name &lt;code&gt;ALPHA_VANTAGE_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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%2Fdgaps49v9ni9qbbs32my.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%2Fdgaps49v9ni9qbbs32my.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Step 3&lt;/em&gt; - Setup Workflow file(Final step, yay!).
&lt;/h3&gt;

&lt;p&gt;Paste the below code inside&lt;br&gt;
&lt;code&gt;REPO_ROOT/.github/workflows/AlphaVantage-Action-Bot.yml&lt;/code&gt;&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AlphaVantage-Action-Bot&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*/30&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;  
    &lt;span class="c1"&gt;# Runs every 30th minute&lt;/span&gt;
    &lt;span class="c1"&gt;# Could be customized to requirement&lt;/span&gt;
    &lt;span class="c1"&gt;# To know more about crontabs refer https://crontab.guru/ &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;alphavantage-render-chart&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;steps&lt;/span&gt;&lt;span class="pi"&gt;:&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;checkout repo content&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="c1"&gt;# checkout the repository content to github runner.&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;setup python&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/setup-python@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;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.8&lt;/span&gt; &lt;span class="c1"&gt;#install the python needed&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;Install dependencies&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;python -m pip install --upgrade pip matplotlib pandas alpha_vantage&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;execute python script&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;python ./alphavantage/alphavantage-bot.py&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="na"&gt;ALPHA_VANTAGE_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.ALPHA_VANTAGE_KEY }}&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;Commit and push if changed&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
         &lt;span class="s"&gt;git add .&lt;/span&gt;
         &lt;span class="s"&gt;git diff&lt;/span&gt;
         &lt;span class="s"&gt;git config --global user.email "alphavantage-action-bot@example.com"&lt;/span&gt;
         &lt;span class="s"&gt;git config --global user.name "AlphaVantage Action Bot"&lt;/span&gt;
         &lt;span class="s"&gt;git commit -m "AlphaVantage Action Bot Updated README" -a || echo "No changes to commit"&lt;/span&gt;
         &lt;span class="s"&gt;git push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, your workflow file's path should like something like this...&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%2Feq55q4ho3ottmfnqn9l7.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%2Feq55q4ho3ottmfnqn9l7.png" alt="Wokflow file path"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Congrats! You have successfully set up the workflow 😎
&lt;/h5&gt;
&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&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/manojnaidu619" rel="noopener noreferrer"&gt;
        manojnaidu619
      &lt;/a&gt; / &lt;a href="https://github.com/manojnaidu619/AlphaVantage-Action-Bot" rel="noopener noreferrer"&gt;
        AlphaVantage-Action-Bot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A github action to render real-time stocks/cryptocurrency charts inside readme
    &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;AlphaVantage-Action-Bot&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;A github action to render real-time stocks/cryptocurrency charts inside readme&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/manojnaidu619/AlphaVantage-Action-Bot./alphavantage/chart.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmanojnaidu619%2FAlphaVantage-Action-Bot.%2Falphavantage%2Fchart.png" alt="AlphaVantage-Action-Bot-Chart"&gt;&lt;/a&gt;
**Realtime Stock/Crytpocurrency Chart📈  Rendered By &lt;a href="https://github.com/manojnaidu619/AlphaVantage-Action-Bot" rel="noopener noreferrer"&gt;AlphaVantage-Action-Bot&lt;/a&gt; | Last updated the above chart on Oct 07, 2024(00:57:34) **&lt;/p&gt;
&lt;p&gt;Hello programmers, hope you are all doing fantastic!🥳 .We all know that Readme file is crucial for any repository, it serves as a user manual and helps us in getting started.&lt;/p&gt;
&lt;p&gt;This action makes the best use of readme file to show the trajectory of stock prices in order to gauge your company’s general health.&lt;/p&gt;
&lt;p&gt;📌 &lt;strong&gt;Click on DEV logo below to view detailed article&lt;/strong&gt;&lt;/p&gt;
&lt;a href="https://dev.to/manojnaidu619/alphavantage-action-bot-3d05" rel="nofollow"&gt;
  &lt;img src="https://camo.githubusercontent.com/c5cc08110a39dd0c98e653c9a5bb83b0eb7b8ff04adf435cf41ac706e8ad8ed0/68747470733a2f2f6432666c746978307632653073622e636c6f756466726f6e742e6e65742f6465762d62616467652e737667" alt="Manoj Naidu's DEV Profile" height="100" width="100"&gt;
&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What Is it?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;AlphaVantage Action Bot&lt;/strong&gt; is a Github action that renders the realtime chart of a stock/cryptocurrency inside the readme file. We will be using the &lt;a href="https://www.alphavantage.co/" rel="nofollow noopener noreferrer"&gt;Alpha Vantage Public Stock APIs&lt;/a&gt; to build the action bot. You may also check out &lt;a href="https://medium.com/@patrick.collins_58673/stock-api-landscape-5c6e054ee631" rel="nofollow noopener noreferrer"&gt;this finance API guide&lt;/a&gt; that surveys some of the popular stock and crypto data APIs…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/manojnaidu619/AlphaVantage-Action-Bot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Special Thanks to the AlphaVantage team for reaching me out on this article✌️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;Github Actions Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5ncuRFwnrdc&amp;amp;ab_channel=EddieJaoude" rel="noopener noreferrer"&gt;What are Github actions?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>actionshackathon</category>
      <category>github</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>BookMyGIG - live gigs for live audiences</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Thu, 04 Jun 2020 19:34:13 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/bookmygig-li7</link>
      <guid>https://dev.to/manojnaidu619/bookmygig-li7</guid>
      <description>&lt;p&gt;As the pandemic broke out, Shows/events were called off across the globe. This has impacted the creators severely and made them sit idle at home. This is when I thought of building something which helps creators make some penny online from their fresh content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BookMyGIG&lt;/strong&gt; is a platform where creators/artists perform live online shows(could be related to Dance, Fitness, Comedy, Plays, Wokshops, Concerts and the list goes on...) for live audiences. There is also a chat section, where the users who are part of the same show can chat in realtime while they are watching it.&lt;/p&gt;

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

&lt;p&gt;Exciting Experiments&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hompage with monetization support&lt;/li&gt;
&lt;/ul&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%2Fj7fhciy2hiqvya4zbyhr.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%2Fj7fhciy2hiqvya4zbyhr.png" alt="Hompage with monetization support"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creator gig registration&lt;/li&gt;
&lt;/ul&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%2Fbxlw3xgg2tvkek6d9v8z.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%2Fbxlw3xgg2tvkek6d9v8z.png" alt="Creator gig registration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming credentials&lt;/li&gt;
&lt;/ul&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%2Fv0y5s2jqvwun2ra58wr6.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%2Fv0y5s2jqvwun2ra58wr6.png" alt="Streaming credentials"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming page with no monetization&lt;/li&gt;
&lt;/ul&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%2Foctx8wwzr824lxf7h0bn.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%2Foctx8wwzr824lxf7h0bn.png" alt="Streaming page with no monetization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming page with monetization&lt;/li&gt;
&lt;/ul&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%2Fxoyz8ns5a3bvr64inoa8.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%2Fxoyz8ns5a3bvr64inoa8.png" alt="Streaming page with monetization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stream session&lt;/li&gt;
&lt;/ul&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%2Foy2y7yi1q9n7j596n9fr.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%2Foy2y7yi1q9n7j596n9fr.png" alt="Stream session"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realtime chat demo&lt;/li&gt;
&lt;/ul&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%2Fjq0g59k3lluyn6sq8f30.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjq0g59k3lluyn6sq8f30.gif" alt="Realtime chat demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it Works in a nutshell
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creator's perspective&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registers for a new show/event by filling out gig registration form, where finally needs to provide &lt;code&gt;wallet pointer&lt;/code&gt; to accept the micro-payments.&lt;/li&gt;
&lt;li&gt;After successful registration, OBS credentials are provided to start the live stream.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;User's perspective&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goes through the list of registered shows/events on homepage.&lt;/li&gt;
&lt;li&gt;Gets tickets/access to gigs by making successful online payment.&lt;/li&gt;
&lt;li&gt;Sits back and enjoys the live show 🍿🥤.&lt;/li&gt;
&lt;li&gt;Not just that, users who are part of the same show can chat with each other in realtime with the help of realtime chatbox.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;But, how's monetization working under the hood?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the user is in streaming page (creator's live stream section), the micro-payments are sent to creator's wallet 💰.&lt;/li&gt;
&lt;li&gt;When the user is anywhere in the site other than creator's streaming page, BookMyGIG is making money 💵.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt; looks like...&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
     .....
     &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"monetization"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"$BOOKMYGIG_WALLET_POINTER"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     .....
   &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
     .....
   &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and the JS code looks something like this...&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inStreamPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/gig/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inStreamPage&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metaTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;meta[name="monetization"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;metaTag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content&lt;/span&gt;&lt;span class="dl"&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;$CREATOR_WALLET_POINTER&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;
&lt;h4&gt;
  
  
  Framework/Technologies used :
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;ReactJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.io/" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; as an in-memory database&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/illuspas/Node-Media-Server" rel="noopener noreferrer"&gt;Node-Media-Server&lt;/a&gt; for video streaming&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://socket.io/" rel="noopener noreferrer"&gt;Socket.io&lt;/a&gt; for realtime-chat&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://webmonetization.org/" rel="noopener noreferrer"&gt;Web Monetization API&lt;/a&gt; + &lt;a href="https://coil.com/" rel="noopener noreferrer"&gt;Coil&lt;/a&gt; for monetizing content&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  4 Pillars of the application :
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;REDIS&lt;/strong&gt; is used to store data, as it is an in-memory database which makes our app incredibly fast and the process of exchanging data back and forth is seamless. Our application uses different blend of &lt;a href="https://redislabs.com/redis-enterprise/data-structures/" rel="noopener noreferrer"&gt;built-in data structures&lt;/a&gt; to store and retreive data in an efficient manner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RTMP&lt;/strong&gt; provides a bidirectional message multiplex service over a reliable stream transport, such as TCP, intended to carry parallel streams of video, audio, and data messages, with associated timing information, between a pair of communicating peers. More about RTMP could be learned &lt;a href="https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a creator lists a gig, he/she is given a unique streaming ID which is used to identify the creator on the backend and allocate a separate channel, where creator could live stream and also the audiences of that particular show are isolated from the rest of the channels/shows.&lt;/li&gt;
&lt;li&gt;As soon as the creator hits &lt;code&gt;start stream&lt;/code&gt; button, the video data is transported to media server, where it is encoded to different formats. In our case we use &lt;code&gt;flv&lt;/code&gt;, which is a file format used by Adobe Flash Player to store and deliver synchronized audio and video streams over the Internet.&lt;/li&gt;
&lt;li&gt;Later, on the client side we use a &lt;code&gt;flvjs plugin&lt;/code&gt; to render the video in realtime. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;REALTIME CHAT&lt;/strong&gt; is accomplished using socket.io, which is a library to abstract the &lt;a href="https://en.wikipedia.org/wiki/WebSocket" rel="noopener noreferrer"&gt;WebSocket&lt;/a&gt; connections. It enables realtime, bi-directional communication between web clients and servers. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a client types the message and clicks send, it is sent to server and is then broadcasted to all the connected clients in the same room.&lt;/li&gt;
&lt;li&gt;The messages that gets exchanged within a room is isolated from the outside world.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Also, we are using Redis &lt;a href="https://redis.io/topics/pubsub" rel="noopener noreferrer"&gt;pubsub&lt;/a&gt; indirectly as socket.io internally relies on it to achieve the realtime two-way communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web-Monetization&lt;/strong&gt; gives a special flavour to our product. Apparently, this is one of the best ways to monetize the content by not annoying the users with those flashy banner ads. Let us see how it is being used?

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Creator&lt;/strong&gt; makes money when... 

&lt;ul&gt;
&lt;li&gt;User buys the access to the show.&lt;/li&gt;
&lt;li&gt;User Streams the show(&lt;em&gt;through micro-payments&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BookMyGIG&lt;/strong&gt; makes money when... 

&lt;ul&gt;
&lt;li&gt;User is anywhere in the site(&lt;em&gt;Other than the show streaming page&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Challenges I ran into
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Handling creator data in the backend and storing it efficiently using built-in Redis data structures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fetching all the shows asynchronously(using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" rel="noopener noreferrer"&gt;promises&lt;/a&gt;), and resolving them was tricky.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Figuring out a way to load &amp;amp; play the live stream on the browser without clashing between other sessions was really challenging.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Accomplishments that I'm proud of
&lt;/h2&gt;

&lt;p&gt;I could successfully able to hook-up all the different parts of the application together and come up with the working end product.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;This was the first time having my hands-on experience with Redis, Socket.io, RTMP, Web-Monetization...It was a lot of fun 😁&lt;/p&gt;
&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&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/manojnaidu619" rel="noopener noreferrer"&gt;
        manojnaidu619
      &lt;/a&gt; / &lt;a href="https://github.com/manojnaidu619/bookmygig-frontend" rel="noopener noreferrer"&gt;
        bookmygig-frontend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ReactJS frontend of bookmygig
    &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;BOOKMYGIG&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/manojnaidu619/bookmygig-frontend/blob/master/bookmygig.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmanojnaidu619%2Fbookmygig-frontend%2Fraw%2Fmaster%2Fbookmygig.png" alt="BookMyGig Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;This is the frontend part, checkout the backend &lt;a href="https://github.com/manojnaidu619/bookmygig-backend" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;📌 &lt;strong&gt;Click on DEV logo below to view detailed post&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/manojnaidu619/bookmygig-li7" rel="nofollow"&gt;&lt;br&gt;
  &lt;img src="https://camo.githubusercontent.com/c5cc08110a39dd0c98e653c9a5bb83b0eb7b8ff04adf435cf41ac706e8ad8ed0/68747470733a2f2f6432666c746978307632653073622e636c6f756466726f6e742e6e65742f6465762d62616467652e737667" alt="Manoj Naidu's DEV Profile" height="100" width="100"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Inspiration&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;As the pandemic broke out, Shows/events were called off across the globe. This has impacted the creators severely and made them sit idle at home. This is when I thought of building something which helps creators make some penny online from their fresh content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BookMyGIG&lt;/strong&gt; is a platform where creators/artists perform live online shows(could be related to Dance, Fitness, Comedy, Plays, Wokshops, Concerts and the list goes on...) for live audiences. There is also a chat section, where the users who are part of the same show can chat in realtime while they are watching it.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it Works in a nutshell&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creator's perspective&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registers a new show/event by filling out gig registration form, where finally needs to provide &lt;code&gt;wallet pointer&lt;/code&gt; to accept the micro-payments.&lt;/li&gt;
&lt;li&gt;After successful registration, OBS…&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/manojnaidu619/bookmygig-frontend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/NodeRedis/node-redis" rel="noopener noreferrer"&gt;Node-Redis client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io/commands" rel="noopener noreferrer"&gt;Redis commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://socket.io/docs/rooms-and-namespaces/#Rooms" rel="noopener noreferrer"&gt;Socket.io Rooms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>redis</category>
      <category>socketio</category>
      <category>gftwhackathon</category>
    </item>
    <item>
      <title>Whatsupp SSH? - accessing SSH over WhatsApp</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Sun, 26 Apr 2020 18:43:34 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/whatsupp-ssh-accessing-ssh-over-whatsapp-2g3g</link>
      <guid>https://dev.to/manojnaidu619/whatsupp-ssh-accessing-ssh-over-whatsapp-2g3g</guid>
      <description>&lt;p&gt;We all wanted to have this superpower of controlling anything from anywhere, but that's not possible yet! (maybe someday in the future...) But today I am joyful to showcase my first ever &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; hackathon project, which doesn't open the doors to rule every single thing, but certainly &lt;a href="https://en.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt; / Remote Server over WhatsApp. &lt;/p&gt;

&lt;p&gt;While I was doing my internship, I used to SSH into EC2 many times a week, and to do that I always needed to have my laptop handy. This is not a thing to be worried about. But... when you seriously need to access your remote server for some important update which cannot be postponed and you realize that your laptop is resting at your home. That "&lt;em&gt;oh No!&lt;/em&gt;" moment hurts a lot...&lt;/p&gt;

&lt;p&gt;So, then I started to look for alternatives for accessing my EC2 without leaning towards my laptop always. Then eventually, my internship came to an end, but that "&lt;em&gt;search for alternatives&lt;/em&gt;" was still hanging in my mind.&lt;/p&gt;

&lt;p&gt;Recently, I started learning &lt;a href="http://nodejs.org/"&gt;NodeJS&lt;/a&gt; and this is when I also came across &lt;em&gt;#twiliohackathon&lt;/em&gt; tag on dev. I had no idea about Twilio until I had a look at their &lt;a href="https://www.twilio.com/docs/all"&gt;wide range of APIs&lt;/a&gt; and cool web services offered by them. &lt;/p&gt;

&lt;p&gt;After digging deep into Twilio's services. Finally, that "&lt;em&gt;search for alternatives&lt;/em&gt;" got a slight spark.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, What I built?
&lt;/h2&gt;

&lt;p&gt;I built a Nodejs application integrated with &lt;a href="https://www.twilio.com/whatsapp"&gt;Twilio's API for WhatsApp&lt;/a&gt;, which could be installed and configured on any remote server(&lt;em&gt;dead simple to setup!, trust me&lt;/em&gt; 🙌) or computer(with UNIX based OS), results in gaining access to it remotely and execute shell commands over WhatsApp.&lt;/p&gt;

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

&lt;p&gt;Exciting X-Factors&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Custom Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ats_Ywlh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ixiaq1go03yj7xub05cf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ats_Ywlh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ixiaq1go03yj7xub05cf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;brew-update over Whatsapp&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wbHPJB5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/czuxg1fmkpzh4gbt226r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wbHPJB5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/czuxg1fmkpzh4gbt226r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Executing git commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N9v7XEko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pzbcm8gbr3g9o62u2t1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N9v7XEko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pzbcm8gbr3g9o62u2t1e.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;mkdir over whatsapp&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B3AKm1uF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/626mncp1whlmtj7u83yl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B3AKm1uF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/626mncp1whlmtj7u83yl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;executing Python script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_RLwJXIM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xmpzwg8tondvxf91g60g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_RLwJXIM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xmpzwg8tondvxf91g60g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Demonstrating custom command &lt;strong&gt;ssh-help&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UhpFl5GB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/faaxhp80qiebqjhy3txv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UhpFl5GB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/faaxhp80qiebqjhy3txv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Demonstrating custom command &lt;strong&gt;ssh-reset&lt;/strong&gt; (to reset the working directory)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qe5oZpSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hncsbz8rbcwt297y5i6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qe5oZpSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hncsbz8rbcwt297y5i6k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Demonstrating custom command &lt;strong&gt;ssh-status&lt;/strong&gt; (to retreive system status and extra info)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k2g9Fmh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x6r6b3bgc07xs3mu759u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k2g9Fmh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x6r6b3bgc07xs3mu759u.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Demonstrating custom command &lt;strong&gt;ssh-history&lt;/strong&gt; (alias version of &lt;code&gt;history&lt;/code&gt; bash command. But here it lists the commands executed over Whatsapp)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dhGWU82u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wtzxk0e7ank73ihrlq3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dhGWU82u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wtzxk0e7ank73ihrlq3e.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TI9psMEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j79xer6tbbupzgg47qa7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TI9psMEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j79xer6tbbupzgg47qa7.png" alt="Whatsupp-SSH working demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHASE-1&lt;/strong&gt; ➜ The command which we need to execute on the server is sent to Twilio. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHASE-2&lt;/strong&gt; ➜ Twilio forwards the request to our app. For this particular action to work, we need to setup a webhook inside twilio console...(We will talk about this in &lt;em&gt;Setup&lt;/em&gt; section of this post).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHASE-3&lt;/strong&gt; ➜ After receiving the request from Twilio, Our app first verifies that the request is actually being sent by Twilio. Otherwise, the request would be rejected. Then, it executes the command entered by the user and sends back the output/response in the format which is understood by Twilio (&lt;a href="https://www.twilio.com/docs/glossary/what-is-twilio-markup-language-twiml"&gt;Twilio Markup Language(TwiML)&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHASE-4&lt;/strong&gt; ➜ Once Twilio receives back the TwiML response from our app, it sends it back to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the Stack?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pure NodeJS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📍 But, to setup and get started we need...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Valid Twilio account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A remote server/ computer (on which we could execute shell commands, I am using AWS EC2)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Setup?
&lt;/h2&gt;

&lt;p&gt;The setup process is really simple, you just have to follow these four steps...&lt;/p&gt;

&lt;p&gt;✏️ &lt;strong&gt;STEP-1&lt;/strong&gt;. Signup for a Twilio Account and join the Twilio Whatsapp sandbox.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signup for an account &lt;a href="https://www.twilio.com/try-twilio"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jQMVFfuq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wu4euy6unpglv7d7ugli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jQMVFfuq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wu4euy6unpglv7d7ugli.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, login and join the &lt;a href="https://www.twilio.com/console/sms/whatsapp/learn"&gt;sandbox&lt;/a&gt; by doing as directed on screen and complete all 3 steps. &lt;strong&gt;Don't share your sandbox code with anyone&lt;/strong&gt; (&lt;em&gt;The red block covers my sandbox code&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ModKoClv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2318vtr78kp5ivvkonaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ModKoClv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2318vtr78kp5ivvkonaw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One final thing needs to be added into Twilio. We will see that later...&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✏️ &lt;strong&gt;STEP-2&lt;/strong&gt; Configure port on the server/ computer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you are setting up in the local computer, then you are free to skip to &lt;strong&gt;STEP-3&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If setting up in a remote server, then you need to configure the instance/ droplet to open &lt;strong&gt;port 3003&lt;/strong&gt; for incoming requests. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 port 3003 is where Twilio would be forwarding the requests to...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If using AWS EC2 then you need to add a new rule inside &lt;em&gt;Security Groups -&amp;gt; Inbound rules&lt;/em&gt; of a particular instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XlkAieRw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rfcm89isdqibzqoa9mmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XlkAieRw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rfcm89isdqibzqoa9mmw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then add a new rule like so...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4kLRlnJ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1veh11y5k98i3iv673ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4kLRlnJ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1veh11y5k98i3iv673ah.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 If using other than EC2, then refer to official docs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✏️ &lt;strong&gt;STEP-3&lt;/strong&gt; Let's move towards our computer/ server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 All the actions from now are performed inside the terminal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into the directory where you want to clone the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now, clone the project repo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/manojnaidu619"&gt;
        manojnaidu619
      &lt;/a&gt; / &lt;a href="https://github.com/manojnaidu619/Whatsupp-SSH"&gt;
        Whatsupp-SSH
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Access your SSH over Whatsapp
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;git clone https://github.com/manojnaidu619/Whatsupp-SSH.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cd&lt;/code&gt; into the project folder and run &lt;code&gt;sudo npm install&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Whatsupp-SSH/ 

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;As we are logging the requests into a log file, we need to give appropriate permissions to the app directory and the folders inside it.
(The path to project must be absolute)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; a+rw ~/home/Whatsupp-SSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Now adding &lt;code&gt;env&lt;/code&gt; variables, which our app relies on. &lt;em&gt;Make sure the key is same as mentioned below.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 Here, I am considering Ubuntu as the OS.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/bash.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;scroll down to the bottom of the file and add these lines by replacing the values.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export SSH_PSWD=YOUR_DESIRED_PASSWORD
export TWILIO_URL=http://PUBLIC_IP_OF_SERVER:3003/Whatsupp-SSH
export TWILIO_AUTH_TOKEN=YOUR_TWILIO_AUTH_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;then source the &lt;code&gt;bash.bashrc&lt;/code&gt; file by typing.&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/bash.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Now, copy the same TWILIO_URL that was added to &lt;code&gt;bash.bashrc&lt;/code&gt; file. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 Remember that we had one last thing to add to &lt;em&gt;Twilio sandbox configuration&lt;/em&gt;... It's time to do that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;head to &lt;em&gt;twilio console -&amp;gt; programmable SMS -&amp;gt; Whatsapp -&amp;gt; Sandbox&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--usVKHMpv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b82ff33ai80yn0kuh4hl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--usVKHMpv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b82ff33ai80yn0kuh4hl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding that, scroll down and hit &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;✏️ &lt;strong&gt;STEP-4&lt;/strong&gt;. Head to your server/computer and run these final commands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install &lt;code&gt;pm2&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;pm2 &lt;span class="nt"&gt;--global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Now, run &lt;code&gt;pm2 startup&lt;/code&gt; to initialize startup scripts. So, whenever the server reboots/ crashes, our node app would also be picked up automatically.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pm2 startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wcoB0uTZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yqguqyxoumm6ypjl9hrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wcoB0uTZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yqguqyxoumm6ypjl9hrw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now copy-paste the command given by pm2 (the one outlined by red border) and hit &lt;strong&gt;enter&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, to save them all run &lt;code&gt;pm2 save&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;just one final command left, you have successfully setup the app. Now let's start the &lt;code&gt;pm2&lt;/code&gt; server.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pm2 start ABSOLUTE_PATH_TO_WHATSUPP-SSH/src/app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KBxhGRXH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dqh1tjmg392dde1czsqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBxhGRXH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dqh1tjmg392dde1czsqu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hurray! 🙌 your app is now up and running, get started by sending a simple command to your Twilio sandbox over Whatsapp&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are all the Unique features?
&lt;/h2&gt;

&lt;p&gt;Apart from executing traditional shell commands, our app supports and has cool features built-in. Here they are...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;in-app user authentication&lt;/strong&gt;. Before executing any command, the user has to authenticate himself by entering the correct password. He can continue, only if the authentication is successful.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 The execution thread gets locked automatically every 5 minutes(once after the user is authenticated), even if no operations were performed. &lt;br&gt;
The user has to re-enter the correct password to continue...This is to stay safe from non-auth users. &lt;em&gt;The lock interval could be modified in &lt;code&gt;src/utils/validators/authValidator.js&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Helper commands&lt;/strong&gt;. &lt;code&gt;ssh-help&lt;/code&gt; is the command to view the list of built-in helper commands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ssh-history&lt;/code&gt; gives the history of remotely executed commands. The log file is saved in logs/requestLogs.log&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ Make sure to frequently clear the file. (By setting a cronjob or by doing it manually).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo reboot&lt;/code&gt; can also be executed, which reboots the system and our node server gets automatically picked up during bootup(as we are using pm2 to manage our node server).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 Our node app starts automatically, even if there was a sudden system crash/ Unexpected error occurs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  How secure is it?
&lt;/h2&gt;

&lt;p&gt;It could be explained in different layers...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layer-1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Webhook Validation&lt;/strong&gt;. This is technically validating the incoming request and making sure it was sent by Twilio. It is done by verifying &lt;code&gt;x-twilio-signature&lt;/code&gt; passed in request headers by Twilio and with different parameters like (&lt;em&gt;authToken&lt;/em&gt;, &lt;em&gt;x-twilio-signature&lt;/em&gt;, &lt;em&gt;webhookUrl&lt;/em&gt;, &lt;em&gt;req.body&lt;/em&gt;). More info on this could be found &lt;a href="https://www.twilio.com/blog/how-to-secure-twilio-webhook-urls-in-nodejs"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layer-2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;in-app authentication&lt;/strong&gt;. After the request is validated in layer-1, the user needs to enter the correct password to get authenticated and the user's authStatus would be reset every 5 minutes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Challenges came across
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Managing change in directory state&lt;/strong&gt;. This was very challenging because once the command is executed by the child-process, it gets killed and the further executing process has no idea about the prior change in the working directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Authentication&lt;/strong&gt;. I've talked about it earlier, it was hard to manage the state of the user and to validate each request by also keeping an eye on the last login time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;. Needed to take care of different scopes of errors and process/ child-process crashes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Async code handling&lt;/strong&gt;. As &lt;code&gt;fs&lt;/code&gt; and &lt;code&gt;childProcess&lt;/code&gt; modules provide mostly async functions, these needed to be handled carefully.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What I learned along the way?
&lt;/h2&gt;

&lt;p&gt;The development process was just amazing, every day I got to try something new and different. I would say "&lt;em&gt;Learn and &lt;del&gt;Code&lt;/del&gt; Explore&lt;/em&gt;"  had been my mantra throughout the flow. Learned a lot about spawning a new process and dealing with child processes. Got my hands on file-system, custom middlewares, startup scripts/ init.d scripts, systemctl, etc...&lt;/p&gt;
&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Currently does &lt;strong&gt;not&lt;/strong&gt; support multiple commands execution at once like... &lt;code&gt;cd Sample &amp;amp;&amp;amp; touch hello.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does &lt;strong&gt;not&lt;/strong&gt; know how to react for interactions like when critical commands with &lt;code&gt;sudo&lt;/code&gt; are executed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&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--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/manojnaidu619"&gt;
        manojnaidu619
      &lt;/a&gt; / &lt;a href="https://github.com/manojnaidu619/Whatsupp-SSH"&gt;
        Whatsupp-SSH
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Access your SSH over Whatsapp
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/api/child_process.html"&gt;NodeJS childProcess&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/api/fs.html"&gt;NodeJS fileSystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/docs/whatsapp/api"&gt;Twilio WhatsApp API Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>twiliohackathon</category>
      <category>tutorial</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Gmail Login by Automating Browser</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Sat, 18 Aug 2018 19:27:09 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/gmail-login-by-automating-browser-anl</link>
      <guid>https://dev.to/manojnaidu619/gmail-login-by-automating-browser-anl</guid>
      <description>&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Make sure you run latest version of firefox&lt;/li&gt;
&lt;li&gt;Make sure you have installed geckodriver (a firefox webdriver) in your ruby executable path&lt;/li&gt;
&lt;li&gt;Run

&lt;code&gt;gem install watir&lt;/code&gt;

to install watir gem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It's show time!!
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'watir'&lt;/span&gt;                       
&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Watir&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:firefox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# To launch the browser&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://www.gmail.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;class: &lt;/span&gt;&lt;span class="s2"&gt;"whsOnd zHQkBf"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt; &lt;span class="s2"&gt;"{ YOUR GMAIL ADDRESS HERE }"&lt;/span&gt;  
&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;index: &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;
&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt; &lt;span class="s2"&gt;"{ YOUR GMAIL PASSWORD HERE }"&lt;/span&gt;
&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt; &lt;span class="ss"&gt;:enter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;finally, cd to the script path in the terminal and type&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;ruby FILENAME.rb&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 Sit back and watch it in action!!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>bash</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Rails + Ember</title>
      <dc:creator>Manoj Naidu</dc:creator>
      <pubDate>Sat, 18 Aug 2018 18:20:13 +0000</pubDate>
      <link>https://dev.to/manojnaidu619/rails--ember-40m8</link>
      <guid>https://dev.to/manojnaidu619/rails--ember-40m8</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fz1jitrrw18yms6vou0z6.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fz1jitrrw18yms6vou0z6.png" alt="Rails + Ember"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screencast is available &lt;a href="https://www.youtube.com/watch?v=6H26_ZRxapA" rel="noopener noreferrer"&gt;Here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link to my blogspot &lt;a href="https://manojnaidu619.blogspot.com/" rel="noopener noreferrer"&gt;manojnaidu619.blogspot.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>ember</category>
      <category>jsonapi</category>
    </item>
  </channel>
</rss>
