<?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: Aryan Dev Shourie</title>
    <description>The latest articles on DEV Community by Aryan Dev Shourie (@aryan_shourie).</description>
    <link>https://dev.to/aryan_shourie</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1087949%2F19324ca5-7f5b-4e6e-9260-f950e96daef4.jpeg</url>
      <title>DEV Community: Aryan Dev Shourie</title>
      <link>https://dev.to/aryan_shourie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryan_shourie"/>
    <language>en</language>
    <item>
      <title>BrowserAct Hands-On: Real Browser Automation from the CLI</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Wed, 17 Jun 2026 08:37:21 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/browseract-hands-on-real-browser-automation-from-the-cli-41n6</link>
      <guid>https://dev.to/aryan_shourie/browseract-hands-on-real-browser-automation-from-the-cli-41n6</guid>
      <description>&lt;p&gt;A few days ago, I received an email from the BrowserAct team after they came across one of my articles. They introduced BrowserAct as a browser automation CLI built for AI agents and invited me to try it out.&lt;/p&gt;

&lt;p&gt;Browser automation usually means selectors, waits, scripts, browser state management, and debugging.&lt;/p&gt;

&lt;p&gt;Whether you're using Playwright, Selenium, or Puppeteer, even simple browser workflows often require writing and maintaining automation code.&lt;/p&gt;

&lt;p&gt;When the BrowserAct team reached out and invited me to try their browser automation CLI, I was curious about one thing:&lt;/p&gt;

&lt;p&gt;Can an AI-friendly CLI handle real browser workflows without requiring me to write Playwright or Selenium scripts?&lt;/p&gt;

&lt;p&gt;Instead of writing a high-level overview, I decided to install BrowserAct, test it against real websites, create browser sessions, automate interactions, and evaluate how it performs in practical scenarios.&lt;/p&gt;

&lt;p&gt;This article documents my hands-on experience and first impressions after testing BrowserAct on a real-world workflow.&lt;/p&gt;

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

&lt;p&gt;BrowserAct is an open-source browser automation CLI that provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser automation&lt;/li&gt;
&lt;li&gt;Browser session management&lt;/li&gt;
&lt;li&gt;Chrome profile importing&lt;/li&gt;
&lt;li&gt;Content extraction&lt;/li&gt;
&lt;li&gt;Network inspection&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;CAPTCHA assistance&lt;/li&gt;
&lt;li&gt;AI-agent friendly browser interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part is that BrowserAct tries to abstract browser automation into simple commands rather than requiring developers to write Playwright or Selenium scripts.&lt;/p&gt;

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

&lt;p&gt;I installed BrowserAct using uv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;browser-act-cli &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, I verified the available commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI immediately exposed commands for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Browser creation&lt;/li&gt;
&lt;li&gt;Session management&lt;/li&gt;
&lt;li&gt;State inspection&lt;/li&gt;
&lt;li&gt;Content extraction&lt;/li&gt;
&lt;li&gt;Network monitoring&lt;/li&gt;
&lt;li&gt;Screenshot capture&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;At this point it was clear that BrowserAct was much more than a simple web scraping utility.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Test: Content Extraction
&lt;/h2&gt;

&lt;p&gt;I started with the simplest possible example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act stealth-extract https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Example Domain&lt;/span&gt;
This domain is for use in documentation examples without needing permission. Avoid use in operations.
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Learn more&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://iana.org/domains/example&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was returned as clean Markdown.&lt;/p&gt;

&lt;p&gt;No browser scripting.&lt;br&gt;
No selectors.&lt;br&gt;
No parsing logic.&lt;/p&gt;

&lt;p&gt;Just a single command.&lt;/p&gt;
&lt;h2&gt;
  
  
  Testing a Real Website
&lt;/h2&gt;

&lt;p&gt;Next, I wanted to see how BrowserAct handled a modern JavaScript-driven website.&lt;/p&gt;

&lt;p&gt;I chose the Whale TV careers page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act stealth-extract &lt;span class="se"&gt;\ &lt;/span&gt;https://www.whaletv.com/careers &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--content-type&lt;/span&gt; markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6d2rjntszc838fnr6fat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6d2rjntszc838fnr6fat.png" alt="BrowserAct Self Extract example" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct successfully extracted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job titles&lt;/li&gt;
&lt;li&gt;Locations&lt;/li&gt;
&lt;li&gt;Employment types&lt;/li&gt;
&lt;li&gt;Job links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the positions extracted included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart TV App Engineer / Smart TV App Specialist&lt;/li&gt;
&lt;li&gt;Product Manager&lt;/li&gt;
&lt;li&gt;Technical Product Specialist&lt;/li&gt;
&lt;li&gt;Android System Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extraction was surprisingly clean and readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extracting a Detailed Job Description
&lt;/h2&gt;

&lt;p&gt;Next, I tested a specific job posting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act stealth-extract &lt;span class="se"&gt;\ &lt;/span&gt;https://www.whaletv.com/open-positions/smart-tv-app-engineer-smart-tv-app-specialist &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--content-type&lt;/span&gt; markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faehhqfy07rrku8h1wrla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faehhqfy07rrku8h1wrla.png" alt="BrowserAct extract specific info" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct extracted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job title&lt;/li&gt;
&lt;li&gt;Employment type&lt;/li&gt;
&lt;li&gt;Location&lt;/li&gt;
&lt;li&gt;Responsibilities&lt;/li&gt;
&lt;li&gt;Technical requirements&lt;/li&gt;
&lt;li&gt;Contact information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, the extracted technical stack included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Bootstrap&lt;/li&gt;
&lt;li&gt;Lightning JS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was more than simple HTML retrieval. The content was structured and immediately usable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Browser From My Existing Chrome Profile
&lt;/h2&gt;

&lt;p&gt;The next feature I wanted to evaluate was browser creation.&lt;/p&gt;

&lt;p&gt;First, I listed the available browser profiles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act browser list-profiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local_profile_101257381414961177 Your Chrome     local      shouriearyandev@gmail.com      Chrome
  browser:chrome_local_101261645860307073 whale-tv-evaluation managed    -                              whale-tv-evaluation

Total: 2 profiles

Tip: Use "browser-act browser create --source-profile &amp;lt;PROFILE_ID&amp;gt;" to create a browser from a profile.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I then created a browser using my existing Chrome profile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act browser create &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--type&lt;/span&gt; chrome &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"whale-tv-evaluation-test"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--desc&lt;/span&gt; &lt;span class="s2"&gt;"Testing BrowserAct browser automation features"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--source-profile&lt;/span&gt; &amp;lt;profile-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;chrome_local_101361762646884363 name="whale-tv-evaluation-test" type=chrome&lt;/span&gt;
  &lt;span class="py"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Testing BrowserAct browser automation features, navigation, interaction, and content extraction for Smart TV and developer tooling evaluation."&lt;/span&gt;
  &lt;span class="py"&gt;imported_cookies&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1606&lt;/span&gt;
  &lt;span class="py"&gt;imported_ls_domains&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;160&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BrowserAct reported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;imported_cookies&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1592&lt;/span&gt;
&lt;span class="py"&gt;imported_ls_domains&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;157&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser was created successfully with existing browser state imported automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listing Available Browsers
&lt;/h2&gt;

&lt;p&gt;To verify that the browser had been created successfully, I listed the available browsers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act browser list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

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

&lt;p&gt;The newly created browser appeared in the list and was ready to be used for automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opening a Browser Session
&lt;/h2&gt;

&lt;p&gt;After creating a browser, I opened a new browser session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;browser open &lt;span class="se"&gt;\ &lt;/span&gt;&amp;lt;browser-id&amp;gt; &lt;span class="se"&gt;\ &lt;/span&gt;https://www.google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;session_name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;whale-test&lt;/span&gt;
&lt;span class="py"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;chrome&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://www.google.com/&lt;/span&gt;
&lt;span class="py"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Google&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BrowserAct immediately created a session and navigated to Google.&lt;br&gt;
The output included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;session_name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;whale-test&lt;/span&gt;
&lt;span class="py"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;chrome&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://www.google.com&lt;/span&gt;
&lt;span class="py"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Google&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirmed that the browser was operational and ready for interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting Page State
&lt;/h2&gt;

&lt;p&gt;One of BrowserAct's most interesting features is the ability to inspect a page and receive a structured representation of its interactive elements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmzc9k4dnkzz92j933mb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmzc9k4dnkzz92j933mb.png" alt="Inspecting page state example" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of exposing raw HTML, BrowserAct generated an interaction tree.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;[14] Search Box&lt;br&gt;
[17] Google Search&lt;br&gt;
[18] I'm Feeling Lucky&lt;/p&gt;

&lt;p&gt;This makes interaction significantly easier because actions can be performed using element indexes rather than CSS selectors.&lt;/p&gt;
&lt;h2&gt;
  
  
  Entering a Search Query
&lt;/h2&gt;

&lt;p&gt;Using the index returned by the state command, I entered a search query.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;input 14 &lt;span class="s2"&gt;"Whale TV careers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;input&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Whale TV careers"&lt;/span&gt; &lt;span class="s"&gt;element=14&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BrowserAct successfully entered the text into the search box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clicking Search
&lt;/h2&gt;

&lt;p&gt;Next, I triggered the search.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;click 17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clicked=17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The click was executed successfully.&lt;/p&gt;

&lt;p&gt;To allow the page to finish loading, I waited for the browser to become stable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nb"&gt;wait &lt;/span&gt;stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wait completed: page is stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This demonstrated how BrowserAct handles browser interactions through a simple command-driven workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigating Directly to Whale TV Careers
&lt;/h2&gt;

&lt;p&gt;Next, I wanted to test direct navigation to a website.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;navigate https://www.whaletv.com/careers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://www.whaletv.com/careers&lt;/span&gt;
&lt;span class="py"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;whaletv.com/careers&lt;/span&gt;
&lt;span class="py"&gt;new_tab&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BrowserAct immediately navigated to the requested URL and reported:&lt;/p&gt;

&lt;p&gt;url=&lt;a href="https://www.whaletv.com/careers" rel="noopener noreferrer"&gt;https://www.whaletv.com/careers&lt;/a&gt;&lt;br&gt;
title=whaletv.com/careers&lt;/p&gt;

&lt;p&gt;At this point I was interacting with a real-world website rather than a simple test page.&lt;/p&gt;
&lt;h2&gt;
  
  
  Discovering Interactive Elements
&lt;/h2&gt;

&lt;p&gt;After loading the careers page, I inspected the page state again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6nccxdywqllc6i990sk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6nccxdywqllc6i990sk.png" alt="Inspecting new page state example" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct identified actionable elements such as:&lt;/p&gt;

&lt;p&gt;[11] Head of Ad Sales, Emerging Markets&lt;br&gt;
[12] Ad Operations Specialist&lt;br&gt;
[15] Accept Cookies&lt;/p&gt;

&lt;p&gt;The conversion of page content into actionable elements is one of the most interesting aspects of BrowserAct's workflow.&lt;/p&gt;
&lt;h2&gt;
  
  
  Opening a Job Posting
&lt;/h2&gt;

&lt;p&gt;Next, I clicked one of the available job listings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;click 11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clicked=11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BrowserAct opened the job posting and navigated to the detailed job description page.&lt;/p&gt;

&lt;p&gt;Once again, I waited for the page to finish loading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nb"&gt;wait &lt;/span&gt;stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wait completed: page is stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page was now ready for content extraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extracting the Job Content
&lt;/h2&gt;

&lt;p&gt;Finally, I extracted the content from the job details page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; whale-test &lt;span class="se"&gt;\ &lt;/span&gt;get markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxokb0omxgmuzsur30vuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxokb0omxgmuzsur30vuf.png" alt="Extracting job details example" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct returned the complete job description including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsibilities&lt;/li&gt;
&lt;li&gt;Required qualifications&lt;/li&gt;
&lt;li&gt;Employment details&lt;/li&gt;
&lt;li&gt;Contact information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point I had completed an end-to-end workflow:&lt;/p&gt;

&lt;p&gt;Create Browser&lt;br&gt;
→ Open Session&lt;br&gt;
→ Navigate&lt;br&gt;
→ Inspect State&lt;br&gt;
→ Click Elements&lt;br&gt;
→ Wait&lt;br&gt;
→ Extract Content&lt;/p&gt;

&lt;p&gt;without writing a single line of browser automation code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Commands Tested During Evaluation
&lt;/h2&gt;

&lt;p&gt;During my evaluation, I successfully tested the following BrowserAct capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Extraction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act stealth-extract &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser Profile Discovery&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act browser list-profiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser Creation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act browser create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser Sessions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act browser open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Page Inspection&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser Interaction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act input 
browser-act click 
browser-act navigate 
browser-act wait stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Content Extraction From Active Sessions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-act get markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Through this testing, I was able to evaluate BrowserAct across both extraction and browser automation workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  BrowserAct vs Traditional Browser Automation
&lt;/h2&gt;

&lt;p&gt;During testing, I couldn't help comparing BrowserAct to tools such as Playwright and Selenium.&lt;/p&gt;

&lt;p&gt;Traditional browser automation usually involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing code&lt;/li&gt;
&lt;li&gt;Creating selectors&lt;/li&gt;
&lt;li&gt;Handling waits&lt;/li&gt;
&lt;li&gt;Managing browser state&lt;/li&gt;
&lt;li&gt;Managing sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BrowserAct takes a different approach.&lt;/p&gt;

&lt;p&gt;Instead of building automation through code, many workflows can be performed directly through CLI commands.&lt;/p&gt;

&lt;p&gt;For quick tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extracting website content&lt;/li&gt;
&lt;li&gt;Navigating pages&lt;/li&gt;
&lt;li&gt;Opening browser sessions&lt;/li&gt;
&lt;li&gt;Clicking buttons&lt;/li&gt;
&lt;li&gt;Reading page content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the workflow feels significantly lighter.&lt;/p&gt;

&lt;p&gt;That doesn't replace full automation frameworks, but it does make many common browser tasks much faster to execute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Might Find BrowserAct Useful?
&lt;/h2&gt;

&lt;p&gt;Based on my testing, BrowserAct could be useful for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Agent Development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers building AI agents that need browser capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Research Workflows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Collecting information from websites and extracting structured content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automating simple browser interactions without building a complete automation framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Tooling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Internal tools that need browser-based capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Extraction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Extracting structured content from modern websites.&lt;/p&gt;

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

&lt;p&gt;My goal was simple: install BrowserAct, test it on real websites, and determine whether it could handle practical browser automation workflows.&lt;/p&gt;

&lt;p&gt;During testing I was able to:&lt;/p&gt;

&lt;p&gt;✅ Install BrowserAct&lt;/p&gt;

&lt;p&gt;✅ Extract content from multiple websites&lt;/p&gt;

&lt;p&gt;✅ Extract detailed job descriptions&lt;/p&gt;

&lt;p&gt;✅ Import an existing Chrome profile&lt;/p&gt;

&lt;p&gt;✅ Create a browser&lt;/p&gt;

&lt;p&gt;✅ Open browser sessions&lt;/p&gt;

&lt;p&gt;✅ Navigate websites&lt;/p&gt;

&lt;p&gt;✅ Inspect page structure&lt;/p&gt;

&lt;p&gt;✅ Interact with page elements&lt;/p&gt;

&lt;p&gt;✅ Extract content after navigation&lt;/p&gt;

&lt;p&gt;Most importantly, I was able to complete an entire workflow:&lt;/p&gt;

&lt;p&gt;Create Browser&lt;br&gt;
→ Open Session&lt;br&gt;
→ Navigate&lt;br&gt;
→ Inspect&lt;br&gt;
→ Click&lt;br&gt;
→ Wait&lt;br&gt;
→ Extract&lt;/p&gt;

&lt;p&gt;using CLI commands instead of writing browser automation code.&lt;/p&gt;

&lt;p&gt;For developers interested in browser automation, AI agents, content extraction, or developer tooling, BrowserAct is definitely worth exploring.&lt;/p&gt;

&lt;p&gt;This was my first round of testing, and I focused primarily on installation, content extraction, browser creation, session management, navigation, and page interaction.&lt;/p&gt;

&lt;p&gt;There are still several capabilities I haven't explored in depth yet, including verification handling, remote human handoff, screenshots, network inspection, multi-session workflows, and some of BrowserAct's more advanced browser management features.&lt;/p&gt;

&lt;p&gt;Those areas deserve their own dedicated evaluation, which I'll likely cover in a follow-up article after additional testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This article focused on validating the core BrowserAct workflow:&lt;/p&gt;

&lt;p&gt;In future testing, I plan to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote human handoff with &lt;code&gt;remote-assist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CAPTCHA and verification workflows&lt;/li&gt;
&lt;li&gt;Screenshot generation&lt;/li&gt;
&lt;li&gt;Network inspection capabilities&lt;/li&gt;
&lt;li&gt;Parallel browser sessions&lt;/li&gt;
&lt;li&gt;Chrome profile reuse across workflows&lt;/li&gt;
&lt;li&gt;Multi-browser isolation strategies&lt;/li&gt;
&lt;li&gt;More complex end-to-end automation scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those tests are successful, I'll publish a follow-up article documenting the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Try BrowserAct:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://browseract.com?fpr=aryan21" rel="noopener noreferrer"&gt;https://browseract.com?fpr=aryan21&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct GitHub Skills:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/browser-act/skills" rel="noopener noreferrer"&gt;https://github.com/browser-act/skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserAct Documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.browseract.com" rel="noopener noreferrer"&gt;https://docs.browseract.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;This article includes an affiliate link. If you decide to try BrowserAct through my referral link, I may earn a commission at no additional cost to you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>HTML You Think You Know (But Probably Don’t)</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Thu, 08 Jan 2026 08:37:09 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/html-you-think-you-know-but-probably-dont-2d6j</link>
      <guid>https://dev.to/aryan_shourie/html-you-think-you-know-but-probably-dont-2d6j</guid>
      <description>&lt;p&gt;HTML is usually the first thing we learn in frontend development —&lt;br&gt;
and the first thing we stop thinking deeply about.&lt;/p&gt;

&lt;p&gt;Most of us write HTML every day, but rarely question:&lt;/p&gt;

&lt;p&gt;Is this the right element?&lt;/p&gt;

&lt;p&gt;How will this behave with a keyboard?&lt;/p&gt;

&lt;p&gt;What does this mean to a screen reader, bot, or automation tool?&lt;/p&gt;

&lt;p&gt;In this article, I revisit HTML from a frontend engineering perspective — not as “just markup,” but as the foundation of everything we build on the web.&lt;/p&gt;

&lt;p&gt;What this article covers&lt;br&gt;
🔹 Semantic HTML&lt;/p&gt;

&lt;p&gt;Why choosing the right element matters more than styling or JavaScript, and how semantics affect accessibility, SEO, and long-term maintainability.&lt;/p&gt;

&lt;p&gt;🔹 Accessibility basics most of us skip&lt;/p&gt;

&lt;p&gt;Keyboard navigation, focus order, and how small HTML choices can either block or enable users.&lt;/p&gt;

&lt;p&gt;🔹 Focus management (tabindex)&lt;/p&gt;

&lt;p&gt;How browsers decide focus order, when tabindex helps, and when it quietly breaks your UI.&lt;/p&gt;

&lt;p&gt;🔹 HTML features we underuse&lt;/p&gt;

&lt;p&gt;Elements and attributes that already solve problems we often reimplement with JavaScript.&lt;/p&gt;

&lt;p&gt;🔹 Why HTML matters even more in 2026&lt;/p&gt;

&lt;p&gt;With AI agents, voice interfaces, Smart TVs, embedded browsers, and automated testing tools consuming our UIs, clean and intentional HTML has become a real advantage.&lt;/p&gt;

&lt;p&gt;Why I wrote this&lt;/p&gt;

&lt;p&gt;As frontend developers, we spend a lot of time optimizing JavaScript and frameworks.&lt;/p&gt;

&lt;p&gt;But many real-world bugs — especially on:&lt;/p&gt;

&lt;p&gt;Smart TVs&lt;/p&gt;

&lt;p&gt;Embedded browsers&lt;/p&gt;

&lt;p&gt;Accessibility-heavy apps&lt;/p&gt;

&lt;p&gt;…come down to HTML fundamentals.&lt;/p&gt;

&lt;p&gt;This article is a reminder that mastering HTML isn’t beginner work — it’s engineering work.&lt;/p&gt;

&lt;p&gt;👉 Read the full article here:&lt;br&gt;
&lt;a href="https://aryanshourie.substack.com/p/html-you-think-you-know-but-probably" rel="noopener noreferrer"&gt;https://aryanshourie.substack.com/p/html-you-think-you-know-but-probably&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts:&lt;/p&gt;

&lt;p&gt;What’s one HTML concept you only truly understood later in your career?&lt;/p&gt;

&lt;p&gt;Any underrated HTML features you rely on?&lt;/p&gt;

&lt;p&gt;Let’s discuss 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>html</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How I Would Learn Frontend Development If I Started in 2026</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Thu, 01 Jan 2026 07:16:56 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/how-i-would-learn-frontend-development-if-i-started-in-2026-4300</link>
      <guid>https://dev.to/aryan_shourie/how-i-would-learn-frontend-development-if-i-started-in-2026-4300</guid>
      <description>&lt;p&gt;Frontend development today has no shortage of tutorials, frameworks, and roadmaps — but that doesn’t always translate to real progress.&lt;/p&gt;

&lt;p&gt;In this article, I share how I would approach learning frontend development if I were starting again in 2026, based on my experience building production web apps and Smart TV applications (LG webOS &amp;amp; Samsung Tizen).&lt;/p&gt;

&lt;p&gt;I cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Why mastering HTML, CSS, and JavaScript still matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building real-world projects instead of basic clones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learning how things work under the hood&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using AI tools and LLMs as learning accelerators (not shortcuts)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exploring frontend beyond the browser&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Read the full article here:&lt;br&gt;
&lt;a href="https://aryanshourie.substack.com/p/how-i-would-learn-frontend-development" rel="noopener noreferrer"&gt;https://aryanshourie.substack.com/p/how-i-would-learn-frontend-development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article was originally published on my Substack newsletter, &lt;strong&gt;Frontend Engineering Weekly&lt;/strong&gt;, where I share one practical frontend engineering post every week.&lt;/p&gt;

&lt;p&gt;If you find the content valuable, do consider subscribing to my free Substack newsletter.&lt;/p&gt;

&lt;p&gt;Would love to hear how you approached learning frontend 👇&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryan-dev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out my website :- &lt;a href="https://aryanshourie.dev" rel="noopener noreferrer"&gt;aryanshourie.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>frontend</category>
      <category>react</category>
    </item>
    <item>
      <title>Securely storing passwords in a database</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Sun, 02 Nov 2025 09:22:24 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/securely-storing-passwords-in-a-database-25nd</link>
      <guid>https://dev.to/aryan_shourie/securely-storing-passwords-in-a-database-25nd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Passwords are the &lt;strong&gt;digital keys&lt;/strong&gt; 🔑 that protect user accounts and sensitive information. Unfortunately, many security breaches happen not because the hackers are genuises, but because the &lt;strong&gt;developers stored the passwords incorrectly&lt;/strong&gt; in the database.&lt;/p&gt;

&lt;p&gt;If an attacker ever gains access to your database, you want them to find useless gibberish, not the real passwords. Secure password storage ensures that even in a breach, the &lt;strong&gt;attacker gets nothing valuable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will discuss the several techniques which can be used for storing passwords in a database.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Storing passwords as plain text (🚫 The Worst Way)
&lt;/h2&gt;

&lt;p&gt;Storing passwords as plain text means &lt;strong&gt;saving them exactly as the users type them&lt;/strong&gt;. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username | password
--------- | --------
ravi      | 123456
neha      | 123456

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

&lt;/div&gt;



&lt;p&gt;This is a complete disaster! 😱&lt;br&gt;
Anyone with access - hackers, admins and scripts can easily see every password. If the database leaks, &lt;strong&gt;all the user accounts are instantly compromised&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why this approach is bad ⚠:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Total loss of privacy. 🔒&lt;/li&gt;
&lt;li&gt;Irreversible trust loss and legal risk.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 &lt;strong&gt;Never ever store passwords in plain text.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Simple Hashing (MD5, SHA-1 etc.)
&lt;/h2&gt;

&lt;p&gt;A small improvement is to &lt;strong&gt;hash passwords&lt;/strong&gt; using &lt;strong&gt;one way functions&lt;/strong&gt; like &lt;strong&gt;MD5&lt;/strong&gt; or &lt;strong&gt;SHA-1&lt;/strong&gt;. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Password: "123456"
MD5 Hash: e10adc3949ba59abbe56e057f20f883e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks secure, but it is not. These algorithms are &lt;strong&gt;fast&lt;/strong&gt; and &lt;strong&gt;predictable&lt;/strong&gt;. The hackers can use &lt;strong&gt;Rainbow Tables&lt;/strong&gt; or &lt;strong&gt;brute-force attacks&lt;/strong&gt; to reverse them in seconds.&lt;/p&gt;

&lt;p&gt;Why this approach is bad ⚠:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MD5 and SHA-1 are &lt;strong&gt;too fast&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;precomputed hash tables&lt;/strong&gt; make reversing easy.&lt;/li&gt;
&lt;li&gt;Identical passwords always produce identical hashes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ravi password = "123456" → MD5 = e10adc3949ba59abbe56e057f20f883e  
Neha password = "123456" → MD5 = e10adc3949ba59abbe56e057f20f883e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attackers instantly know Ravi and Neha share the same password.&lt;br&gt;
➡️ &lt;strong&gt;Simple hashing is not enough&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8lmxtpmq9m1h6qa4ix5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8lmxtpmq9m1h6qa4ix5.png" alt="Hacker Alert" width="728" height="380"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Slow Hashing (The Right Kind of Hashing ✅)
&lt;/h2&gt;

&lt;p&gt;Modern systems use &lt;strong&gt;slow, adaptive hashing algorithms&lt;/strong&gt; like &lt;strong&gt;bcrypt&lt;/strong&gt;, &lt;strong&gt;scrypt&lt;/strong&gt; or &lt;strong&gt;Argon2&lt;/strong&gt;. These are specifically designed for passwords and take more time to compute ⌛ —making brute-force attacks painfully slow.&lt;/p&gt;

&lt;p&gt;Why slow hashing wins:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adjustable cost factor.&lt;/li&gt;
&lt;li&gt;Built-in salting support.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bcrypt("123456") → $2b$12$Z4qZKZk...  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if attackers know the algorithm, calculating millions of such hashes takes years, not seconds. 💪&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Salting
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;salt&lt;/strong&gt; 🧂 is a &lt;strong&gt;random string added to each password&lt;/strong&gt; before hashing. It ensures that even if 2 users have the same password, their &lt;strong&gt;hashes are totally different&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ravi password = "123456"
Ravi salt     = "pqr_salt"
Stored hash   = H("123456pqr_salt")

Neha password = "123456"
Neha salt     = "xyz_salt"
Stored hash   = H("123456xyz_salt")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✨ &lt;strong&gt;Result: Different hashes, even for the same password.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why salting is essential:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Protects against Rainbow Table attacks.&lt;/li&gt;
&lt;li&gt;Adds uniqueness per user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The salt is usually &lt;strong&gt;stored alongside the hash in the database&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  5. Peppering
&lt;/h2&gt;

&lt;p&gt;Peppering 🌶 is like salting, but with a secret twist.&lt;br&gt;
A pepper is a &lt;strong&gt;secret key added to the password before hashing&lt;/strong&gt;. Unlike salts, &lt;strong&gt;peppers are kept secret&lt;/strong&gt; and &lt;strong&gt;not stored in the database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are 2 ways to use pepper:&lt;/p&gt;

&lt;p&gt;i) &lt;strong&gt;Global Pepper&lt;/strong&gt;: This means that the &lt;strong&gt;same secret will be used for all the passwords&lt;/strong&gt;. It is stored in the &lt;strong&gt;environment variables&lt;/strong&gt; or any secure config. It is easier to manage and configure. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;password + salt + PEPPER_SECRET
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ii) &lt;strong&gt;Per-user Pepper&lt;/strong&gt;: This means that a &lt;strong&gt;unique pepper will be used for each user&lt;/strong&gt;. It offers stronger protection, but it is more complex to manage.&lt;/p&gt;

&lt;p&gt;Why peppering helps:&lt;br&gt;
Even if hackers steal the entire database (hash + salt), they still &lt;strong&gt;can’t verify passwords without the hidden pepper&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Storing passwords securely isn't optional—it’s your &lt;strong&gt;duty&lt;/strong&gt; as a developer.&lt;br&gt;
Bad practices like &lt;strong&gt;plain text&lt;/strong&gt; or &lt;strong&gt;MD5&lt;/strong&gt; are ticking time bombs 💣 waiting to explode in a &lt;strong&gt;data breach&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The gold-standard approach includes:&lt;br&gt;
✅ &lt;strong&gt;Slow hashing&lt;/strong&gt; (bcrypt, Argon2)&lt;br&gt;
✅ &lt;strong&gt;Unique salting&lt;/strong&gt; for each password&lt;br&gt;
✅&lt;strong&gt;Secret peppering&lt;/strong&gt; for extra protection&lt;/p&gt;

&lt;p&gt;Remember: you’re not just storing passwords—you’re storing user trust 🤝.&lt;/p&gt;

&lt;p&gt;And that's it! This was just a quick overview about how passwords can securely be stored in a database.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>database</category>
      <category>security</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Git Hooks: Automating Workflows in Git</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Sat, 23 Aug 2025 09:44:54 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/git-hooks-automating-workflows-in-git-3bpo</link>
      <guid>https://dev.to/aryan_shourie/git-hooks-automating-workflows-in-git-3bpo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction to Git Hooks
&lt;/h2&gt;

&lt;p&gt;Git is more than just a version control system. It also provides automation to improve developer productivity. One of these features is &lt;strong&gt;Git Hooks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Git Hooks are &lt;strong&gt;scripts&lt;/strong&gt; that Git automatically executes before or after specific events, such as &lt;strong&gt;commiting code&lt;/strong&gt;, &lt;strong&gt;pushing&lt;/strong&gt; to a remote repository or &lt;strong&gt;merging branches&lt;/strong&gt;. They allow developers to automate tasks seamlessly within the Git workflow.&lt;/p&gt;

&lt;p&gt;In simpler words, Git Hooks act like "&lt;strong&gt;triggered scripts&lt;/strong&gt;" that run at different stages of Git's lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The need for Git Hooks
&lt;/h2&gt;

&lt;p&gt;Without Git Hooks, maintaining consistent standards across a team can be difficult. For example, the following issues may arise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Developers may forget to run linting or tests before committing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sensitive files like API keys or credentials might accidentally get pushed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit messages may lack standard formatting, making history harder to read.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git Hooks solve these problems by &lt;strong&gt;automating checks&lt;/strong&gt; and &lt;strong&gt;enforcing rules&lt;/strong&gt;. Instead of relying on developers to remember every step, Git Hooks ensure quality and consistency by &lt;strong&gt;running predefined scripts automatically&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Git Hooks available
&lt;/h2&gt;

&lt;p&gt;Git provides a variety of Hooks that can be used in different stages of the workflow. These are categorized into two types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client-Side Hooks&lt;/strong&gt;: Triggered by operations like &lt;strong&gt;committing&lt;/strong&gt;, &lt;strong&gt;merging&lt;/strong&gt;, or &lt;strong&gt;rebasing&lt;/strong&gt;. Example: &lt;strong&gt;pre-commit&lt;/strong&gt;, &lt;strong&gt;prepare-commit-msg&lt;/strong&gt;, &lt;strong&gt;commit-msg&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server-Side Hooks&lt;/strong&gt;: Triggered on the server side when pushes are received. Example: &lt;strong&gt;pre-receive&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt;, &lt;strong&gt;post-receive&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to find Git Hooks
&lt;/h2&gt;

&lt;p&gt;When you initialize a Git repository, Hooks are available as sample scripts inside the &lt;strong&gt;.git/hooks/&lt;/strong&gt; directory. You can verify by using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls .git/hooks/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see files like &lt;strong&gt;pre-commit.sample&lt;/strong&gt;, &lt;strong&gt;pre-push.sample&lt;/strong&gt; etc. These sample files are &lt;strong&gt;not active by default&lt;/strong&gt;, you can make them active by removing the &lt;strong&gt;.sample&lt;/strong&gt; extension from the filename.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Usage of a Git Hook: Pre-Commit with Linter
&lt;/h2&gt;

&lt;p&gt;Let's go through a step-by-step guide of setting up a &lt;strong&gt;pre-commit Hook&lt;/strong&gt; to &lt;strong&gt;block commits if linting errors exist&lt;/strong&gt; in the staged files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Navigate to the Hooks directory&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd .git/hooks/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Create/Edit the Pre-Commit Hook&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Add the Hook script&lt;/strong&gt;&lt;br&gt;
Here is an example script to check for ESLint issues before allowing a commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh

echo "Running lint checks..."

# Run ESLint on staged JavaScript files
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.js$')

if [ "$STAGED_FILES" = "" ]; then
  exit 0
fi

# Run eslint
npx eslint $STAGED_FILES
if [ $? -ne 0 ]; then
  echo "❌ Lint errors found. Commit aborted."
  exit 1
fi

echo "✅ Lint checks passed!"
exit 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Make it executable&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x .git/hooks/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Test the Hook&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Modify a &lt;strong&gt;.js&lt;/strong&gt; file with linting issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try committing:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add file.js
git commit -m "Test commit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If issues are found, the &lt;strong&gt;commit will be blocked&lt;/strong&gt; until you fix them.
This ensures that no developer can commit code with linting errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advantages of Git Hooks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Automates repetitive tasks like running tests, linting, or formatting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: Enforces code quality and project standards across the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: Prevents accidental commits of sensitive files or bad code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: Saves time by catching issues early, before code is pushed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Hooks can be customized for different workflows and tools.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Git Hooks in place, teams can maintain &lt;strong&gt;higher code quality&lt;/strong&gt;, &lt;strong&gt;enforce rules&lt;/strong&gt; effortlessly, and &lt;strong&gt;automate mundane checks&lt;/strong&gt;—all directly within Git’s workflow.&lt;/p&gt;

&lt;p&gt;And that's it! This was just a quick overview about using Git Hooks in your daily workflow.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>git</category>
      <category>programming</category>
      <category>automation</category>
    </item>
    <item>
      <title>Secure Tunneling Explained: Ngrok vs Cloudflared</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Sat, 02 Aug 2025 11:21:35 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/secure-tunneling-explained-ngrok-vs-cloudflared-mcl</link>
      <guid>https://dev.to/aryan_shourie/secure-tunneling-explained-ngrok-vs-cloudflared-mcl</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;In development, testing, or remote collaboration, developers often need to &lt;strong&gt;expose a locally hosted web service to the Internet&lt;/strong&gt;. Whether it is a Webhook testing endpoint, a locally running admin dashboard, or a demo site for a client, making a local server publicly accessible is not straightforward. Following the traditional approaches requires &lt;strong&gt;configuring firewalls&lt;/strong&gt;, &lt;strong&gt;setting up ports&lt;/strong&gt; and &lt;strong&gt;deploying to different servers&lt;/strong&gt;. All of these things can be complex, insecure and time consuming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tunneling
&lt;/h2&gt;

&lt;p&gt;For the above problem statement, the solution is &lt;strong&gt;Tunneling&lt;/strong&gt;. It refers to &lt;strong&gt;creating a secure pathway between two endpoints&lt;/strong&gt; - in this context, between a public URL and a local server by encapsulating the network traffic. This process allows a remote client to access a local service &lt;strong&gt;as if it were hosted on a public server&lt;/strong&gt;, all while &lt;strong&gt;bypassing NAT, firewalls and complex DNS setups&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Following are the advantages of Tunneling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It enables you to test integrations locally.&lt;/li&gt;
&lt;li&gt;It helps in client demos without deploying code.&lt;/li&gt;
&lt;li&gt;It facilitates remote development and debugging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this article, we will discuss the two widely used tools for Tunneling: &lt;strong&gt;Ngrok and Cloudflared Tunnel&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ngrok
&lt;/h2&gt;

&lt;p&gt;Ngrok is a popular tunneling tool that &lt;strong&gt;provides public URLs to your locally running applications&lt;/strong&gt;, commonly used for &lt;strong&gt;testing webhooks&lt;/strong&gt; and &lt;strong&gt;showcasing work in-progress&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example usage of Ngrok&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 1&lt;/strong&gt;: Install Ngrok&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# macOS
brew install ngrok

# or download from https://ngrok.com/download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Start a local server&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m http.server 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Expose the server via Ngrok&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Forwarding                    https://abcd1234.ngrok.io -&amp;gt; http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now access your local server from anywhere using &lt;strong&gt;&lt;a href="https://abcd1234.ngrok.io" rel="noopener noreferrer"&gt;https://abcd1234.ngrok.io&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages of using Ngrok:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Very easy to setup and use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supports both HTTP and TCP tunnels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provides a real-time web UI for inspecting traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Secure and encrypted connections.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages of using Ngrok:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The free version has usage limits. (example: 1 tunnel, random subdomains)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requires signup and token for full functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not open-source.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cloudflared Tunnel
&lt;/h2&gt;

&lt;p&gt;It is a service by Cloudflare that &lt;strong&gt;exposes your local server securely through the Cloudflare network&lt;/strong&gt;, eliminating the need to open firewall ports or configure DNS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example usage of Cloudflared Tunnel&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Install Cloudflared&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# macOS
brew install cloudflared

# or download from https://developers.cloudflare.com/cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Authenticate with Cloudflare&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens a browser and asks you to select the domain you want to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Create and run a tunnel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel --url http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://random-string.trycloudflare.com -&amp;gt; http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now access your local server from anywhere using &lt;strong&gt;&lt;a href="https://random-string.trycloudflare.com" rel="noopener noreferrer"&gt;https://random-string.trycloudflare.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages of using Cloudflared Tunnel:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Free and unlimited usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrates directly with Cloudflare for DNS and security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uses your own domain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High reliability via Cloudflare's network.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages of using Cloudflare Tunnel:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Required Cloudflare-managed domain for advanced usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup for persistent tunnels is more involved than Ngrok.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Tunneling tools like Ngrok and Cloudflared Tunnel have become essential in modern development workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use Ngrok for its &lt;strong&gt;simplicity and powerful dev tooling features&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Cloudflared Tunnel for more &lt;strong&gt;permanent, secure and production-grade tunnels&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are effective - choose based on your specific needs: simplicity or scalability.&lt;/p&gt;

&lt;p&gt;And that's it! This was just a quick overview about the secure tunneling tools like Ngrok and Cloudflared Tunnel.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ngrok</category>
      <category>cloudflared</category>
      <category>development</category>
    </item>
    <item>
      <title>Understanding JavaScript naming best practices</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Fri, 25 Jul 2025 15:16:18 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/understanding-javascript-naming-best-practices-29i3</link>
      <guid>https://dev.to/aryan_shourie/understanding-javascript-naming-best-practices-29i3</guid>
      <description>&lt;p&gt;JavaScript is one of the most popular programming languages out there. This is because it is the &lt;strong&gt;native language of the web&lt;/strong&gt;. Every browser (Chrome, Safari, Firefox, Edge etc.) has a built-in JavaScript engine. JavaScript has support for different libraries and frameworks like &lt;strong&gt;React, Vue, Angular, jQuery&lt;/strong&gt; etc. It also has a massive ecosystem via &lt;strong&gt;NPM (Node Package Manager)&lt;/strong&gt; — the largest package registry in the world.&lt;/p&gt;

&lt;p&gt;Due to the high popularity of JavaScript, its natural that it is the primary tech stack of the majority of software applications available in the market. Thus, it is essential for developers using JavaScript to create and maintain applications to follow &lt;strong&gt;best practices and coding guidelines&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;One of the essential guidelines which is often overlooked is the &lt;strong&gt;JavaScript naming conventions&lt;/strong&gt;. Following are the reasons why following JavaScript naming best practices is essential:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Improves code readability&lt;/strong&gt;: Clear, descriptive names make it easier to understand what a variable, function, or class does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enables team collaboration&lt;/strong&gt;: Consistent naming helps teams work together more efficiently. Everyone knows what to expect when reading or reviewing code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Makes maintenance easier&lt;/strong&gt;: The code written months or years ago becomes easier to revisit and modify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduces bugs&lt;/strong&gt;: Ambiguous or inconsistent names can lead to incorrect assumptions and logic errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improves tooling support&lt;/strong&gt;: Many linters, static analyzers, IDEs and AI tools can better assist when naming is consistent.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Core principles of JavaScript naming
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Consistency is key&lt;/strong&gt;&lt;br&gt;
Consistency is the cornerstone of effective naming in JavaScript. Whether you prefer using &lt;strong&gt;camelCase&lt;/strong&gt; or &lt;strong&gt;snake_case&lt;/strong&gt;, the key is to stick with one style throughout the codebase. Here's why it matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reduces cognitive load for developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eases maintenance and refactoring.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Language matters&lt;/strong&gt;&lt;br&gt;
Although JavaScript supports variable names in any language, it is best to stick with &lt;strong&gt;English&lt;/strong&gt;. Doing so offers many advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensures universal code readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Facilitates collaboration across global teams.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The case for different cases&lt;/strong&gt;&lt;br&gt;
JavaScript follows different naming conventions based on context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;camelCase&lt;/strong&gt; for variables, functions and methods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PascalCase&lt;/strong&gt; for classes and constructor functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UPPER_SNAKE_CASE&lt;/strong&gt; for constants.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;kebab-case&lt;/strong&gt; for CSS classes and HTML attributes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Practical naming guidelines
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Variables and Functions&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Boolean variables&lt;/strong&gt;: The name of a boolean variable should start with an &lt;strong&gt;affirmative prefix&lt;/strong&gt;, typically 'is' or 'has'. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
const visible = false;

Good ✅
const isVisible = false;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Functions and Methods&lt;/strong&gt;: Function names should be verbs that clearly describe their action. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
function data(user) {
  // ...
}

Good ✅
function getUserData(user) {
  // ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Arrays and other Collections&lt;/strong&gt;&lt;br&gt;
Always use &lt;strong&gt;plural nouns&lt;/strong&gt; for arrays and other collections. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
const bookItemList = ['1984', 'Brave New World', 'Fahrenheit 451'];
const userDataObj = new Map();
const selectedIdSet = new Set();

Good ✅
const books = ['1984', 'Brave New World', 'Fahrenheit 451'];
const userDataMap = new Map();
const selectedIds = new Set();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Classes and Objects&lt;/strong&gt;&lt;br&gt;
Classes should use &lt;strong&gt;PascalCase&lt;/strong&gt; and be &lt;strong&gt;noun phrases&lt;/strong&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
class stringutils {
  static capitalize() {}
}

Good ✅
class StringUtils {
  static capitalize() {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Constants&lt;/strong&gt;&lt;br&gt;
Always use &lt;strong&gt;UPPER_SNAKE_CASE&lt;/strong&gt; for constants. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
const retryAttemps = 3;
const apiUrl = 'https://api.example.com';

Good ✅
const RETRY_ATTEMPTS = 3;
const API_URL = 'https://api.example.com';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Including types in names&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
const userArray = ['John', 'Jane'];
const nameString = 'John';

Good ✅
const users = ['John', 'Jane'];
const name = 'John';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ambiguous Abbreviations&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad ❌
const usr = getUser();
const pwd = 'secret';

Good ✅
const user = getUser();
const password = 'secret';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tools for maintaining naming conventions
&lt;/h2&gt;

&lt;p&gt;To maintain consistent naming conventions in a JavaScript codebase, a variety of tools can be used. Here are the most widely used tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt;: it is used for linting, checking code quality issues and naming violations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier&lt;/strong&gt;: it is used for code formatting, enforcing consistent style and ensuring spacing, quotes, semicolons etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Some community recommended coding guidelines
&lt;/h2&gt;

&lt;p&gt;Below are some &lt;strong&gt;community-recommended&lt;/strong&gt; naming convention guidelines and documentation resources you can follow for JavaScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google JavaScript style guide: &lt;a href="https://google.github.io/styleguide/jsguide.html" rel="noopener noreferrer"&gt;https://google.github.io/styleguide/jsguide.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Airbnb JavaScript style guide:
&lt;a href="https://github.com/airbnb/javascript" rel="noopener noreferrer"&gt;https://github.com/airbnb/javascript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MDN Web Docs (Mozilla Developer Network):
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that's it! This was just a quick overview about the basic JavaScript naming best practices.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>development</category>
    </item>
    <item>
      <title>The SCP Command and how to use it💻</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Fri, 11 Jul 2025 20:22:05 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/the-scp-command-and-how-to-use-it-3b9m</link>
      <guid>https://dev.to/aryan_shourie/the-scp-command-and-how-to-use-it-3b9m</guid>
      <description>&lt;p&gt;Recently at work, I had a task of developing and deploying an internal tool/application which basically lets us test certain playback stream URLs (&lt;strong&gt;DASH, HLS&lt;/strong&gt; etc.) on Smart TVs using &lt;strong&gt;ShakaPlayer with Widevine DRM encryption&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So this application was deployed on one of our &lt;strong&gt;internal remote servers&lt;/strong&gt;. There are a couple of other applications as well which are deployed on that remote server, but they had a simpler &lt;strong&gt;single-click deployment&lt;/strong&gt; (pretty convenient 🙂).&lt;/p&gt;

&lt;p&gt;As for this particular application, we had to &lt;strong&gt;deploy it manually&lt;/strong&gt; by &lt;strong&gt;transferring the files from our local machine to the remote server&lt;/strong&gt; (actually better because I got to learn something new 🤓).&lt;/p&gt;

&lt;p&gt;The reason I shared the above story with you is that due to the above task, I got introduced to the &lt;strong&gt;SCP command in the Windows Command Line&lt;/strong&gt;. Now I know that it may be a basic command for most of the experienced developers out there, but for me it was a new learning and I thought it would be nice sharing about it here and elaborating about how it is used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;SCP stands for &lt;strong&gt;Secure Copy Protocol&lt;/strong&gt;. As the name pretty much suggests it is a command which is used to &lt;strong&gt;transfer directories/folders and files&lt;/strong&gt; between 2 systems/locations using the &lt;strong&gt;SSH protocol&lt;/strong&gt;. Now you may think that we already have the &lt;strong&gt;cp (copy)&lt;/strong&gt; command for copying contents between locations 🤔, then what does SCP bring to the table ? The main advantage of SCP is that it ensures the &lt;strong&gt;data is encrypted&lt;/strong&gt; 🔗⛓️ during the transfer.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Different use cases of SCP command
&lt;/h2&gt;

&lt;p&gt;There are multiple use cases of the SCP command, these include :-&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy/Transfer files from your &lt;strong&gt;local machine to a remote server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy/Transfer files from a &lt;strong&gt;remote server to your local machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy/Transfer files &lt;strong&gt;between 2 remote servers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Basic syntax of using the SCP command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp [options] source-location destination-location
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt; =&amp;gt; You want to copy a file 'myFile.txt' &lt;strong&gt;present on your local machine to a remote server&lt;/strong&gt;, you can execute the command like this :-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp myFile.txt username@remote_server_host:/path/to/destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will copy myFile.txt to the specified destination in the remote server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2&lt;/strong&gt; =&amp;gt; You want copy a file 'myFile.txt' &lt;strong&gt;present on your remote server to your local machine&lt;/strong&gt;, you can execute the command like this :-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp username@remote_server_host:/path/to/myFile.txt /local_machine/destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will copy myFile.txt to the specified destination on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 3&lt;/strong&gt; =&amp;gt; You want to copy a file 'myFile.txt' present on one remote server to another remote server, you can execute the command like this :-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp username@remote_server_host1:/path/to/myFile.txt username@remote_server_host2:/path/to/destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will copy myFile.txt from remote_server_host1 to the specified destination in remote_server_host2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different options which can be used with the SCP command
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;-r&lt;/strong&gt; =&amp;gt; used to recursively copy entire folders/directories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-v&lt;/strong&gt; =&amp;gt; used to switch to verbose mode i.e. while copying it will show the progress and debug information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-C&lt;/strong&gt; =&amp;gt; used to compress the data during copy/transfer&lt;/li&gt;
&lt;li&gt;-q =&amp;gt; used to switch to quite mode i.e. while copying it will not show any progress or error messages.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  Important points to consider regarding SCP command
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;SCP primarily operates over &lt;strong&gt;SSH&lt;/strong&gt;, so you will need to have &lt;strong&gt;SSH access to the target remote server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Before using the SCP command, ensure that the remote server has &lt;strong&gt;SSH enabled&lt;/strong&gt; and you also have &lt;strong&gt;appropriate permissions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that's it! This was just a quick overview about the basics of the SCP command, how and when to use it and more.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>linux</category>
      <category>cli</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Useful JavaScript tips and tricks that you may not be aware of 💻👨‍💻</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Sat, 21 Dec 2024 08:48:02 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/useful-javascript-tips-and-tricks-that-you-may-not-be-aware-of-32af</link>
      <guid>https://dev.to/aryan_shourie/useful-javascript-tips-and-tricks-that-you-may-not-be-aware-of-32af</guid>
      <description>&lt;p&gt;JavaScript is a widely used &lt;strong&gt;web programming language&lt;/strong&gt;. If you are looking to start a career in Software Engineering, then chances are that you will encounter the concepts of JavaScript. &lt;/p&gt;

&lt;p&gt;JavaScript is unarguably the most popular programming language in the realm of web development. While it has its own &lt;strong&gt;caveats and tricky/confusing concepts&lt;/strong&gt;, learning and using JavaScript is almost necessary if you want to progress in your web development career.&lt;/p&gt;

&lt;p&gt;In this blog post, I will list down some useful JavaScript &lt;strong&gt;tips and tricks&lt;/strong&gt; to help you out in challenging situations while using this language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic Semicolon Injection (ASI) in JavaScript
&lt;/h2&gt;

&lt;p&gt;Some languages like &lt;strong&gt;C#, C++ and Java&lt;/strong&gt; are very &lt;strong&gt;strict about ending each line with a semicolon&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;JavaScript also uses semicolons to &lt;strong&gt;indicate the end of a line&lt;/strong&gt;, but using the semicolon in JavaScript is actually &lt;strong&gt;optional&lt;/strong&gt;. By optional, it means that JavaScript will apply a set of &lt;strong&gt;complex rules to work out whether a semicolon should have gone there or not&lt;/strong&gt;. This is known as &lt;strong&gt;Automatic Semicolon Injection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function returnSomething()
{
  return
    {
      name: 'JavaScript Expert'
      contactMethod: 'Shine batsign at sky'
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now upon first glance, you might think that logging this function call will show this particular object. But, if we call this function, we actually get &lt;strong&gt;undefined&lt;/strong&gt; as the output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;: Because the &lt;strong&gt;opening bracket doesn’t occur on the same line as the&amp;nbsp;return&lt;/strong&gt;, ASI puts &lt;strong&gt;one semicolon in there&lt;/strong&gt; for us. So, as far as JavaScript is concerned, our code actually looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function returnSomething()
{
  return ; // &amp;lt;-- semicolon inserted by ASI, remainder of function not evaluated.
    {
      name: 'JavaScript Expert'
      contactMethod: 'Shine batsign at sky'
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the process of ASI. To avoid such scenarios, we should carefully look the placement of braces and other syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-sequential Array keys and indexes
&lt;/h2&gt;

&lt;p&gt;Let’s imagine we have a simple array, we know we can &lt;strong&gt;pop, push, append&lt;/strong&gt;, and do whatever we like with arrays. But we also know that JavaScript, like other languages, lets us &lt;strong&gt;access array elements by index&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, what’s unusual about JavaScript is that you can also&amp;nbsp;&lt;strong&gt;set&lt;/strong&gt;&amp;nbsp;elements by array index when the &lt;strong&gt;array isn’t even up to that index just yet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var arr = [];
arr[0] = 1;
arr[1] = 2;
arr[100] = 100;
console.log(arr);
console.log('The length of the array is ' + arr.length);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 1, 2, &amp;lt;98 empty items&amp;gt;, 100 ]
The length of the array is 101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Finding the OS type using JavaScript
&lt;/h2&gt;

&lt;p&gt;The&amp;nbsp;&lt;strong&gt;window.navigator&lt;/strong&gt;&amp;nbsp;object contains &lt;strong&gt;information about the visitor's browser OS details&lt;/strong&gt;. Some of the OS properties are available under the &lt;strong&gt;platform property&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use the below snippet to get the OS type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(navigator.platform);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Win32 (for Windows)
MacIntel (for modern macOS)
Linux x86_64 (64-bit Linux systems)
WebOS (for LG Smart TVs)
Linux (for Samsung Smart TVs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to detect whether a mobile browser is being used for browsing
&lt;/h2&gt;

&lt;p&gt;You can &lt;strong&gt;detect mobile browsers&lt;/strong&gt; by simply running through a list of devices and checking if the&amp;nbsp;&lt;strong&gt;userAgent&lt;/strong&gt;&amp;nbsp;matches anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function detectMobileBrowser() {
  if (
    navigator.userAgent.match(/Android/i) ||
    navigator.userAgent.match(/webOS/i) ||
    navigator.userAgent.match(/iPhone/i) ||
    navigator.userAgent.match(/iPad/i) ||
    navigator.userAgent.match(/iPod/i) ||
    navigator.userAgent.match(/BlackBerry/i) ||
    navigator.userAgent.match(/Windows Phone/i)
  ) {
    return true;
  } else {
    return false;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Apply CSS styles and colors on JS console messages
&lt;/h2&gt;

&lt;p&gt;You can apply CSS styles and colors on the console messages using certain syntax. This can be very useful in differentiating certain messages from others.&lt;/p&gt;

&lt;p&gt;Code example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(
        "%cStop!",
        "color:red;font-family:system-ui;font-size:4rem;-webkit-text-stroke: 1px black;font-weight:bold"
      );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F710czxuixq2tfpr6f8u4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F710czxuixq2tfpr6f8u4.PNG" alt="Console CSS Output" width="471" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it! These are just a few of lesser known JavaScript tips and tricks which might come in handy for you in the future.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View my Personal Portfolio :- &lt;a href="https://aryan-s-portfolio.vercel.app/" rel="noopener noreferrer"&gt;Aryan's Portfolio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The JavaScript History API</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Fri, 20 Dec 2024 15:08:47 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/the-javascript-history-api-2e0d</link>
      <guid>https://dev.to/aryan_shourie/the-javascript-history-api-2e0d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;JavaScript History API&lt;/strong&gt; is a part of the &lt;strong&gt;Web API&lt;/strong&gt; that allows us to interact with the &lt;strong&gt;browser's session history&lt;/strong&gt;. It provides methods and properties to &lt;strong&gt;navigate, manipulate and control the history stack&lt;/strong&gt;, enabling developers to create more dynamic and interactive user experiences without requiring full page reloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key features of the JavaScript History API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;history.back()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;history.forward()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;history.go(n)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;history.pushState()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;history.replaceState()&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The history.back() method
&lt;/h2&gt;

&lt;p&gt;This method moves the browser to the &lt;strong&gt;previous page in the session history&lt;/strong&gt;, equivalent to the browser's back button. This will only work if a previous page exists in the browser's history stack.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h1&amp;gt;The Window History Object&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;The history.back() Method&amp;lt;/h2&amp;gt;

&amp;lt;button onclick="history.back()"&amp;gt;Go Back&amp;lt;/button&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2w8zpms76z51cnmawk7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2w8zpms76z51cnmawk7.PNG" alt="First Output" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the "Go Back" button will take the user to the previous page if it exists in the history stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The history.forward() method
&lt;/h2&gt;

&lt;p&gt;This method moves the browser to the &lt;strong&gt;next page in the session history&lt;/strong&gt;, equivalent to the browser's forward button. This will only work if a next page exists in the browser's history stack.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h1&amp;gt;The Window History Object&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;The history.forward Method&amp;lt;/h2&amp;gt;

&amp;lt;button onclick="history.forward()"&amp;gt;Go Forward&amp;lt;/button&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5enjn3enexght38lyna2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5enjn3enexght38lyna2.PNG" alt="Second Output" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the "Go Forward" button will take the user to the next page if it exists in the history stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The history.go() method
&lt;/h2&gt;

&lt;p&gt;This method is used to &lt;strong&gt;navigate to a specific point in the browser stack&lt;/strong&gt;. It takes an &lt;strong&gt;argument 'n'&lt;/strong&gt;, which specifies the number of the page we want to navigate to through the history stack.&lt;/p&gt;

&lt;p&gt;The argument 'n' can accept the following values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Positive 'n'&lt;/strong&gt; takes user &lt;strong&gt;forward&lt;/strong&gt; in the stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative 'n'&lt;/strong&gt; takes user &lt;strong&gt;backward&lt;/strong&gt; in the stack.&lt;/li&gt;
&lt;li&gt;If 'n' has value &lt;strong&gt;0&lt;/strong&gt;, it &lt;strong&gt;reloads&lt;/strong&gt; the current page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The history.pushState() method
&lt;/h2&gt;

&lt;p&gt;This method is used to &lt;strong&gt;add a new entry in the current session's history stack&lt;/strong&gt; i.e. the collection of all the pages visited in the current browser tab.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
We will create a &lt;strong&gt;button element&lt;/strong&gt; and assign it a &lt;strong&gt;click handler&lt;/strong&gt;. Inside the handler, we call the &lt;strong&gt;pushState()&lt;/strong&gt; method. This &lt;strong&gt;adds a new entry with a different URL&lt;/strong&gt; than the one of the current page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// HTML -&amp;gt;
&amp;lt;button&amp;gt;Call pushState()&amp;lt;/button&amp;gt;

// JavaScript -&amp;gt;
var button = document.querySelector('button');
button.onClick = function() {
    history.pushState(null, ' ', 'some-page');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

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

&lt;p&gt;Currently, the URL is - &lt;strong&gt;&lt;a href="https://www.codeguage.com/courses/js/examples/pushstate" rel="noopener noreferrer"&gt;https://www.codeguage.com/courses/js/examples/pushstate&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you will click on the button, the URL will change to - &lt;strong&gt;&lt;a href="https://www.codeguage.com/courses/js/examples/some-page" rel="noopener noreferrer"&gt;https://www.codeguage.com/courses/js/examples/some-page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;This confirms that a &lt;strong&gt;new entry has been added to the current session's history&lt;/strong&gt;, also &lt;strong&gt;changing the URL in the browser's address bar&lt;/strong&gt;. You can also see that the browser's &lt;strong&gt;back-arrow is also active now in the top-left corner&lt;/strong&gt;, clicking on which will take you back to - &lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.codeguage.com/courses/js/examples/pushstate" rel="noopener noreferrer"&gt;https://www.codeguage.com/courses/js/examples/pushstate&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One extremely important thing to know is that&amp;nbsp;&lt;strong&gt;pushState()&amp;nbsp;changes the URL without ever checking whether it even actually exists or not&lt;/strong&gt;. This is because the purpose of&amp;nbsp;pushState()&amp;nbsp;is&amp;nbsp;not to load a webpage, but rather to &lt;strong&gt;just&amp;nbsp;add a new entry to the history&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The history.replaceState() method
&lt;/h2&gt;

&lt;p&gt;This method &lt;strong&gt;replaces the current entry in the current session's history stack with a new entry&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
As before, we have a &lt;strong&gt;button with a click handler&lt;/strong&gt; set. But this time, inside the handler, we call&amp;nbsp;&lt;strong&gt;replaceState()&lt;/strong&gt;&amp;nbsp;to replace current history entry with a new one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// HTML =&amp;gt;
&amp;lt;button&amp;gt;Call replaceState()&amp;lt;/button&amp;gt;

// JavaScript =&amp;gt;
var button = document.querySelector('button');

button.onclick = function() {
   history.replaceState(null, '', 'some-page');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

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

&lt;p&gt;The current URL is - &lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.codeguage.com/courses/js/examples/replacestate" rel="noopener noreferrer"&gt;https://www.codeguage.com/courses/js/examples/replacestate&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you click the button, the URL will change to - &lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.codeguage.com/courses/js/examples/some-page" rel="noopener noreferrer"&gt;https://www.codeguage.com/courses/js/examples/some-page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;The &lt;strong&gt;browser URL has been replaced&lt;/strong&gt;, and you can notice that the &lt;strong&gt;back-arrow key on the top left corner is NOT active&lt;/strong&gt;, confirming that a &lt;strong&gt;new entry has NOT been added to the history stack&lt;/strong&gt;, we have just &lt;strong&gt;replaced the current entry with a new one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's it! You have successfully learnt about the JavaScript History API, and how to use and incorporate its different utilities in your applications.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View my Personal Portfolio :- &lt;a href="https://aryan-s-portfolio.vercel.app/" rel="noopener noreferrer"&gt;Aryan's Portfolio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introduction to HTML Web Components 💻📝</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Sun, 18 Feb 2024 15:26:07 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/introduction-to-html-web-components-3ijm</link>
      <guid>https://dev.to/aryan_shourie/introduction-to-html-web-components-3ijm</guid>
      <description>&lt;p&gt;The HTML Web Components are &lt;strong&gt;reusable, custom HTML elements&lt;/strong&gt; which you can define and create yourselves, and can be used anywhere within your HTML code. &lt;/p&gt;

&lt;p&gt;As web developers, we know that creating a template and reusing that wherever possible is a good programming approach. This problem was solved by JavaScript UI libraries like &lt;strong&gt;&lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/strong&gt;. But, in some use cases, adopting to React or other JavaScript libraries is not the requirement, and using plain HTML can accomplish this task now as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxq1ivw1asaq4r51hloy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxq1ivw1asaq4r51hloy.jpg" alt="HTML logo" width="736" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 2024, the Browser support for Web Components is very enhanced. In this article, I will describe the basics of Web Components and demonstrate creating a basic Web Component as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Web Component?
&lt;/h2&gt;

&lt;p&gt;A Web Component is a custom HTML element that you can define with your &lt;strong&gt;own tag name&lt;/strong&gt;. It is a reusable piece of code, which can be created and incorporated easily within your HTML application.&lt;br&gt;
It is basically a set of &lt;strong&gt;JavaScript APIs&lt;/strong&gt; that allow you to define custom elements and behavior, which can then be used as desired in your UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basics of Web Components&lt;/strong&gt;&lt;br&gt;
To create a Web Component, you must first define a &lt;strong&gt;&lt;a href="https://babeljs.io/docs/learn" rel="noopener noreferrer"&gt;ES2015&lt;/a&gt;&lt;/strong&gt; Class to control the element. The class can be named anything, but it is advisable to &lt;strong&gt;name the Class similar to the purpose you are creating the component for&lt;/strong&gt;. For example, if you are creating a &lt;strong&gt;Footer component&lt;/strong&gt;, you should name your Class as "&lt;strong&gt;Footer&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;The class that you create must extend from the &lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement" rel="noopener noreferrer"&gt;HTMLElement interface&lt;/a&gt;&lt;/strong&gt;. After doing this, you need to register your component with the browser by executing &lt;strong&gt;customElements.define&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can refer below to see the basic structure of the Web Component -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MyComponent extends HTMLElement {
    // component implementation code written here
}

customElements.define('my-component', MyComponent);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An important part to note is, there is a &lt;strong&gt;hyphen&lt;/strong&gt; in the name "&lt;strong&gt;my-component&lt;/strong&gt;". This hyphen is required in the specification so that we can differentiate the custom Web Components from the standard HTML elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lifecycle Callbacks of the Web Components
&lt;/h2&gt;

&lt;p&gt;The HTML Web Components have some &lt;strong&gt;Lifecycle Callback methods&lt;/strong&gt; which are executed when the Browser calls the different parts of the component's lifecycle. These methods are - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;connectedCallback&lt;/strong&gt;: this method is executed when the component is first &lt;strong&gt;mounted/loaded onto the DOM&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;disconnectedCallback&lt;/strong&gt;: this method is executed when the component is &lt;strong&gt;unmounted/removed from the DOM&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnl76edbriywguq8382n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnl76edbriywguq8382n.png" alt="Web Components as tech" width="571" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create the Web Component, initialize the component class and execute the call to &lt;strong&gt;customElements.define&lt;/strong&gt; method -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// creating a class for the component by extending from the HTMLElement class
class CurrentDate extends HTMLElement {
    constructor() {
        super();
    }

    // calling the connectedCallback() lifecycle method of web components
    // it is executed when the components first mounts/loads on the page
    connectedCallback() {
        const date = new Date();

        this.textContent = date.toLocaleDateString();
    }
}

// registering the component to the CustomElement Registry
// the name of the custom component should always include a hyphen(-)
// this distinguishes it from the other official HTML elements
customElements.define('current-date', CurrentDate);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since you are extending from the &lt;strong&gt;HTMLElement&lt;/strong&gt; class, you have access to the &lt;strong&gt;textContent&lt;/strong&gt; method, which is being used here to display the current date.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use the Web Component?
&lt;/h2&gt;

&lt;p&gt;To use your custom Web Component, you can simply import it using the &lt;strong&gt;script tag&lt;/strong&gt; in your HTML file -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="./current-date.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To use it in your HTML file, you can simply render the component within the HTML tags -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h2&amp;gt;Today's date is - &amp;lt;/h2&amp;gt;
&amp;lt;current-date&amp;gt;&amp;lt;/current-date&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To summarize, your full HTML file will look like this -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Web Components tutorial&amp;lt;/title&amp;gt;
    &amp;lt;script src="./current-date.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Introduction to Web Components&amp;lt;/h1&amp;gt;

    &amp;lt;h2&amp;gt;Today's date is - &amp;lt;/h2&amp;gt;
    &amp;lt;current-date&amp;gt;&amp;lt;/current-date&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see this output on your browser - &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fen5vre2b1mqgg7zch7kv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fen5vre2b1mqgg7zch7kv.PNG" alt="output" width="614" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the most important benefits of using the HTML Web Components is that they are &lt;strong&gt;not dependent on any third-party libraries&lt;/strong&gt;, so using them won't have any side-effects and they won't have a significant effect on your bundle size.&lt;/p&gt;

&lt;p&gt;And that's it! You have successfully learnt about Web Components and how to incorporate them within your project.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View my Personal Portfolio :- &lt;a href="https://aryan-s-portfolio.vercel.app/" rel="noopener noreferrer"&gt;Aryan's Portfolio&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What is Linting and how to use a Linter tool💻</title>
      <dc:creator>Aryan Dev Shourie</dc:creator>
      <pubDate>Wed, 08 Nov 2023 18:31:18 +0000</pubDate>
      <link>https://dev.to/aryan_shourie/what-is-linting-and-how-to-use-a-linter-tool-524l</link>
      <guid>https://dev.to/aryan_shourie/what-is-linting-and-how-to-use-a-linter-tool-524l</guid>
      <description>&lt;h2&gt;
  
  
  What is Linting?
&lt;/h2&gt;

&lt;p&gt;Linting is defined as the &lt;strong&gt;automated checking&lt;/strong&gt; of your source code for &lt;strong&gt;programmatic&lt;/strong&gt; and &lt;strong&gt;stylistic&lt;/strong&gt; errors. It is the process of performing &lt;strong&gt;static analysis&lt;/strong&gt; on the source code to flag patterns that might cause errors or other problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can Linting do?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Linting can &lt;strong&gt;detect errors&lt;/strong&gt; in code and detect the errors that can lead to &lt;strong&gt;security vulnerabilities&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linting can detect &lt;strong&gt;formatting or styling issues&lt;/strong&gt; and makes the code more &lt;strong&gt;readable and optimized&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linting makes &lt;strong&gt;maintaining the code&lt;/strong&gt; much more easier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overall, Linting increases the &lt;strong&gt;quality of the code&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  What are Linters?
&lt;/h2&gt;

&lt;p&gt;The term &lt;strong&gt;"lint"&lt;/strong&gt; was derived from the name of the tiny bits of fiber and fluff shed by clothing, as the command should act like a dryer machine lint trap, detecting small errors with big effects.&lt;/p&gt;

&lt;p&gt;Today, we use the term &lt;strong&gt;"linters"&lt;/strong&gt; for a class of tools that check code for &lt;strong&gt;common bugs&lt;/strong&gt; and &lt;strong&gt;stylistic errors&lt;/strong&gt;. Most linters are &lt;strong&gt;highly configurable&lt;/strong&gt; so they can enforce the standards of your organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should you use Linters?
&lt;/h2&gt;

&lt;p&gt;There are 2 main reasons to use a Linter - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To save yourself trouble by avoiding common problems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To enforce a common coding style across a team&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone makes mistakes when they’re coding. It’s easy to use the &lt;strong&gt;wrong type of bracket&lt;/strong&gt;, &lt;strong&gt;forget a semicolon&lt;/strong&gt;, or &lt;strong&gt;misspell something&lt;/strong&gt;. Checking your code for these types of errors is the kind of thing that computers excel at. Rather than reviewing your code line by line for &lt;strong&gt;common syntax errors&lt;/strong&gt;, you can tell a computer what types of errors to look for.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Types of Linters
&lt;/h2&gt;

&lt;p&gt;There are tons of Linters available out there, choosing the appropriate and most useful ones will depend on your tech-stack. Primarily, for &lt;strong&gt;Front-End Development&lt;/strong&gt; linters are used in three main domains - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Formatting&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most popular ones are - &lt;strong&gt;ESLint&lt;/strong&gt; for JavaScript, &lt;strong&gt;Prettier&lt;/strong&gt; for Formatting and &lt;strong&gt;Stylelint&lt;/strong&gt; for CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  ESLint
&lt;/h2&gt;

&lt;p&gt;There have been several popular JavaScript linters over the years, but &lt;strong&gt;ESLint&lt;/strong&gt; is the most popular right now. ESLint places a particular emphasis on &lt;strong&gt;extensibility&lt;/strong&gt;, with a very active community for &lt;strong&gt;plugins&lt;/strong&gt;, &lt;strong&gt;modules&lt;/strong&gt; and &lt;strong&gt;shared configs&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stylelint
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w5l84hk8ld7r6caav7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w5l84hk8ld7r6caav7j.png" alt="stylelint" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Stylelint is the most popular linter for CSS. It can even be used to &lt;strong&gt;lint CSS in other files&lt;/strong&gt;, like &lt;strong&gt;script&lt;/strong&gt; elements in HTML and &lt;strong&gt;CSS-in-JS&lt;/strong&gt;. It is modeled heavily on ESLint, following the extensible model.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prettier
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41f43jzss2tj97w2gbtd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41f43jzss2tj97w2gbtd.jpg" alt="prettier" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The main focus of Prettier is to take care of &lt;strong&gt;code formatting&lt;/strong&gt; and making the code as readable as possible. Things like &lt;strong&gt;code block indentation&lt;/strong&gt;, &lt;strong&gt;preventing nested ternaries&lt;/strong&gt;, &lt;strong&gt;preventing long code lines&lt;/strong&gt; and &lt;strong&gt;unnecessary semicolons&lt;/strong&gt; are taken care by Prettier. It provides support for many languages like &lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, &lt;strong&gt;HTML&lt;/strong&gt; and &lt;strong&gt;Markdown&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to use a Linter?
&lt;/h2&gt;

&lt;p&gt;There are several options to use a linter, depending on how much control you have over your &lt;strong&gt;development environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the most basic level, you can &lt;strong&gt;install a linter into your editor&lt;/strong&gt;. Most linters have &lt;strong&gt;plugins for VS Code and other editors&lt;/strong&gt;. If you add a &lt;strong&gt;lint config file&lt;/strong&gt; to your project, then anyone with the linter installed in their editor will benefit from the shared set of rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fdnr6fonkv1g3409y9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fdnr6fonkv1g3409y9p.png" alt="eslint" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Ignoring Linter rules
&lt;/h2&gt;

&lt;p&gt;Most linters will allow you to set up an &lt;strong&gt;"ignore"&lt;/strong&gt; file that tells the linter to not pay attention to certain files. Linters also usually include a &lt;strong&gt;special comment&lt;/strong&gt; you can add to &lt;strong&gt;disable&lt;/strong&gt; the linter rules for the &lt;strong&gt;next line or section of code&lt;/strong&gt;. The comment may look something like this -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* stylelint-disable-next-line declaration-no-important */
display: none !important;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This comment tells Stylelint to &lt;strong&gt;disable the “No !important”&lt;/strong&gt; rule on the next line.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn :- &lt;a href="https://www.linkedin.com/in/aryandev-shourie-175025229/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do check out my GitHub for amazing projects :- &lt;a href="https://github.com/Aryan2727-debug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View my Personal Portfolio :- &lt;a href="https://aryan-s-portfolio.vercel.app/" rel="noopener noreferrer"&gt;Aryan's Portfolio&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>eslint</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
