<?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: Raghav Dhingra</title>
    <description>The latest articles on DEV Community by Raghav Dhingra (@raghavdhingra).</description>
    <link>https://dev.to/raghavdhingra</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%2F394893%2F6e97535a-d746-4484-ab5e-79f4c0fbcbc8.jpeg</url>
      <title>DEV Community: Raghav Dhingra</title>
      <link>https://dev.to/raghavdhingra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raghavdhingra"/>
    <language>en</language>
    <item>
      <title>How to upload Large, Multiple, and Sensitive files on Jotform using Uploadcare Integration</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Sat, 15 Jul 2023 11:42:46 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/how-to-upload-large-multiple-and-sensitive-files-on-jotform-using-uploadcare-integration-31ol</link>
      <guid>https://dev.to/raghavdhingra/how-to-upload-large-multiple-and-sensitive-files-on-jotform-using-uploadcare-integration-31ol</guid>
      <description>&lt;p&gt;Uploadcare is a lightweight, secure, and easy-to-integrate tool for file uploading. It is built on a high-performance infrastructure and has a secured uploading and storing environment.&lt;/p&gt;

&lt;p&gt;Uploadcare integrates with unique features and benefits, including serverless file uploads, in-browser image editing, and support for uploads from dozens of prominent websites.&lt;/p&gt;

&lt;p&gt;The Uploadcare integration is simple to add to the Jotform. There are several options for uploading the file. The user may easily drag and drop files from their local system to the form, add an external file link, use a file management application, or connect to their social accounts, such as Facebook, Instagram, Google Drive, Google Photos, and many more, to attach files to the form.&lt;/p&gt;

&lt;p&gt;The integration should be capable of uploading larger files and managing numerous files at once, as it will be uploading millions of files every day from all over the world. And most importantly, the file must be uploaded and retrieved in a highly secure environment. Uploadcare deserves praise for its comprehensive, adaptable, scalable, and secure features.&lt;/p&gt;

&lt;h4&gt;
  
  
  How should the file be handled during uploads if the internet connection is dropped in the middle?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;By &lt;strong&gt;Tom&lt;/strong&gt;, Expert at &lt;a href="https://broadbandsavvy.com" rel="noopener noreferrer"&gt;Broadband Savvy&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your internet connection drops out when making an upload, what happens next depends on the software application you're using.&lt;br&gt;
In most cases, you will need to restart the upload again from scratch if your internet connection drops out. However, with some FTP clients, you can pause your file upload - this should occur automatically when your internet connection drops out. You can simply recommence the upload when you have a connection again.&lt;br&gt;
This is why it's always best to perform large uploads over FTP, instead of through a web browser, when possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's learn more about how the Uploadcare integration handles everything simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uploading Large file on Jotform, how Uploadcare handles it
&lt;/h2&gt;

&lt;p&gt;Uploadcare handles each file in a creative way so that it can be uploaded to the server online. There is no exact memory space definition for a large file, but let's say it's larger than 20 Mb; it will be broken down into smaller chunks, each of which is 5 Mb in size. After that, the pieces are uploaded to the server. As a result, if an issue arises during uploading or your internet connection becomes slow, it will address the issue and re-upload the little 5 Mb section of the file rather than uploading the entire file again.&lt;/p&gt;

&lt;p&gt;Uploadcare runs a high-speed server in the background that handles each file quickly and reliably without interfering with the content. It also contains a feature that allows you to compress image files during upload without compromising quality, which you may enable from the interface.&lt;/p&gt;

&lt;p&gt;Aside from that, Uploadcare's integration with numerous methods speeds up the uploading process. For example, if we link the Uploadcare form to Facebook, Google Drive, or any other social platform, the data will be quickly sent online; you won't have to wait long.&lt;/p&gt;

&lt;p&gt;That’s how Uploadcare handles every file upload you make on their servers.&lt;/p&gt;

&lt;h4&gt;
  
  
  What are the most effective methods for speeding up the uploading process?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;By Casey Crane, Content Manager at &lt;a href="https://thesslstore.com" rel="noopener noreferrer"&gt;The SSL Store&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Honestly, the biggest hurdle in the upload speed equation is your internet provider. If they’re throttling your connection, there’s not much you can really do to aid the situation. However, two potential solutions to resolve upload speed issues are either using file compression methods like ZIP or RAR or cutting large files into smaller files.&lt;br&gt;
As the process name implies, file compression takes your files and removes redundant data to help streamline the files and reduce their size.&lt;br&gt;
Compare this to file cutting, which is also a pretty self-explanatory term. Imagine taking a 500 MB file and cutting it down into smaller chunks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Uploading multiple files and how it is allowed by Uploadcare
&lt;/h2&gt;

&lt;p&gt;Uploadcare allows you to choose and upload several files at the same time. The Uploadcare Widget in Jotform can be configured to accept multiple files. Furthermore, we may specify the minimum and maximum amount of files that can be uploaded at one time. It is a very handy feature to limit the number of files. We can also choose the type of file to upload at the time of upload, such as only photographs, docs, videos, and so on. When the user clicks done, the widget creates a filegroup with files in the same sequence as in the widget's dialog.&lt;/p&gt;

&lt;p&gt;Let's have a look at how Uploadcare handles multiple-file uploads. When a user uploads numerous files, rather than uploading them one at a time, the files are uploaded simultaneously. This is known as parallel uploading, and it is only done when each file is less than 20 Mb in size.&lt;/p&gt;

&lt;p&gt;If the file size exceeds the required size, the upload will be queued, saving internet traffic and allowing for faster uploading. As previously stated, these uploads will be intelligently handled by multiple servers running in the background.&lt;/p&gt;

&lt;h4&gt;
  
  
  How important is it to safeguard the uploading process, and how to ensure it?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;An answer by &lt;strong&gt;Steven Walker&lt;/strong&gt;, CEO at &lt;a href="https://www.spylix.com" rel="noopener noreferrer"&gt;Spylix&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is important to safeguard uploading processes since many web applications accept user input, and one of the most common types of input is in the form of a file upload. Despite being a consumer application where users upload photos or a business application that accepts PDFs and word documents, file uploads are an essential feature. However, they also leave the site open to several potential risks and vulnerabilities. A hacker can exploit a file upload vulnerability. A file upload vulnerability can open a site to malware, unauthorized server access, attacks on website visitors, hosting illegal files, and more.&lt;br&gt;
To ensure the protection of the uploading processes, use of third-party system: Using an off-the-shelf file upload system is an easy step to achieve secured file uploads with almost zero effort.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What do you think &lt;a class="mentioned-user" href="https://dev.to/uploadcare"&gt;@uploadcare&lt;/a&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigation about Uploadcare for how it ensures security for sensitive files
&lt;/h2&gt;

&lt;p&gt;Uploadcare considers security to be the most important factor while offering services to its customers. Uploadcare encrypts all files and assigns each one a unique id, ensuring a secure environment. We may also define an expiration date and time for the uploaded file so that it can only be seen for a limited period. Aside from that, we can use a secured key to control access to the uploaded data. As a result, unauthorized users have restrictions to operate and utilize the file.&lt;/p&gt;

&lt;p&gt;The GDPR (General Data Protection Regulation), Privacy Shield agreement and HIPAA compliance allow Uploadcare to assure the protection of their users, as well as their clients' sensitive and vital information. And because there are multiple data centers throughout the world, 99.9% of the files will be successfully uploaded and retrieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to integrate the Uploadcare form with Jotform
&lt;/h2&gt;

&lt;p&gt;Setting up Uploadcare integration with the Jotform is an easy task with a few simple steps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a Form using the Jotform Form builder&lt;br&gt;
It's the first step in making a form on Jotform. To do so, go to the Jotform website and sign up, then click the Create form option. Select Start From Scratch from the panel, then Classic Form from the form layout area. This will result in a blank form.&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%2Fuploads%2Farticles%2Fw1yc45q2d95e6iiljgps.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%2Fuploads%2Farticles%2Fw1yc45q2d95e6iiljgps.gif" alt="Create a Jotform Form"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fm3msie1cenl1ihahy0cs.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3msie1cenl1ihahy0cs.JPG" alt="Blank Form"&gt;&lt;/a&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Uploadcare Integration&lt;br&gt;
On the left side, click the Add Form Element button. A side panel will open as a result of this action. From there, navigate to the Widgets section and type Uploadcare into the search box.&lt;br&gt;
Add the Uploadcare Integration to the form by dragging and dropping it.&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%2Fuploads%2Farticles%2Fi8hirkl54ewbp62plgoz.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%2Fuploads%2Farticles%2Fi8hirkl54ewbp62plgoz.gif" alt="Selecting Uploadcare Integration"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting the Uploadcare Integration&lt;br&gt;
Go to the Uploadcare homepage and create an account. This will bring up the Uploadcare dashboard.&lt;br&gt;
Go to the API Key tab on the left panel, copy the public key from the section, and paste it into the key input box in the Uploadcare Widget settings.&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%2Fuploads%2Farticles%2Fjcphg7y3z27falzw3kss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcphg7y3z27falzw3kss.png" alt="Drag drop Uploadcare integration"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customizing the form's options&lt;br&gt;
If you need to enable your form accept multiple documents and set a restriction on the number of files that can be uploaded. That's simple to do from the Widget settings section. From there, we can adjust the form's language, resize the images, apply effects, and more.&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%2Fuploads%2Farticles%2F7qxl1qzc4oz0josayqar.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%2Fuploads%2Farticles%2F7qxl1qzc4oz0josayqar.gif" alt="Customize the form"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click the Preview form button in the top right corner to test your implementation.&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%2Fuploads%2Farticles%2F8qs6t195q3tuczpkjk9m.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%2Fuploads%2Farticles%2F8qs6t195q3tuczpkjk9m.gif" alt="Preview the form"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You have effectively integrated the the secure and fast Uploadcare integration for file uploading with the Jotform.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Anonymous Controller</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Thu, 12 May 2022 17:58:49 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/anonymous-controller-49lo</link>
      <guid>https://dev.to/raghavdhingra/anonymous-controller-49lo</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;I have an inspiration for controlling a device from anywhere around the world using Web Technologies and I always wanted to try out something unique, therefore, developed prototype to illustrate controlling of an IoT robot car connected with the internet, steering with a Progressive Web Application (PWA) built on Javascript.&lt;/p&gt;

&lt;p&gt;It's a Progressive Web Application controller that allows us to control the IoT robot from anywhere in the world via the internet. I used the MQTT protocol for communication between the app and the robot, as well as appwrite integration for user authentication to access the controller. It also have the appwrite's real-time database for tracking user events on the controller that are saved in the database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f0iOY5Dm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hhk80gqxv742ggqzeq7l.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f0iOY5Dm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hhk80gqxv742ggqzeq7l.JPG" alt="Image description" width="880" height="476"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Developed using &lt;strong&gt;Appwrite&lt;/strong&gt; deployed on Digital Ocean, C++, React, Recoil, Service Workers, MQTT, Arduino, ESP, Mosquitto broker deployed on AWS.&lt;/p&gt;

&lt;p&gt;You can heads to &lt;a href="https://appwrite-hack-robo.netlify.app"&gt;https://appwrite-hack-robo.netlify.app/&lt;/a&gt; to control.&lt;/p&gt;

&lt;p&gt;Github Repository Link: &lt;a href="https://github.com/raghavdhingra/Anonymous-Remote"&gt;https://github.com/raghavdhingra/Anonymous-Remote&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;My submission falls under the category of &lt;strong&gt;Wacky Wildcards&lt;/strong&gt;, and &lt;strong&gt;Web2 Wizards&lt;/strong&gt;&lt;/p&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://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/raghavdhingra"&gt;
        raghavdhingra
      &lt;/a&gt; / &lt;a href="https://github.com/raghavdhingra/Anonymous-Remote"&gt;
        Anonymous-Remote
      &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;h1&gt;
Anonymous controller&lt;/h1&gt;
&lt;p&gt;It is a Progressive Web Application controller, through which we can control the IoT robot over the internet from all around the world.
I have used MQTT protocol for the communication between the application and the robot, along with appwrite integration for the authentication for the users to access the controller, also have a real time database for tracking the user events performed on the controller and get saved on the database.&lt;/p&gt;
&lt;p&gt;Developed using &lt;strong&gt;Appwrite&lt;/strong&gt; deployed on Digital Ocean, C++, React, Recoil, Service Workers, MQTT, Arduino, ESP, Mosquitto broker deployed on AWS.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://user-images.githubusercontent.com/24492201/168124983-e50b7c33-2cfb-4885-af85-50901d96c976.JPG"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pR1YyNwW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/24492201/168124983-e50b7c33-2cfb-4885-af85-50901d96c976.JPG" alt="Realtime database"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can heads over to &lt;a href="https://appwrite-hack-robo.netlify.app" rel="nofollow"&gt;https://appwrite-hack-robo.netlify.app&lt;/a&gt; to control the robot from where you are sitting, just remind me to turn on the power supply.😁&lt;/p&gt;
&lt;p&gt;The .ino file should be uploaded to ESP module for the GPIO pins&lt;/p&gt;
&lt;p&gt;Some Images for the controller:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://user-images.githubusercontent.com/24492201/168127710-ef389a1d-ce47-4b2e-8ed6-4439b8fdc0f2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EzvzM64I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/24492201/168127710-ef389a1d-ce47-4b2e-8ed6-4439b8fdc0f2.png" alt="Untitled"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://user-images.githubusercontent.com/24492201/168127775-29556ba7-0b62-469c-b469-a6c88deb2bf8.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_LgEHVYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/24492201/168127775-29556ba7-0b62-469c-b469-a6c88deb2bf8.png" alt="Untitled1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hope you will like it. :)&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/raghavdhingra/Anonymous-Remote"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2jrak2kz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/goaqsfo8kgpa1lvbtmls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2jrak2kz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/goaqsfo8kgpa1lvbtmls.png" alt="Login Page" width="880" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uPG0OgFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wcb7elciyfiv0kwbqt8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uPG0OgFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wcb7elciyfiv0kwbqt8f.png" alt="Controller" width="880" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IiP2Hmj9PpM"&gt;
&lt;/iframe&gt;
  &lt;/p&gt;

&lt;p&gt;Designed and code by &lt;a class="mentioned-user" href="https://dev.to/raghavdhingra"&gt;@raghavdhingra&lt;/a&gt; &lt;/p&gt;

</description>
      <category>appwritehack</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Personal Pinterest with Uploadcare Chrome Extension</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Fri, 04 Feb 2022 12:48:06 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/personal-pinterest-with-uploadcare-chrome-extension-28ap</link>
      <guid>https://dev.to/raghavdhingra/personal-pinterest-with-uploadcare-chrome-extension-28ap</guid>
      <description>&lt;p&gt;Everyone needs an online file storage system that is both personal and secure.&lt;br&gt;
If you have an assignment due and need to submit the link on an urgent basis, or if you like a photo and want to save it online, or if you’re developing an application, and need to display an image or file in it, you’ll need a URL as quick.&lt;/p&gt;

&lt;p&gt;You may do this by opening any browser, typing a URL for online storage applications, waiting for the website to load, going to the dashboard, selecting a file to upload, and searching for the URL to utilize it.&lt;/p&gt;

&lt;p&gt;Alternatively, you can install an easy-to-use Uploadcare Chrome extension that allows you to upload the file directly to the cloud, and instantly access the file link. The file will be saved in the Chrome extension’s history, allowing you to retrieve it anytime you need it.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to install the Chrome extension
&lt;/h2&gt;

&lt;p&gt;To install the extension, go to &lt;a href="https://chrome.google.com/webstore/detail/uploadcare-file-uploader/dgaehcjjbeoplnffljjeckmphcaijpim" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/detail/uploadcare-file-uploader/dgaehcjjbeoplnffljjeckmphcaijpim&lt;/a&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%2Fuploads%2Farticles%2F2p6koexya8abfncco0xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p6koexya8abfncco0xm.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Click on Add to &lt;strong&gt;Chrome button&lt;/strong&gt;, and select &lt;strong&gt;Add Extension&lt;/strong&gt; from the popup. This will install the extension to the Chrome browser and make it available for use.&lt;/p&gt;

&lt;p&gt;Select the extension from the Extensions panel on the right side of the URL bar.&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%2Fuploads%2Farticles%2Fo46hisl0liyhdx1tengy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo46hisl0liyhdx1tengy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will require a &lt;em&gt;Public Key&lt;/em&gt; for usage.&lt;/p&gt;

&lt;p&gt;Go to the Uploadcare website, and create an account: &lt;a href="https://uploadcare.com" rel="noopener noreferrer"&gt;https://uploadcare.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After logging into the account, go to the &lt;a href="https://app.uploadcare.com" rel="noopener noreferrer"&gt;Dashboard&lt;/a&gt; and select API Keys from the left side of the navigation panel.&lt;/p&gt;

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

&lt;p&gt;Copy the API Key from the Public Key dashboard page, paste it into the input box of the extension, and click on the &lt;strong&gt;Select Key&lt;/strong&gt; button.&lt;br&gt;
The extension is now available for use whenever a file has to be uploaded.&lt;/p&gt;

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

&lt;p&gt;The Uploadcare extension provides multiple sources from where you can upload a file. For example, you can get it from the local file system, from Google Drive, Google Photos, Facebook, or paste the given image’s URL.&lt;/p&gt;

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

&lt;p&gt;You just need to choose a file, and the extension will upload it to the cloud storage and provide you with a URL:&lt;/p&gt;

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

&lt;p&gt;You can also view a list of previously uploaded images and their URLs:&lt;/p&gt;

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

&lt;p&gt;A browser extension is a software program created specifically for browsers that allow users to improve their browsing experience and accomplish specific tasks. These extensions are developed using basic web technologies such as HTML, CSS, and JS. We can utilize external libraries like React to develop the extension, but it must be built in plain HTML, CSS, and JavaScript before it can be published in the extension store.&lt;/p&gt;
&lt;h4&gt;
  
  
  So how's it different from web-based applications?
&lt;/h4&gt;

&lt;p&gt;It’s just as simple to create a chrome extension as it is to create a web application. Only the &lt;code&gt;manifest.json&lt;/code&gt; file has to be configured. It is the key file that directs the browser as an extension and contains vital information such as name, description, version, icons, and so on. This file is also responsible for displaying the extension popup. We’ll be ready to finalize the extension after properly configuring the file.&lt;/p&gt;

&lt;p&gt;We have two relevant versions of the manifest for developing browser extensions, each indicating different attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"manifest_version": 2

"manifest_version": 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's an example of how a manifest file looks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "short_name": "Name",
  "name": "Name of the extension",
  "manifest_version": 3,
  "version": "1.0.0",
  "description": "Extension Description goes here",
  "icons": {
    "16": "/assets/icon-16.png",
    "32": "/assets/icon-32.png",
    "48": "/assets/icon-48.png",
    "64": "/assets/icon-64.png",
    "128": "/assets/icon-128.png"
  },
  "action": {
    "default_icon": "/assets/icon.png",
    "default_popup": "/src/index.html",
    "default_title": "Title of the Popup"
  },
  "background": {},
  "permissions": []
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used manifest version 3 to configure the Reactjs-based application for this extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the extension in the browser
&lt;/h2&gt;

&lt;p&gt;You need to clone the application to test the extension in the local environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Git and Node need to be installed on the local system&lt;/li&gt;
&lt;li&gt;Should have a Chrome browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open the terminal, or command prompt, and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/raghavdhingra/UploadCare-Chrome-Extension.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a code editor (e.g. VS Code) on the base directory of the project folder.&lt;br&gt;
For installing the dependency of the project, type&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will create a &lt;code&gt;node_modules&lt;/code&gt; folder in the base directory&lt;/p&gt;

&lt;p&gt;Now, you need to convert the &lt;code&gt;.env.example&lt;/code&gt; file to &lt;code&gt;.env&lt;/code&gt; file.&lt;br&gt;
In the &lt;code&gt;.env&lt;/code&gt; file, we can define the environment variables not visible to other users.&lt;/p&gt;

&lt;p&gt;React builds an HTML file that contains inline scripts, which disrupts the &lt;strong&gt;Content Security Policy&lt;/strong&gt; for the browser extensions.&lt;br&gt;
To solve this, we need the given variable defined in the &lt;code&gt;.env&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INLINE_RUNTIME_CHUNK=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will handle the inline issue with the React build.&lt;br&gt;
&lt;strong&gt;Or&lt;/strong&gt;,&lt;br&gt;
We can directly build up the folder, and manually move all inline scripts in the &lt;code&gt;index.html&lt;/code&gt; file to an external JavaScript file.&lt;/p&gt;

&lt;p&gt;Now you have to build up the project to get the plain HTML files. To do this, type:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It will create a folder named &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We have successfully accomplished the project setup. It’s time to test out the implementation.&lt;/p&gt;

&lt;p&gt;Go to the Chrome browser and insert this link into the URL bar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chrome://extensions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on the &lt;strong&gt;Load Unpacked&lt;/strong&gt; button, and select the &lt;code&gt;build&lt;/code&gt; folder. This will add a new development extension to your tab, and you’ll be able to check out the extension in the extension bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tq41jl7y274oqxeecc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tq41jl7y274oqxeecc0.png" alt="Image description"&gt;&lt;/a&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%2Fuploads%2Farticles%2F4p90qs7a3x3j971htuh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p90qs7a3x3j971htuh0.png" alt="Image description"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fv1e2il58edx7twyeq73g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1e2il58edx7twyeq73g.png" alt="Image description"&gt;&lt;/a&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%2Fuploads%2Farticles%2Feld5zfuu78tuuqs4uyd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feld5zfuu78tuuqs4uyd0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it’s time for you to test it out!&lt;/p&gt;

&lt;p&gt;The project is Open-Sourced at &lt;a href="https://github.com/raghavdhingra/UploadCare-Chrome-Extension" rel="noopener noreferrer"&gt;https://github.com/raghavdhingra/UploadCare-Chrome-Extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you like it! :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>browserextension</category>
    </item>
    <item>
      <title>Voice Enabling your React Apps</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Wed, 26 Jan 2022 08:52:10 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/voice-enabling-your-react-apps-210m</link>
      <guid>https://dev.to/raghavdhingra/voice-enabling-your-react-apps-210m</guid>
      <description>&lt;p&gt;The globe has been transitioning to a new technology generation. In addition, the applications that are being developed must meet the generation's standards.&lt;br&gt;
According to the census of 2022, the global population is estimated to be around 7.9 billion people. Therefore, while building applications, accessibility, and ease of use are significant aspects that are taken into consideration.&lt;/p&gt;

&lt;p&gt;For this tutorial, we will enhance the standards of our generic React-based Web application by integrating Alan AI voice SDK to provide voice accessibility to our application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ckv5AU37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pwwhy34ti2nuj2blfwdz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ckv5AU37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pwwhy34ti2nuj2blfwdz.PNG" alt="Image description" width="689" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we go any further, let's get a fundamental knowledge of Alan AI.&lt;br&gt;
Alan AI is an artificial intelligence technology that helps app developers add voice assistant functionality to their existing apps.&lt;br&gt;
It's a really simple tool to incorporate, and anyone with a basic understanding of JavaScript may do it. Alan AI integration is available to everyone for free.&lt;/p&gt;

&lt;p&gt;Let's begin by building a react application with the help of the basic npm package create-react-app.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prerequisites** Node must be installed in your system&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Open your project folder's terminal or command prompt and type 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;npx create-react-app alan-ai-react-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;y&lt;/code&gt; if prompted to proceed.&lt;/p&gt;

&lt;p&gt;It will take 3-4 minutes to install all the dependencies.&lt;br&gt;
On completion, a folder named &lt;strong&gt;alan-ai-react-app&lt;/strong&gt; will be created.&lt;/p&gt;

&lt;p&gt;Open the project in a code editor (suggestion VSCode).&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMSVu102--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lowyc1gzxlh8hxro2vnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMSVu102--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lowyc1gzxlh8hxro2vnz.png" alt="Image description" width="880" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structure would be as shown in the above image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- alan-ai-app/
    - public/
        - index.html
        - manifest.json
    - node_modules/
    - src/
        - index.js
        - index.css
        - app.js
        - app.css
    - package.json
    - package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, open terminal by going to Terminal section &amp;gt; New Terminal&lt;/p&gt;

&lt;p&gt;A terminal will be opened below the code editor, type:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The browser will be opened automatically, and the application will be started at port 3000 by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fwe7z1xR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jgfo27fowew414k06eu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fwe7z1xR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jgfo27fowew414k06eu.png" alt="Image description" width="880" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back to the terminal, and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @alan-ai/alan-sdk-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install the Alan AI sdk into your application.&lt;br&gt;
Go to the package.json file in the root folder to check whether &lt;strong&gt;@alan-ai/alan-sdk-web&lt;/strong&gt; is present in the dependencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8lOySFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zuh435s08phty9zu2st3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8lOySFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zuh435s08phty9zu2st3.png" alt="Image description" width="880" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to app.js file in the src folder, and replace the code with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import alanBtn from "@alan-ai/alan-sdk-web";
import "./App.css";
const App = () =&amp;gt; {
    const alanAIRef = React.useRef(null);
    const [orderList, setOrderList] = React.useState([]);
    React.useEffect(() =&amp;gt; {
        alanAIRef.current = alanBtn({
            key: "API_KEY",
        });
    }, []);
    return (
        &amp;lt;div className="app"&amp;gt;
        &amp;lt;h1&amp;gt;Demo Restaurant&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;
            Place Order just by clicking on Alan AI voice button
            &amp;lt;br /&amp;gt;
            And say "Pizza", "Burger", or any items
        &amp;lt;/p&amp;gt;
        &amp;lt;div className="order-container"&amp;gt;
            {orderList &amp;amp;&amp;amp; orderList.length &amp;gt; 0 ? (
              &amp;lt;&amp;gt;
                &amp;lt;p&amp;gt;Your Order for&amp;lt;/p&amp;gt;
                &amp;lt;ul className="order-list"&amp;gt;
                   {orderList.map((order, index) =&amp;gt; (
                     &amp;lt;li className="order-list-item" key={index}&amp;gt;
                         {order}
                     &amp;lt;/li&amp;gt;
                   ))}
                &amp;lt;/ul&amp;gt;
              &amp;lt;label&amp;gt;have been placed&amp;lt;/label&amp;gt;
             &amp;lt;/&amp;gt;
           ) : (
              "No order Placed Yet"
           )}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};
export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And app.css code with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.app {
  text-align: center;
}
.order-container {
  margin-top: 2rem;
}
.order-container &amp;gt; p {
  font-weight: 500;
}
.order-list {
  padding: 0;
}
.order-list-item {
  list-style-type: none;
  box-sizing: border-box;
  padding: 1rem;
  margin: 0 1rem;
  display: inline-block;
  box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we have completed the UI of our application, and integrated the Alan AI button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6x4-Nvn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2c3umyvckq0x2ezqum8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6x4-Nvn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2c3umyvckq0x2ezqum8a.png" alt="Image description" width="875" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s the time to add some functionality to it, when we say any item to the voice assistant, it should add it in our order list and that should be displayed on the screen.&lt;/p&gt;

&lt;p&gt;Go to studio.alan.app and create an account to get some free integrations.&lt;/p&gt;

&lt;p&gt;After signing in to the application, the project page will be displayed. Select &lt;code&gt;Create Voice assistant&lt;/code&gt; &amp;gt; &lt;code&gt;Example: Hello World&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jU48McUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rfjwo1gefp1ugmocdh5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jU48McUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rfjwo1gefp1ugmocdh5m.png" alt="Image description" width="875" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will create a voice assistant with some pre-written commands.&lt;br&gt;
To integrate the assistant, click on the Integration button at the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QoBVojc_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/89amgkgerv6msu3cahu4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QoBVojc_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/89amgkgerv6msu3cahu4.png" alt="Image description" width="875" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And click on the copy SDK key and replace “API_KEY” in the app.js in your react application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GROM_mz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/moytmu291ni9x95u8ke9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GROM_mz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/moytmu291ni9x95u8ke9.png" alt="Image description" width="875" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A voice assistant button will be available in your react application on the browser.&lt;/p&gt;

&lt;p&gt;Click on it and say “Hello!”, “How are you?”. It will give some reply according to the commands written in the Alan Studio platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BE_wf_xD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fr7znlmwnp5ktabntbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BE_wf_xD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fr7znlmwnp5ktabntbi.png" alt="Image description" width="875" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back to Alan Studio web app, and replace the HelloWorld file code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const helloPatterns = [
    'Help',
    'I need some help',
    'I am stuck',
    'Please guide me',
    'Hello assistant',
];
intent(helloPatterns, p =&amp;gt; {
    p.play('Hey, I am your food assistant. You can give me your order. What had you like to eat?');
});
intent(`$(COMPLAINT* (.*))`, p =&amp;gt; {
    p.play(`$(COMPLAINT*|food (.*)) is being added`);
    p.play({command: "add", item: p.COMPLAINT.value});
});
const clearPatterns = [
    'Clear',
    'checkout',
    'I am done',
    'done',
    'finish',
];
intent(clearPatterns, p =&amp;gt; {
    p.play(`Cart have been cleared`);
    p.play({command: "clear"});
});

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

&lt;/div&gt;



&lt;p&gt;And back in app.js, replace the use effect code with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  React.useEffect(() =&amp;gt; {
    alanAIRef.current = alanBtn({
      key: "API_KEY",
      onCommand: function (commandData) {
        switch (commandData.command) {
          case "add": {
            const { item } = commandData;
            setOrderList((orLst) =&amp;gt; {
              return [...orLst, item];
            });
            break;
          }
          case "clear": {
            setOrderList([]);
            break;
          }
          default:
            break;
        }
      },
    });
  }, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the code, and it’s the time to test out the implementation,&lt;br&gt;
Go to the react application on the browser, and click on the voice assistant button, and say “Hello!”, continuing with the food names - “Pizza”, “Burger”, “Noodles”, etc…&lt;/p&gt;

&lt;p&gt;It will look something like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0-SttFxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a1qvym9cxe1nmb2c02b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0-SttFxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a1qvym9cxe1nmb2c02b4.png" alt="Image description" width="875" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After Addition, try to say “Clear”, “Checkout”, etc… to clear up the cart.&lt;/p&gt;

&lt;p&gt;This is how you can integrate the Alan AI integration to enable your react application with voice commands.&lt;/p&gt;

&lt;p&gt;The demo application is available on: &lt;a href="https://alan-ai-react-integration.netlify.app"&gt;https://alan-ai-react-integration.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is Open-Sourced at: &lt;a href="https://github.com/raghavdhingra/Alan-AI-React-integration"&gt;https://github.com/raghavdhingra/Alan-AI-React-integration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Join the Alan AI community at &lt;a href="https://bit.ly/alan-slack"&gt;https://bit.ly/alan-slack&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PWA Universal Controller</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Tue, 22 Jun 2021 07:10:41 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/pwa-universal-controller-44c7</link>
      <guid>https://dev.to/raghavdhingra/pwa-universal-controller-44c7</guid>
      <description>&lt;h2&gt;
  
  
  #Control anything around the world
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Surprising?&lt;/strong&gt; Obvio not, all the traditional machines and softwares are being replaced with modernized technology.&lt;br&gt;
Therefore, my concepts and belief also substitute with new ideas.&lt;/p&gt;

&lt;p&gt;I am really fascinated by the world being changed so rapidly with up-to-date designs, plans, structures in terms of software as well as hardware. Not long ago, I have been engrossed in electronics and communication.&lt;br&gt;
&lt;code&gt;P.S. I am not an electronics or electrical student (^_^)/&lt;/code&gt;&lt;br&gt;
Being from a software background, it kick-starts the ability to integrate my software skills with the hardware.&lt;/p&gt;

&lt;p&gt;I am wandering around IoT stuffs for few months, and playing with different components and modules in my leisure time.&lt;br&gt;
Begin to test out the knowledge while developing some astonishing devices, may not be the as good insight as others. But yeah, will share it soon.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inspiration for the project
&lt;/h3&gt;

&lt;p&gt;The project where I have taken an inspiration from, a simple remote control car. I wish to try out a different approach of controlling through a mobile, again ordinary, but not for me.&lt;br&gt;
I had build a car using simple components, NodeMCU (ESP8266), and a motor driver bridge (L298N).&lt;br&gt;
Along with it, I had used the Blynk android application as a medium for controlling. That was my first incredible experience in the field of IoT. Though already made some small projects,but it was just insane.&lt;/p&gt;

&lt;p&gt;Still, want to take it to a higher level. It has a major dependency on an application - Blynk, which I have not developed. I wish to have some personal up-gradation but have no control over it. Also, it has a limitation of connection. The device and the mobile have to be connected over the same wifi network. Again, we can operate through an &lt;strong&gt;android&lt;/strong&gt; mobile application.&lt;br&gt;
&lt;code&gt;#restrictions ヽ(ಠ_ಠ)ノ&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hence, after days of research, got upon a distinct process of communication via &lt;strong&gt;MQTT protocol&lt;/strong&gt;.&lt;br&gt;
I had some experimentation and exploration about the protocol. This is a very lightweight protocol for messaging transmission that follows a pattern of pub/sub.&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%2Fuploads%2Farticles%2Fid82mpv4bp8eq4g2s9oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid82mpv4bp8eq4g2s9oo.png" alt="MQTT Structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, analysis over the scalability factor, efforts for integration over the web. Subsequently, initiated the react application, and set up the MQTT broker over the EC2, again, I don't want to use publicly available brokers due to configuration restrictions.&lt;br&gt;
Finalized the flow, and implemented within few weeks. Cumulatively, it's not more than a week task, but due to other activities alongside, and the research part took more than a month.&lt;br&gt;
After weeks-long work, got the application and the device ready for use.&lt;br&gt;
Currently, anyone around the world can control the IoT device in my room. The only restriction is that the device/car should be connected to the internet.&lt;br&gt;
The current application is a PWA, hence can be installed as a native application over any platform, whether it's Windows, Mac, Linux, Android, Ios, and any other.&lt;br&gt;
For PWA, I have used the service workers to cache all the application data inside and serves when the browser is offline. (But can't control the device)&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%2Fuploads%2Farticles%2Fvxxj8va1zhlf6fv5hld7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxxj8va1zhlf6fv5hld7.png" alt="PWA Structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Multiple controllers can control the device at one time, hence can have disturbance seen, if so (≧∇≦)/.&lt;br&gt;
I have tested the controller and car with some friends over a meet. A delay of 120 ms can be seen while controlling the device due to the internet and the network latency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkbnhsi7888tbjrue7pl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkbnhsi7888tbjrue7pl.png" alt="Dashboard View"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fga6lnp3nebs7ko8iyvt1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fga6lnp3nebs7ko8iyvt1.png" alt="Controller View"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can view the demo video at &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/R8n5rWj3dGc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Test out the controller at &lt;a href="https://controller.raghavdhingra.com" rel="noopener noreferrer"&gt;&lt;strong&gt;controller.raghavdhingra.com&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
Username: &lt;strong&gt;raghavdhingra&lt;/strong&gt;&lt;br&gt;
Password: &lt;strong&gt;qwerty1234&lt;/strong&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Now you have the master control for the car and all my future devices. But will change the password soon 😜
&lt;/h6&gt;

&lt;p&gt;If you wish to have a live demo and play with it, you can mail me at &lt;a href="mailto:admin@raghavdhingra.com"&gt;admin@raghavdhingra.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do give it a like and follow me up on GitHub: &lt;a href="https://github.com/raghavdhingra" rel="noopener noreferrer"&gt;github.com/raghavdhingra&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;p&gt;Frontend - &lt;strong&gt;ReactJs&lt;/strong&gt;, &lt;strong&gt;Recoil&lt;/strong&gt;&lt;br&gt;
Broker - &lt;strong&gt;Mosquitto MQTT&lt;/strong&gt; broker&lt;br&gt;
IoT - &lt;strong&gt;C++&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Broker deployed on &lt;strong&gt;AWS EC2&lt;/strong&gt;&lt;br&gt;
Frontend deployed on &lt;strong&gt;Netlify&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Open-Source
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Frontend code&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/raghavdhingra/React-MQTT" rel="noopener noreferrer"&gt;github.com/raghavdhingra/React-MQTT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IoT device code&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/raghavdhingra/Arduino-Cpp/blob/main/mqtt_car_controller-with-react/mqtt_car_controller-with-react.ino" rel="noopener noreferrer"&gt;github.com/raghavdhingra/Arduino-Cpp/blob/main/mqtt_car_controller-with-react/mqtt_car_controller-with-react.ino&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Connection Diagram
&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%2Fuploads%2Farticles%2Fgoomxz5vjzogmnxicq2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgoomxz5vjzogmnxicq2o.png" alt="Connection Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do check out my other blogs&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  #Control stuff around the world
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>pwa</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building the Portfolio: WebOS</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Fri, 18 Jun 2021 13:29:15 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/building-the-portfolio-webos-1d51</link>
      <guid>https://dev.to/raghavdhingra/building-the-portfolio-webos-1d51</guid>
      <description>&lt;p&gt;The portfolio is one of the most crucial tasks for the developers to create. It not only represents the &lt;em&gt;brief-up&lt;/em&gt; of the dev, rather exhibits the &lt;em&gt;potential&lt;/em&gt; that they have.&lt;br&gt;
Not confined to presenting the projects, and the experience, but it's an art and emotion to showcase the skills and expertise. It might take years of experience to develop an engaging and attractive portfolio.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I came up with the idea
&lt;/h2&gt;

&lt;p&gt;While wandering around the internet and stuff, I explored many interesting ideas and inspirations to create a portfolio. But perceiving a unique idea requires time and creativity. In the era of software, it's not easy to get a unique design to follow up.&lt;/p&gt;

&lt;p&gt;I am fond of listening to EDM. So back in 2019, I was listening to Alan Walker's song "Play" and at the end of the video, there was a link given for their website.&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%2Fuploads%2Farticles%2Fgxzo3bhwjek5vba7wfgz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxzo3bhwjek5vba7wfgz.png" alt="P74y youtube video"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was totally amazed after seeing the website. It was an Operating system-based portal, well designed. You can head up to &lt;a href="https://p74y.com" rel="noopener noreferrer"&gt;p74y.com&lt;/a&gt; to view.&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%2Fuploads%2Farticles%2Fh8b13bakbbr0xn6fp8jk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8b13bakbbr0xn6fp8jk.png" alt="P74y website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial Inspiration
&lt;/h3&gt;

&lt;p&gt;Hence, got an inspiration to design my portfolio in an appearance of an Operating System.&lt;br&gt;
I have started working on the base design, how it will look. The first theme that I have planned out was a Window-based Portfolio, that will have some minor functionalities of accessing different instances of the desktop in the explorer.&lt;br&gt;
It includes the portfolio, projects, and a setting explorer from where customization can be done. But it feels more static and less engaging.&lt;br&gt;
Tech Stack: Django, CSS, Js, PostgreSQL&lt;br&gt;
Time Duration: 1 month&lt;br&gt;
Deployed on &lt;strong&gt;Heroku&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can have a look at the old portfolio design at &lt;a href="https://archive.raghavdhingra.com" rel="noopener noreferrer"&gt;archive.raghavdhingra.com&lt;/a&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%2Fuploads%2Farticles%2Fr1zs7t975yj5trvj06dx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1zs7t975yj5trvj06dx.png" alt="Archived Portfolio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Restructuring the Portfolio
&lt;/h3&gt;

&lt;p&gt;After designing and releasing, I got engaged with some internships and other projects. But again it stuck on the mind, about the unattractive and constant portfolio.&lt;br&gt;
Over a span of one year, I had polished up my skills and experience in other languages and libraries.&lt;br&gt;
I have initiated the whole project from scratch and implemented the knowledge gained over that period, which really gave me a push to design it more extensible. I was also practicing data structures and algorithms, which again assisted me to make it more versatile.&lt;br&gt;
Hence, worked out with the design, and the tech stack. It took around 2 months &lt;code&gt;(* overall, over a span of few months)&lt;/code&gt; to finalize it. The end outline was to design the portfolio in the appearance of &lt;strong&gt;Linux&lt;/strong&gt;.&lt;br&gt;
Tech Stack: React/Redux, Django, PostgreSQL, CSS3&lt;br&gt;
Duration: 2 months **&lt;br&gt;
Deployed on &lt;strong&gt;Google Cloud Platform&lt;/strong&gt;, and &lt;strong&gt;Netlify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can view the latest portfolio at &lt;a href="https://raghavdhingra.com" rel="noopener noreferrer"&gt;raghavdhingra.com&lt;/a&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%2Fuploads%2Farticles%2Fu17r9dn2ehb9zj4nw3nc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu17r9dn2ehb9zj4nw3nc.png" alt="Screenshot 2021-06-18 at 2.45.49 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features ideation
&lt;/h3&gt;

&lt;p&gt;It was a crucial moment to define the features to embrace the portfolio. There was a lot of stuff coming up to my mind. At the same time, consulted some of my colleagues and friends for the ideation phase. Eventually, made a list of all the features to be implemented.&lt;/p&gt;

&lt;p&gt;The portfolio encompasses some of the interesting features,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrated File System&lt;/strong&gt;: Creation, updation, and deletion of files and folders within the portfolio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root terminal&lt;/strong&gt;: Terminal for accessing the features of the portfolio through the root user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings tab&lt;/strong&gt;: Customizing the portfolio according the users, in terms of background theme, font, clicks, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt;: For browsing different stuff within the portfolio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera&lt;/strong&gt;: For clicking out images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Editor&lt;/strong&gt;: Editing and creating the text files for future use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explorers&lt;/strong&gt;: For glancing the portfolio, and other stuff present on the website.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And &lt;em&gt;much more&lt;/em&gt;...&lt;br&gt;
Would definitely love to explore it.&lt;/p&gt;

&lt;p&gt;All the stuff is stored within the local storage, hence your data is being preserved after the portfolio is being refreshed.&lt;br&gt;
P.S. I am not collecting any data, you can check out the network tab for any request made.😂&lt;/p&gt;

&lt;p&gt;The most interesting thing while developing the whole portfolio is that no external library is used. All the features, including, the file system, terminal, are created using vanilla js (Pure Js)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjv4v8uyqvj79eckxzw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjv4v8uyqvj79eckxzw7.png" alt="WebOS-1"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fiybvytfswus9t5jlnexv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiybvytfswus9t5jlnexv.png" alt="WebOS-2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is Open Sourced at:&lt;/p&gt;

&lt;p&gt;WebOS -&lt;br&gt;
Frontent: &lt;a href="https://github.com/raghavdhingra/Web-OS" rel="noopener noreferrer"&gt;https://github.com/raghavdhingra/Web-OS&lt;/a&gt;&lt;br&gt;
Backend: &lt;a href="https://github.com/raghavdhingra/OS_2_Server" rel="noopener noreferrer"&gt;https://github.com/raghavdhingra/OS_2_Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Archived Website - &lt;br&gt;
&lt;a href="https://github.com/raghavdhingra/Portfolio.OS" rel="noopener noreferrer"&gt;https://github.com/raghavdhingra/Portfolio.OS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do follow up on GitHub: &lt;a href="https://github.com/raghavdhingra" rel="noopener noreferrer"&gt;https://github.com/raghavdhingra&lt;/a&gt;&lt;br&gt;
Stay Tuned for more content!&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>react</category>
      <category>redux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Immutable Data Structures for Functional JavaScript</title>
      <dc:creator>Raghav Dhingra</dc:creator>
      <pubDate>Thu, 17 Jun 2021 09:15:28 +0000</pubDate>
      <link>https://dev.to/raghavdhingra/immutable-data-structures-for-functional-javascript-1k5h</link>
      <guid>https://dev.to/raghavdhingra/immutable-data-structures-for-functional-javascript-1k5h</guid>
      <description>&lt;p&gt;First of all, we will know about what is Immutable. Actually, Immutable means not mutable, or changeless. Immutable makes a data structure constant, we cannot change its value by any means.&lt;br&gt;
Let’s assume that we have made a global array and we want to keep it’s value constant throughout the code. For example, we have taken an array with a name “foo”:&lt;br&gt;
var foo = [ 1 , 2 , 3 ];&lt;br&gt;
Now, by-mistake we have used same variable name “foo” as a local variable inside a function or anywhere for defining any array or value. Then, its value gets change. For Example, we have made a new variable “foo1”, and in this suppose we have assigned its value exactly same as foo just adding one more element (say “ 4 ” ) by using push() :&lt;br&gt;
var foo1 = foo.push(4);&lt;br&gt;
Now, the value for “foo” will also change from this code because the push() function will add 4 to the end of the array of “foo” due to which its value becomes — [ 1 , 2 , 3 , 4 ]&lt;br&gt;
This is known as Mutation. That is we have change the value for a particular data structure which we don’t want to, either by mistake, or doing bad code practice, or by one-or-the other means.&lt;br&gt;
But, we don’t want our variable “foo” to re-assign its value to something else. Therefore, we can make our variable immutable so that its value can’t be change even when we have reassign its value somewhere in the code.&lt;br&gt;
But now what about the value of “foo1”. We have to assign its value to [ 1 , 2 , 3 , 4 ] without changing the value of “foo”.&lt;br&gt;
Now most of us think about directly assigning the value to “foo1” as:&lt;br&gt;
var foo1 = [1,2,3,4];&lt;br&gt;
It is right but what about when we have to make a big files having hundreds or thousands of variables and function. Also, which have same elements or values in common. Then, if we assign directly assign each value to the variable, it will make the code bulkier and will covers more memory. This type of practices are bad.&lt;br&gt;
To fix this problem, we can use various types of libraries like “MORI” or we can use “IMMUTABLE.JS”. These libraries help us to make the value of a the variable constant so that its value can’t be change in between the code. Also, it can be helpful in defining another variables by the help of the immutable variables made by using these libraries. For example, we have use “immutable.js” library and we have defined the value of “foo” by using it:&lt;br&gt;
var imjs = require(“immutable”);&lt;br&gt;
var foo = imjs.List.of(1,2,3); //Results in [1,2,3]&lt;br&gt;
var foo1 = foo.push(4); //Results in [1,2,3,4]&lt;br&gt;
Now, the value of “foo” will not change because we have made it immutable. That is its value is [ 1 , 2 , 3 ]. But the value of “foo1” will be now — [1 , 2 , 3 , 4 ].&lt;br&gt;
Working of these Libraries:&lt;br&gt;
Another important thing is that if we want to introduce a new value instead of a particular value of the array “foo” without changing the original value of the array “foo”. The same typo will come that it will change the original value. The simplest way to handle this in a very short way is using a tree structure.&lt;br&gt;
We can take an example of a tree which haves a main trunk which gets smaller and divides itself into many branches as we moves up. Further, on each branch there are many leaves on it. We can consider the main trunk of the tree as the main value of the variable, branches as fragments of the value of the variable, and leaves as the further smaller fragments of the variable where the data can be extracted or changed easily. Similarly, we can divide the whole value into smaller fragments, then assign a new value to that particular fragment and then joining the fragments to make a new array. This can reduce a lot of human efforts and also saves a lot of memory.&lt;br&gt;
The “MORI” and “IMMUTABLE.JS” Libraries works in the same manner as describes above. It breaks data into fragments, changes a particular fragment data to a new value and then joining the fragments to form a new data so that the actual value of the parent variable remains same and a new value is assigned to another variable using the parent variable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1U-Nbbbo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53vao1t3r5gmioax8avu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1U-Nbbbo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53vao1t3r5gmioax8avu.jpeg" alt="1_N9vPzle0z9sj0tp5nd6bbQ"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
