<?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>Forem: Ganesh Patil</title>
    <description>The latest articles on Forem by Ganesh Patil (@devgancode).</description>
    <link>https://forem.com/devgancode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F724298%2F4347fcef-f4ab-4ab1-98a3-9e9388ede4c0.jpeg</url>
      <title>Forem: Ganesh Patil</title>
      <link>https://forem.com/devgancode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devgancode"/>
    <language>en</language>
    <item>
      <title>Simplifying Proxies and Bruno Integration - A Developer's Guide</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Wed, 16 Jul 2025 07:28:59 +0000</pubDate>
      <link>https://forem.com/devgancode/simplifying-proxies-and-bruno-integration-a-developers-guide-2e03</link>
      <guid>https://forem.com/devgancode/simplifying-proxies-and-bruno-integration-a-developers-guide-2e03</guid>
      <description>&lt;p&gt;
  A &lt;span&gt;proxy&lt;/span&gt; is a simple server that
  sits between your device and the internet. It acts as a middleman, forwarding
  your requests to external servers and returning their responses, offering
  added &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;privacy&lt;/strong&gt;, and sometimes
  &lt;strong&gt;faster performance&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;There are two main types of proxies:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Forward Proxy&lt;/strong&gt; (Client-side)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Reverse Proxy&lt;/strong&gt; (Server-side)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  In this guide, we’ll walk you through what proxies are, the differences
  between forward and reverse proxies, and how to
  &lt;span&gt;configure a proxy in Bruno&lt;/span&gt; to
  enhance your API testing workflows.
&lt;/p&gt;




&lt;h2&gt;Understanding Proxies&lt;/h2&gt;

&lt;p&gt;
  At its core, a proxy server is just another computer that stands between your
  device and the target server on the internet. Instead of your request going
  directly to the destination, it first goes to the proxy. The proxy then
  forwards your request, receives the response, and sends it back to you. Think
  of it as a helpful go-between for your online communications.
&lt;/p&gt;

&lt;p&gt;Why do we need such a middleman?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Anonymity &amp;amp; Privacy:&lt;/strong&gt; They hide your actual IP address from
    the destination server, making your online activity harder to track. The
    destination server only sees the proxy's IP.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Security:&lt;/strong&gt; Proxies can filter malicious traffic, block
    access to dangerous sites, or serve as a first line of defense against
    attacks.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Content Access:&lt;/strong&gt; They can help bypass geographical
    restrictions or network blocks by acting as a gateway from an allowed
    location.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Performance (Caching):&lt;/strong&gt; Proxies can store copies of
    frequently accessed web pages or files. If multiple users request the same
    content, the proxy can serve it directly from its cache, speeding up load
    times and saving bandwidth.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Monitoring &amp;amp; Logging:&lt;/strong&gt; In corporate environments, proxies
    can log internet usage for security audits, policy enforcement, and
    troubleshooting.
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Forward Proxies (Client-side)&lt;/h3&gt;

&lt;p&gt;
  A Forward Proxy is what most people typically think of when they hear the
  term "proxy." It sits in front of one or more client devices (like your
  computer or a corporate network) and acts on their behalf to send requests out
  to the internet.
&lt;/p&gt;

&lt;p&gt;
  How it works: Your computer (client) sends a request to the forward
  proxy. The forward proxy then sends that request to the destination server on
  the internet. The destination server sees the proxy's IP address, not yours.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Uses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Corporate Networks:&lt;/strong&gt; Companies use forward proxies to filter
    web content, enforce security policies, cache frequently accessed data, and
    monitor employee internet usage.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;VPNs &amp;amp; Anonymizers:&lt;/strong&gt; Many VPN services and anonymity tools
    operate as forward proxies, routing your traffic through a different server
    to hide your location.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Geographical Unblocking:&lt;/strong&gt; Accessing content restricted to
    certain regions by routing through a proxy located in that region.
  &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%2Fvl273mebmu62vmiurp9b.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%2Fvl273mebmu62vmiurp9b.png" alt="Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Reverse Proxies (Server-side)&lt;/h3&gt;

&lt;p&gt;
  A Reverse Proxy works differently. Instead of sitting in front of the
  client, it sits in front of one or more servers (like your web servers or
  API servers). It receives all incoming requests from the internet and then
  forwards them to the appropriate backend server. The client making the request
  never directly interacts with the backend servers.
&lt;/p&gt;

&lt;p&gt;
  **How it works:** A client (e.g., your browser, or Bruno testing an API) sends
  a request to a domain (e.g., `api.yourcompany.com`). This request hits the
  reverse proxy. The reverse proxy then directs the request to the correct
  internal server that can fulfill it, returning the response back to the
  client.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Uses (especially in enterprise for APIs):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Load Balancing:&lt;/strong&gt; If you have multiple API servers, a reverse
    proxy can distribute incoming traffic across them, preventing any single
    server from being overwhelmed and ensuring high availability.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Enhanced Security:&lt;/strong&gt; It hides the internal network structure,
    shielding backend servers from direct attacks. It can also handle SSL/TLS
    encryption (SSL Offloading), preventing direct exposure of certificates on
    backend servers.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Caching:&lt;/strong&gt; Just like forward proxies, reverse proxies can
    cache static or frequently requested content, reducing the load on backend
    servers and improving response times.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;API Gateway Functionality:&lt;/strong&gt; Many modern API gateways are
    built on reverse proxy principles, handling authentication, rate limiting,
    request/response transformation, and routing for microservices.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;URL Rewriting &amp;amp; Routing:&lt;/strong&gt; They can manipulate URLs or route
    requests to different backend services based on the URL path, enabling
    flexible API architectures.
  &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%2Floph8kcnqp0qpx9ibg1u.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%2Floph8kcnqp0qpx9ibg1u.png" alt="Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;How to Configure Proxy in Bruno&lt;/h2&gt;

&lt;p&gt;
  Bruno provides flexible proxy configuration options at both the global (main
  settings) and collection levels. This allows you to tailor your testing
  environment to various network setups, from personal use to complex corporate
  proxies.
&lt;/p&gt;

&lt;h3&gt;Main Settings (Global Proxy)&lt;/h3&gt;

&lt;p&gt;
  These settings act as your default. If no specific collection proxy is
  configured, Bruno will use these.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access:&lt;/strong&gt; Go to Bruno's general settings.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;`xMode` (Off/On/System Proxy):&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;strong&gt;`Off` :&lt;/strong&gt; No global proxy is used by default.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`On` :&lt;/strong&gt; Bruno will use the proxy details configured below
        for all requests.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`System Proxy` :&lt;/strong&gt; Bruno attempts to automatically detect and
        use your operating system's proxy settings. Convenient for corporate
        environments where system-wide proxies are set.
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;`Protocol` (HTTP/HTTPS/SOCKS4/SOCKS5):&lt;/strong&gt; Specifies the
    protocol Bruno will use to communicate with the proxy server.
    &lt;ul&gt;
      &lt;li&gt;
        &lt;strong&gt;`HTTP` :&lt;/strong&gt; Standard protocol for web traffic.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`HTTPS` :&lt;/strong&gt; Secure, encrypted communication with the proxy.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`SOCKS4` :&lt;/strong&gt; A generic proxy protocol for various network
        traffic.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`SOCKS5` :&lt;/strong&gt; An advanced SOCKS protocol supporting
        authentication and UDP traffic.
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;`Hostname` (e.g., `proxy.example.com`):&lt;/strong&gt; The IP address or
    domain name of your proxy server.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;`Port` (e.g., `3000` , `8080`):&lt;/strong&gt; The specific port number on
    which the proxy server listens for connections.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;`Auth` (Username/Password):&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;strong&gt;`Username` :&lt;/strong&gt; The username required to authenticate with the
        proxy server.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`Password` :&lt;/strong&gt; The password required to authenticate with the
        proxy server.
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;`Proxy Bypass` :&lt;/strong&gt; A comma-separated list of hostnames or IP
    addresses that Bruno should connect to *directly*, bypassing the configured
    proxy. Useful for internal APIs or specific services that don't need to go
    through the proxy.
  &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%2Fpah2cxs9cu9xv3cw74pt.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%2Fpah2cxs9cu9xv3cw74pt.png" alt="Image" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Collection Level Proxy&lt;/h3&gt;

&lt;p&gt;
  These settings allow you to override the global proxy configuration for a
  specific collection of requests.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access:&lt;/strong&gt; In your Bruno collection, find its settings.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;`Config` (global/enabled/disabled):&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;strong&gt;`global` :&lt;/strong&gt; Use the global proxy settings defined in Bruno's
        main settings.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`enabled` :&lt;/strong&gt; Activate collection-specific proxy settings.
        Bruno will use the Hostname, Port, Protocol, and Auth configured within
        this collection.
      &lt;/li&gt;
      &lt;li&gt;
        &lt;strong&gt;`disabled` :&lt;/strong&gt; Do not use any proxy for this collection, even
        if a global proxy is enabled.
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    All other fields (&lt;code&gt;Protocol&lt;/code&gt;, &lt;code&gt;Hostname&lt;/code&gt;,
    &lt;code&gt;Port&lt;/code&gt;, &lt;code&gt;Auth&lt;/code&gt;, &lt;code&gt;Proxy Bypass&lt;/code&gt;) function
    identically to the global settings, but apply only to this specific
    collection.
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;strong&gt;Why both levels?&lt;/strong&gt; This flexibility is key for an API testing
  tool. You might have:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A global corporate proxy for most external requests.&lt;/li&gt;
  &lt;li&gt;A specific collection of tests for an internal API that should bypass the
    proxy.&lt;/li&gt;
  &lt;li&gt;Another collection for a client whose API requires a different, dedicated
    proxy.&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%2Fvugiih1xx9tqay8889mi.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%2Fvugiih1xx9tqay8889mi.png" alt="Image" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Wrap Up&lt;/h2&gt;

&lt;p&gt;
  Proxies are a fundamental component of modern networking, offering crucial benefits like enhanced security, improved privacy, and optimized performance for both clients and servers. With Bruno's intuitive proxy configuration options, you're well-equipped to handle complex network environments. 
&lt;/p&gt;

&lt;p&gt;
Your APIs deserve better conversations - 
&lt;a&gt;join the Bruno Discord&lt;/a&gt;.

&lt;br&gt;Happy proxy testing with Bruno!  🚀
&lt;/p&gt;

&lt;p&gt;Complete Bruno Product Walkthrough ❤️&lt;/p&gt;

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

</description>
      <category>bruno</category>
      <category>proxies</category>
      <category>apitesting</category>
      <category>network</category>
    </item>
    <item>
      <title>How to Automate API Testing with Bruno CLI and Jenkins</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Thu, 10 Jul 2025 11:51:03 +0000</pubDate>
      <link>https://forem.com/devgancode/how-to-automate-api-testing-with-bruno-cli-and-jenkins-1c30</link>
      <guid>https://forem.com/devgancode/how-to-automate-api-testing-with-bruno-cli-and-jenkins-1c30</guid>
      <description>&lt;p&gt;Jenkins is a powerful open-source automation server that enables continuous integration and continuous delivery (CI/CD) for software development workflows. It provides a robust platform for automating build, test, and deployment processes across multiple environments and platforms.&lt;/p&gt;

&lt;p&gt;Bruno CLI integrates seamlessly with Jenkins pipelines to automate API testing workflows. This guide will walk you through setting up automated test execution using Jenkins CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A running Jenkins instance (local or remote).&lt;/li&gt;
&lt;li&gt;Bruno CLI installed.&lt;/li&gt;
&lt;li&gt;The NodeJS Plugin installed in your Jenkins environment.&lt;/li&gt;
&lt;li&gt;A Git repository containing your Bruno collections and a &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Local Development Setup
&lt;/h2&gt;

&lt;p&gt;If you're using macOS, you can use the following setup to configure Jenkins in your system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Install Jenkins via Homebrew
&lt;/h4&gt;

&lt;p&gt;Run the following command on the terminal to install Jenkins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;jenkins-lts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;jenkins-lts&lt;/code&gt; package installs the Long Term Support version of Jenkins, which is recommended for stability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Start the Jenkins Service
&lt;/h4&gt;

&lt;p&gt;After installation, start the Jenkins service using Homebrew's services command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew services start jenkins-lts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Access Jenkins in Your Browser
&lt;/h4&gt;

&lt;p&gt;Jenkins typically runs on port 8080. Open your web browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be greeted with the "Unlock Jenkins" screen.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Unlock Jenkins and Install Plugins
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve the initial admin password:&lt;/strong&gt; The Jenkins console will display the path to the initial admin password. You can also find it by running:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cat&lt;/span&gt; /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy this password.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste the password:&lt;/strong&gt; In the browser, paste the copied password into the "Administrator password" field and click &lt;code&gt;Continue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install suggested plugins:&lt;/strong&gt; On the next screen, choose &lt;code&gt;Install suggested plugins&lt;/code&gt;. This will install a set of essential plugins required for most Jenkins functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create First Admin User:&lt;/strong&gt; After the plugins are installed, you'll be prompted to create your first admin user. Fill in the details and click &lt;code&gt;Save and Finish&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jenkins is Ready:&lt;/strong&gt; Click &lt;code&gt;Start using Jenkins&lt;/code&gt; to access your Jenkins Dashboard.&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%2F64spghw066xnnl07b2g9.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%2F64spghw066xnnl07b2g9.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 Automate API Testing with Jenkins
&lt;/h2&gt;

&lt;p&gt;Now, let's start with automating the API testing workflow with Jenkins and Bruno CLI. This section will guide you for structuring your Bruno collection, the sample Jenkinsfile, and the initial setup you need to configure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Organize Your Bruno Collections
&lt;/h3&gt;

&lt;p&gt;Ensure your Bruno collections and environment files are properly organized within your Git repository. A typical structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;your-api-project/
├── Jenkinsfile
├── collections/
│   ├── authentication/
│   │   ├── login.bru
│   │   └── logout.bru
├── environments/
│   ├── development.bru
│   ├── ci.bru
│   └── production.bru
└── bruno.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Node.js in Jenkins
&lt;/h3&gt;

&lt;p&gt;Before running Bruno CLI, you need to ensure Jenkins can access a Node.js runtime environment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the NodeJS Plugin:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;code&gt;Manage Jenkins&lt;/code&gt; &amp;gt; &lt;code&gt;Plugins&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;Available plugins&lt;/code&gt; tab, search for &lt;strong&gt;NodeJS&lt;/strong&gt;, and install it.&lt;/li&gt;
&lt;/ul&gt;
&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%2Fm39oad2rb644i6bs1i0q.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%2Fm39oad2rb644i6bs1i0q.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Configure a Node.js Installation:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;Manage Jenkins&lt;/code&gt; &amp;gt; &lt;code&gt;Tools&lt;/code&gt; (under &lt;code&gt;System Configuration&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;code&gt;NodeJS installations&lt;/code&gt; section and Click &lt;code&gt;Add NodeJS&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Provide a descriptive &lt;strong&gt;Name&lt;/strong&gt; (e.g., &lt;code&gt;Node.js 18&lt;/code&gt;). This exact name will be used in your Jenkinsfile.
&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;Install automatically&lt;/code&gt; and select your desired &lt;code&gt;Node.js version&lt;/code&gt; (e.g., &lt;code&gt;NodeJS 18.20.8&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crucially, ensure the checkbox "Provide Node &amp;amp; npm folder to PATH" is checked.&lt;/strong&gt; This ensures &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;npm&lt;/code&gt; commands are available to your pipeline.
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&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%2Fn25o1vuucu96zp8uo7vx.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%2Fn25o1vuucu96zp8uo7vx.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create Your Jenkinsfile
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;Jenkinsfile&lt;/code&gt; in the root of your Git repository. This file defines the steps of your CI pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="c1"&gt;// Run the pipeline on any available Jenkins agent&lt;/span&gt;
    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Checkout Code'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Clones the repository to the Jenkins workspace&lt;/span&gt;
                &lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="n"&gt;scm&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Setup Node.js &amp;amp; Install Bruno CLI'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Makes the Node.js installation (configured in Jenkins Tools) available&lt;/span&gt;
                &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="s1"&gt;'Node.js 18'&lt;/span&gt; &lt;span class="c1"&gt;// Use the exact name configured in Jenkins Global Tool Configuration&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Verifying Node.js and npm versions...'&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'node -v'&lt;/span&gt; &lt;span class="c1"&gt;// Verify Node.js is on PATH&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'npm -v'&lt;/span&gt;  &lt;span class="c1"&gt;// Verify npm is on PATH&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Installing Bruno CLI globally...'&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'npm install -g @usebruno/cli'&lt;/span&gt; &lt;span class="c1"&gt;// Install Bruno CLI&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'bru --version'&lt;/span&gt; &lt;span class="c1"&gt;// Verify Bruno CLI installation&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Run API Tests'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Ensure Node.js is available if this stage runs in a separate context&lt;/span&gt;
                &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="s1"&gt;'Node.js 18'&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Executing Bruno API tests...'&lt;/span&gt;
                &lt;span class="c1"&gt;// Run tests with 'ci' environment and generate an HTML report&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'bru run --env ci --reporter-html results.html'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Archive Test Results'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Archiving test report...'&lt;/span&gt;
                &lt;span class="c1"&gt;// Save the generated HTML report as a build artifact&lt;/span&gt;
                &lt;span class="n"&gt;archiveArtifacts&lt;/span&gt; &lt;span class="nl"&gt;artifacts:&lt;/span&gt; &lt;span class="s1"&gt;'results.html'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;fingerprint:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Actions to run after the main pipeline stages complete&lt;/span&gt;
        &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Pipeline finished.'&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'API Tests Passed Successfully!'&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;failure&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'API Tests Failed! Check console output for details.'&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Configure Jenkins Pipeline Job
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a New Jenkins Job:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;From the Jenkins Dashboard, click &lt;code&gt;New Item&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Enter an Item name (e.g., &lt;code&gt;bruno-api-tests-pipeline&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Pipeline&lt;/code&gt; as the item type and click &lt;code&gt;OK.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&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%2Fia2p1pt4h01auum8c1zx.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%2Fia2p1pt4h01auum8c1zx.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Job Details:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the job configuration page, navigate to the &lt;code&gt;Pipeline&lt;/code&gt; section.
&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;Definition&lt;/code&gt; to &lt;code&gt;Pipeline script from SCM&lt;/code&gt; and Choose your &lt;code&gt;SCM&lt;/code&gt; (e.g., &lt;code&gt;Git&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Enter your &lt;code&gt;Repository URL&lt;/code&gt; (e.g., &lt;code&gt;https://github.com/your-org/your-repo.git&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Specify any &lt;code&gt;Credentials&lt;/code&gt; if your repository is private.
&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;Branches to build&lt;/code&gt; to &lt;code&gt;*/main&lt;/code&gt; (or the branch containing your Jenkinsfile).
&lt;/li&gt;
&lt;li&gt;Ensure &lt;code&gt;Script Path&lt;/code&gt; is &lt;code&gt;Jenkinsfile&lt;/code&gt; (this is the default).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional:&lt;/strong&gt; Under &lt;code&gt;Build Triggers&lt;/code&gt;, configure how you want your pipeline to start (e.g., &lt;code&gt;GitHub hook trigger for GITScm polling&lt;/code&gt; for automatic builds on push, or &lt;code&gt;Build periodically&lt;/code&gt; for scheduled runs using cron syntax).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;code&gt;Save&lt;/code&gt; to finalize your job configuration.&lt;/p&gt;&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%2F21wxsj0lyw1s8k6gpqw4.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%2F21wxsj0lyw1s8k6gpqw4.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Run and Monitor Your Pipeline
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trigger a Build:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;From your Jenkins pipeline job page, click &lt;code&gt;Build Now&lt;/code&gt; (in the left-hand menu) to manually start the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Progress:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Observe the &lt;code&gt;Build History&lt;/code&gt; section to see the status of your builds (green checkmark for success, red cross mark for failure).
&lt;/li&gt;
&lt;li&gt;Click on a specific build number, then select &lt;code&gt;Console Output&lt;/code&gt; to view real-time logs and detailed execution steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View Test Results:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Once a build that generated &lt;code&gt;results.html&lt;/code&gt; completes, navigate to that specific build's page.
&lt;/li&gt;
&lt;li&gt;Look for the &lt;strong&gt;Artifacts&lt;/strong&gt; section (usually on the left sidebar or at the top of the build summary).
&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;results.html&lt;/code&gt; to download the report, then open it in your web browser for detailed test outcomes.&lt;/li&gt;
&lt;/ul&gt;
&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%2Fjb4mfxj93it4g8j0vodx.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%2Fjb4mfxj93it4g8j0vodx.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Try the Demo Yourself
&lt;/h2&gt;

&lt;p&gt;We've published the &lt;a href="https://github.com/bruno-collections/jenkins-setup" rel="noopener noreferrer"&gt;full working collection&lt;/a&gt; on GitHub. You can easily clone and use it for demo purposes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;Automating your API testing workflow can save a lot of time for software developers and QA engineers and cost for organizations. Instead of repeating one task multiple times, you can automate with Bruno CLI and Jenkins to build robust, bug-free, and quality software applications.   &lt;/p&gt;

&lt;p&gt;Want to explore more about API automation, security, and AI? Join the Bruno &lt;a href="https://discord.com/invite/fAPz4PrYnK" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; to connect, learn, and grow with a vibrant tech community!&lt;/p&gt;

&lt;p&gt;Complete Bruno Product Walkthrough ❤️&lt;/p&gt;

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

</description>
      <category>jenkins</category>
      <category>cicd</category>
      <category>apitesting</category>
      <category>bruno</category>
    </item>
    <item>
      <title>How to Automate API Testing in CI/CD Using GitHub Actions + Bruno CLI 🚀</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Wed, 02 Jul 2025 13:37:17 +0000</pubDate>
      <link>https://forem.com/devgancode/how-to-automate-api-testing-in-cicd-using-github-actions-bruno-cli-21jh</link>
      <guid>https://forem.com/devgancode/how-to-automate-api-testing-in-cicd-using-github-actions-bruno-cli-21jh</guid>
      <description>&lt;p&gt;CI/CD is table stakes for modern dev teams — and if you're building APIs, test automation should be too. GitHub Actions is a fantastic platform for integrating tests directly into your dev flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bruno CLI&lt;/strong&gt; makes it dead simple to run your API tests as part of every commit and pull request. No more manual testing or flaky setup — just repeatable, scriptable tests that run on autopilot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ This guide assumes you’ve already got a GitHub repo with Bruno collections. If not, &lt;a href="https://docs.usebruno.com/advanced-guides/starter-guide" rel="noopener noreferrer"&gt;start here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you set up the GitHub Action, make sure you’ve got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub repo with Bruno collections committed&lt;/li&gt;
&lt;li&gt;Some familiarity with GitHub Actions YAML syntax&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Organizing Your Bruno Collections
&lt;/h2&gt;

&lt;p&gt;Structure your repo 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;your-api-project/
├── .github/
│   └── workflows/
│       └── api-tests.yml
├── collections/
│   ├── authentication/
│   │   ├── login.bru
│   │   └── logout.bru
├── environments/
│   ├── development.bru
│   ├── ci.bru
│   └── production.bru
└── bruno.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.github/workflows/&lt;/code&gt; → stores GitHub Actions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;collections/&lt;/code&gt; → organized Bruno test collections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;environments/ci.bru&lt;/code&gt; → test-specific environment config&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ GitHub Actions Workflow
&lt;/h2&gt;

&lt;p&gt;Create a file at &lt;code&gt;.github/workflows/api-tests.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Bruno CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g @usebruno/cli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API Tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bru run --env ci --reporter-html results.html&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload Test Results&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test-results&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;results.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs on push/PR to &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sets up Node 20, installs Bruno CLI&lt;/li&gt;
&lt;li&gt;Executes API tests with &lt;code&gt;ci&lt;/code&gt; environment&lt;/li&gt;
&lt;li&gt;Uploads the HTML test report as an artifact&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Securing Sensitive Data with GitHub Secrets
&lt;/h2&gt;

&lt;p&gt;If you use secrets like API keys or tokens, pass them safely like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API Tests with Secrets&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;bru run --env ci \&lt;/span&gt;
      &lt;span class="s"&gt;--env-var API_KEY=${{ secrets.API_KEY }} \&lt;/span&gt;
      &lt;span class="s"&gt;--env-var JWT_TOKEN=${{ secrets.JWT_TOKEN }}&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.API_BASE_URL }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To set secrets:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your repo
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Settings → Secrets and variables → Actions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;New repository secret&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add your sensitive keys/tokens&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%2Fyxcdhv9dmwh10q3gjwc6.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%2Fyxcdhv9dmwh10q3gjwc6.png" alt="GitHub Secrets UI" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring &amp;amp; Debugging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Check Build Status
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;Actions&lt;/strong&gt; tab in your repo&lt;/li&gt;
&lt;li&gt;You’ll see the workflow listed by commit&lt;/li&gt;
&lt;li&gt;Expand any job to view logs and timing&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%2Fy9s663gtpspv5ocgw7wl.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%2Fy9s663gtpspv5ocgw7wl.png" alt="GitHub Actions Tab" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  View Test Reports
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Download &lt;code&gt;results.html&lt;/code&gt; from the &lt;code&gt;test-results&lt;/code&gt; artifact&lt;/li&gt;
&lt;li&gt;Open in a browser to view full report&lt;/li&gt;
&lt;li&gt;You can also emit JUnit format if needed for integration&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%2Faltz86wdr5uvcatqptnq.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%2Faltz86wdr5uvcatqptnq.png" alt="HTML Report" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try the Demo Collection
&lt;/h2&gt;

&lt;p&gt;We’ve open-sourced a working example at &lt;a href="https://github.com/bruno-collections/github-actions" rel="noopener noreferrer"&gt;bruno-collections/github-actions&lt;/a&gt;. &lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; + &lt;a href="https://www.npmjs.com/package/@usebruno/cli" rel="noopener noreferrer"&gt;Bruno CLI&lt;/a&gt; is a killer combo for shipping fast, tested, and reliable APIs. Start with a simple workflow, evolve it as you grow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate it. Test it. Ship it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy testing 🚀&lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>cicd</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OpenGraph Protocol Explained: Optimize Your Website for Better Social Sharing</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Thu, 02 Jan 2025 17:55:14 +0000</pubDate>
      <link>https://forem.com/devgancode/opengraph-protocol-explained-optimize-your-website-for-better-social-sharing-254b</link>
      <guid>https://forem.com/devgancode/opengraph-protocol-explained-optimize-your-website-for-better-social-sharing-254b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered how links shared on social media platforms like LinkedIn, Twitter, or Reddit automatically display a preview, including an image, title, and description of the webpage?  &lt;/p&gt;

&lt;p&gt;This magic happens thanks to &lt;strong&gt;meta tags&lt;/strong&gt; and the &lt;strong&gt;Open Graph protocol&lt;/strong&gt; embedded in the website's code. Let’s explore this concept with an example:  &lt;/p&gt;




&lt;p&gt;Let me know if you'd like me to expand this further!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Without meta tags &amp;amp; Opengraph protocol&lt;/li&gt;
&lt;li&gt;Using meta tags &amp;amp; Opengraph protocol&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Without meta tags &amp;amp; Opengraph protocol
&lt;/h3&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%2Fxzow63g7jbjcxsso0fug.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%2Fxzow63g7jbjcxsso0fug.PNG" alt="Image description" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can see the shared url is not showing anything and its not good experience for users. Let's see another exaample by using meta tags and Opengraph protocol.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using meta tags &amp;amp; Opengraph protocol
&lt;/h3&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%2Fz4ypqx76qgsvpgaskwnb.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%2Fz4ypqx76qgsvpgaskwnb.PNG" alt="Image description" width="737" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if you see this example where shared links showing website preview with title &lt;code&gt;Ganesh Patil | DevGan&lt;/code&gt; and etc. because of using meta tags and opengraph protocol. &lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Now lets understand a bit about opengraph and meta tags.&lt;/p&gt;

&lt;h3&gt;
  
  
  Meta tags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Meta tags are HTML elements that provide metadata about a web page. This metadata can include information about the page’s content, author, description, keywords, and more. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These tags are typically placed within the &lt;/p&gt; section of a webpage and help search engines, social media platforms, and browsers understand and display the page's information accurately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Common Meta Tags:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: Specifies the character encoding for the document.
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Your description here"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: Provides a brief description of the page, which can appear in search engine results.
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keywords"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"keyword1, keyword2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: Lists relevant keywords for SEO.
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"author"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Author Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;: Identifies the author of the content.

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opengraph Protocol
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OpenGraph is a protocol introduced by Facebook that enables web pages to become richer objects when shared across social media platforms. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By using OpenGraph meta tags, you can control how your webpage is displayed when it is shared on platforms like Facebook, Twitter, LinkedIn, and others.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Common OpenGraph Tags:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Page Title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Defines the title of your page as it will appear on social media.

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Page Description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Provides a description of the content of the page.

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"URL to Image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Specifies an image to be displayed when the page is shared. Ideally, this should be a visually appealing image relevant to the content.

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Page URL"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Sets the canonical URL of the page, ensuring that the correct version is shared.

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:type"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"website"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Defines the type of content (e.g., "website", "article", "video", etc.).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate Meta tags Automatically
&lt;/h3&gt;

&lt;p&gt;After understanding the meta tags and opengraph protocol, I want to discuss the common developers problem relates to this. &lt;/p&gt;

&lt;h4&gt;
  
  
  Problem
&lt;/h4&gt;

&lt;p&gt;You have to write repetitive meta tags with suitable description and often people struggle to set image because of size ration and etc. issues are there. &lt;/p&gt;

&lt;h4&gt;
  
  
  Solution
&lt;/h4&gt;

&lt;p&gt;The solution for this example is having tool which will automate the process of writing meta tags and images related issues as well and where &lt;a href="//opengraph.xyz"&gt;opengraph.xyz&lt;/a&gt; tool come into the picture. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to use OpenGraph Tool
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Visit to &lt;a href="https://www.opengraph.xyz/" rel="noopener noreferrer"&gt;OpenGraph Tool&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add your website URL inside input box.&lt;/li&gt;
&lt;li&gt;It will automatically generate meta tags and opengraph tags for your website.&lt;/li&gt;
&lt;li&gt;Add image in [1200x630px] size ratio to show preview of your website.&lt;/li&gt;
&lt;li&gt;Copy and Paste the tags inside your head section of &lt;code&gt;index.html&lt;/code&gt; file.&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%2F9vqym7j2kycau3vum52y.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%2F9vqym7j2kycau3vum52y.png" alt="Image description" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you learn something new from this blog then don't forget to check and support my &lt;a href="https://www.youtube.com/@devgancode" rel="noopener noreferrer"&gt;YouTube channel&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
      <category>seo</category>
    </item>
    <item>
      <title>Build Internal tools with ToolJet</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Wed, 14 Aug 2024 12:31:17 +0000</pubDate>
      <link>https://forem.com/devgancode/build-internal-tools-with-tooljet-4i2i</link>
      <guid>https://forem.com/devgancode/build-internal-tools-with-tooljet-4i2i</guid>
      <description>&lt;p&gt;ToolJet is a low-code platform enabling developers to rapidly build and deploy custom internal tools. It offers drag-and-drop pre-built components for developers to build complex applications with ease. It also provides a wide range of data sources and APIs. This tutorial aims to integrate data sources with the Tooljet app we will build.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Create Tooljet App
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Launch the &lt;a href="https://www.tooljet.com/" rel="noopener noreferrer"&gt;ToolJet&lt;/a&gt; web platform on the browser and select Try for free.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fill the required information and create an account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Select Create an app from the left side panel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Give it a nice name and you are done.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Congrats 😍, you created your first Tooljet app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Step
&lt;/h2&gt;

&lt;p&gt;Now we have successfully created our first app on ToolJet. It's time to integrate data sources. In this tutorial, we use GitHub API as a data source and will incorporate and display the data on Canvas with the pre-built Table component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate GitHub API with ToolJet
&lt;/h2&gt;

&lt;p&gt;There are three different sections of our app&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Left side panel for app controls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Right side panel for components&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;middle panel is divided into two sub-sections&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;One is our app canvas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Query panel.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Connect with Data Source(GitHub API)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Click on the Add button from the data source and select REST API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add this API (&lt;a href="https://api.github.com/users" rel="noopener noreferrer"&gt;https://api.github.com/users&lt;/a&gt;) in the URL input box and click on the run button.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We are successfully able to get the data in JSON format.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Now drag and drop the table component from the right side panel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click on the Table component and on the right side you can see the default data remove it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write the query &lt;code&gt;"{{queries.restapi1.data}}"&lt;/code&gt; in the data section.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We can see our data in the table component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;In this guide, we successfully connected to a data source in ToolJet, fetched data, and displayed it in a Table component. This process can be applied to various data sources and use cases, enabling you to create dynamic and data-driven applications with ToolJet.&lt;/p&gt;

&lt;p&gt;DM for Collab ✍🏻 - &lt;a href="mailto:ganeshpatil.work@gmail.com"&gt;ganeshpatil.work@gmail.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>OpenSource React Tailwind Portfolio Template</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Sat, 13 Jul 2024 12:59:35 +0000</pubDate>
      <link>https://forem.com/devgancode/react-tailwind-portfolio-template-5cdk</link>
      <guid>https://forem.com/devgancode/react-tailwind-portfolio-template-5cdk</guid>
      <description>&lt;p&gt;I built a React Tailwind Portfolio template for all the developers looking to build portfolios. You don't need to make everything from scratch you can use this template &lt;a href="https://github.com/ganeshpatil386386/React-Portfolio-Template" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt; which includes the below features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete Responsiveness &lt;/li&gt;
&lt;li&gt;Dark Mode&lt;/li&gt;
&lt;li&gt;Home Project Blogs YouTube Sections&lt;/li&gt;
&lt;li&gt;Deployed on Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Future Enhancement📍&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement Hashnode &amp;amp; YouTube API&lt;/li&gt;
&lt;li&gt;Search component for Blogs section &lt;/li&gt;
&lt;li&gt;Nice Ui/UX design &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌Here's a complete guide on YouTube to start with the template!&lt;br&gt;
Support to my Channel! &lt;/p&gt;

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

&lt;p&gt;Recent Articles! &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/devgancode/deploy-react-app-on-firebase-netlify-vercel-2abf"&gt;How to Deploy React App on Firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devgancode/next-tailwind-blog-app-4ogb"&gt;OpenSource Next Tailwind Blog Application Deploy on Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devgancode/decoding-community-management-5hl8"&gt;What is Community Management&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mastering CSS3: Strategies for Writing Clean Code and Boosting Performance</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Sat, 03 Feb 2024 06:47:22 +0000</pubDate>
      <link>https://forem.com/devgancode/efficient-way-to-write-css3-4dh7</link>
      <guid>https://forem.com/devgancode/efficient-way-to-write-css3-4dh7</guid>
      <description>&lt;p&gt;Cascading Style Sheet (CSS3) is changing, evolving and continuously there are different ways to write CSS. Some developers choose to write separate files for better understanding or to organize structure, other people write single CSS files. It depends on what kind of project you're working on. &lt;/p&gt;

&lt;h1&gt;
  
  
  OLD V/S NEW CSS
&lt;/h1&gt;

&lt;p&gt;CSS3 completely changed the way to write CSS and it's more powerful with new features. Including responsive layouts, animations, variables, properties like calc functions, etc.&lt;br&gt;&lt;br&gt;
The old way people wrote CSS and found it difficult to make websites responsive and optimized is now can be done easily. &lt;/p&gt;
&lt;h2&gt;
  
  
  Examples of Writing Bad CSS
&lt;/h2&gt;

&lt;p&gt;Most of the time people write the same code again and again for example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Hello &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt; 
&lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Amazing &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Developers &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, I want to change the back color of every individual element. I have to write the following CSS code &lt;br&gt;
app.css&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.item-1{
background-color: red;
}

.item-2{
background-color: red;
}

.item-3{
background-color: red;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Effective Way to Write CSS3
&lt;/h2&gt;

&lt;p&gt;In the previous example, we had to write three different lines to change color right, and now assume you're working with a large codebase and your team lead assigns you the task to change every &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; element color so you have to find each heading change the color.  &lt;/p&gt;

&lt;p&gt;app.css&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.item-1{
background-color: yellow;
}

.item-2{
background-color: yellow;
}

.item-3{
background-color: yellow;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's time-consuming and a bad way to solve problems. &lt;br&gt;
Here's an effective way to solve this. &lt;/p&gt;

&lt;p&gt;Create systemDesign.css as a separate file and add all your styling rules. &lt;br&gt;
systemDesign.css&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="py"&gt;--back-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="py"&gt;--h1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;
&lt;span class="n"&gt;--h2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;span class="c"&gt;/**
* ? You can write all CSS styles here. 
**/&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now let's take the previous example if you have to change the back color of all heading tags all you have to update is a back-color style from the syetmDesign.css file.&lt;/p&gt;

&lt;p&gt;index.html&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Hello &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt; 
&lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Amazing &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"item-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Developers &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;systemDesign.css&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="py"&gt;--back-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="py"&gt;--h1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;
&lt;span class="n"&gt;--h2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/**
* ? Write your CSS classes
**/&lt;/span&gt;

&lt;span class="nc"&gt;.item-1&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;--var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;back-color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-2&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;--var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;back-color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-3&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;--var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;back-color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you want to change back color just change the variable value and that's it. You can also use the &lt;a href="https://www.browserstack.com/guide/sibling-selectors-in-css#:~:text=4.-,General%20sibling%20selector%20(~),being%20adjacent%20to%20each%20other" rel="noopener noreferrer"&gt;sibling concept of CSS &lt;/a&gt;to solve this issue but always use standard practices. &lt;/p&gt;

&lt;h2&gt;
  
  
  Second Example
&lt;/h2&gt;

&lt;p&gt;Another way is to not repeat your code again and again. &lt;/p&gt;

&lt;p&gt;Assume you have two classes &lt;code&gt;.one&lt;/code&gt; and &lt;code&gt;.two&lt;/code&gt; that require the same properties.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"one"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Web &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"two"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Development &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;
&lt;span class="nc"&gt;.one&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.two&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;color&lt;/span&gt; &lt;span class="err"&gt;changes&lt;/span&gt;
&lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;back-color&lt;/span&gt; &lt;span class="err"&gt;changes&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're using the same code here and just two properties are changing back-color and color. &lt;/p&gt;

&lt;h3&gt;
  
  
  Solutions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.one, .two {
padding: 10px 40px;
margin: 10px;
font-size: 32px;
color: black;
background-color: white;
}

.two{
color: white;
background-color:
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In CSS, when you use a comma between selectors, it allows you to apply the same set of styles to multiple selectors. This grouping of selectors with a comma is a way to apply a common style block to multiple elements without duplicating the styles for each selector. &lt;/p&gt;

&lt;p&gt;I'm a developer who's learning something new every day and sharing his learnings on the dev platform. if you found any wrong code, or typos mistakes I would appreciate it and will fix it ASAP. Let me know in the comments if you find some. &lt;/p&gt;

&lt;p&gt;That's it!&lt;br&gt;
Let's chat on &lt;a href="https://twitter.com/devgancode" rel="noopener noreferrer"&gt;Twitter!&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Support my YouTube channel 👇&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/MHwR4HGZdoE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Enough HTML for Beginners!</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Thu, 01 Feb 2024 09:39:54 +0000</pubDate>
      <link>https://forem.com/devgancode/enough-html-for-beginners-10n4</link>
      <guid>https://forem.com/devgancode/enough-html-for-beginners-10n4</guid>
      <description>&lt;p&gt;Hypertext Markup Language(HTML). The difference between HTML and HTML5 is the latest version of the language with new features, powers, and more positive results nothing fancy. &lt;/p&gt;

&lt;h1&gt;
  
  
  Start with HTML
&lt;/h1&gt;

&lt;p&gt;The below elements that we are going to explore in this article remember no course or guide will teach you the whole programming, the modern way approach is to understand the basics and build and explore. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML Document Format &lt;/li&gt;
&lt;li&gt;Meta tags &lt;/li&gt;
&lt;li&gt;preloading &amp;amp; prefetching &lt;/li&gt;
&lt;li&gt;HTML Tags (Self-closing &amp;amp; open-close tags)&lt;/li&gt;
&lt;li&gt;Semantic HTML &lt;/li&gt;
&lt;li&gt;Forms&lt;/li&gt;
&lt;li&gt;Table &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Document Format
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- meta tags &amp;amp; CSS file goes here --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- The body of HTML element --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line tells the browser this is the HTML document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second line is used for defining the language of the webpage you're building. You can also put another language as well but for best practices, we used en(English) or any one language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meta tags enable superpower to your project when you share something on social media it automatically shows the preview images and ranks your website on top of Google with targeted keywords. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Meta Tags
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Meta Tags --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Personal blog Page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;" This is a personal blog website."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first two meta tags are used to define the title and description of your webpage and charset meta tags are used to support different characters(emojis) and the rest are for device width so on. &lt;br&gt;
Another approach you can use is &lt;a href="https://ogp.me/" rel="noopener noreferrer"&gt;Opengraph Protocol&lt;/a&gt; which is highly recommended. &lt;/p&gt;
&lt;h2&gt;
  
  
  3. Preloading and Prefetching
&lt;/h2&gt;

&lt;p&gt;These two techniques are really powerful and even used in next, React and modern web frameworks to optimize resources. &lt;/p&gt;

&lt;p&gt;Preloading and prefetching are techniques in HTML to optimize the loading of resources, such as images, scripts, stylesheets, and more, to enhance the overall performance and user experience of a web page.&lt;/p&gt;
&lt;h4&gt;
  
  
  Preloading:
&lt;/h4&gt;

&lt;p&gt;Preloading is used to load certain resources in advance, before they are needed by the page, to reduce latency and improve performance.&lt;/p&gt;

&lt;p&gt;Use the  tag with the rel="preload" attribute to specify the resource to be preloaded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"example-image.jpg"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prefetching
&lt;/h4&gt;

&lt;p&gt;Prefetching is used to fetch resources in the background that might be needed for future navigation, improving the loading speed of subsequent pages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"prefetch"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"next-page.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Self-Closing Tags &amp;amp; Paired Tag
&lt;/h4&gt;

&lt;p&gt;In HTML, elements can be classified into two main types: self-closing tags and paired tags (also known as open and close tags).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="c"&gt;&amp;lt;!-- Slef Closing Tags --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;be&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Paired Tags--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;This is inside a div.&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Another paragraph inside the same div.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;These are just basic tags you can explore more tags &lt;a href="https://www.w3schools.com/tags/" rel="noopener noreferrer"&gt;here!&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Semantic HTML
&lt;/h4&gt;

&lt;p&gt;Semantic HTML refers to the use of HTML markup that carries meaning about the structure and content of a web page, making it more descriptive and meaningful both for developers and browsers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Semantic HTML Tags --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;aside&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;figure&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;mark&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;time&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Forms
&lt;/h4&gt;

&lt;p&gt;The forms are an essential part of HTML when it comes to taking input from users for multiple purposes like login, registration, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"demo.php method="&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="c"&gt;&amp;lt;!-- Email Input --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Radio Buttons --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Gender:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"gender"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt; &lt;span class="na"&gt;checked&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"male"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Male&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"gender"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"female"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Female&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We use two methods with form &lt;code&gt;action="demo.php"&lt;/code&gt; and &lt;code&gt;method="get"&lt;/code&gt;. The first action page is executed when the user clicks on the submit button of the form and the data submitted by the user goes to a server that's how the frontend backend communicates in the way. &lt;/p&gt;

&lt;p&gt;The second thing is a method and there are different methods like get, post, and delete depending on the need you can use them. &lt;/p&gt;

&lt;h4&gt;
  
  
  Table
&lt;/h4&gt;

&lt;p&gt;HTML tables are used to display data in rows and columns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Student&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Subject&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Grade&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;John Doe&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Math&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;A&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Jane Smith&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;English&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;B&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The table will show something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri7kqm4w4qbeqssj4cg4.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%2Fri7kqm4w4qbeqssj4cg4.png" alt="Image description" width="408" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cool, right!&lt;br&gt;
This is enough HTML knowledge you need as a beginner but this is not complete HTML. You can explore and learn more about it but this important HTML stuff you know. &lt;/p&gt;

&lt;p&gt;I appreciate it if someone finds something wrong (Code, typos, grammar mistakes) in the article do share it in the comment will correct it.&lt;/p&gt;

&lt;p&gt;Support to my Youtube Channel Here👇&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TN6UxU6MUaw"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>Technical Writer Interview Experience - Devtron</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Sun, 28 Jan 2024 18:25:26 +0000</pubDate>
      <link>https://forem.com/devgancode/technical-writer-interview-experience-devtron-13j8</link>
      <guid>https://forem.com/devgancode/technical-writer-interview-experience-devtron-13j8</guid>
      <description>&lt;p&gt;Hey folks, I hope you all doing amazing. This article is not about any technical stuff like JavaScript, Python, etc. This article focuses on my experience for the Technical writer position applied at &lt;a class="mentioned-user" href="https://dev.to/devtron_inc"&gt;@devtron_inc&lt;/a&gt; company. &lt;/p&gt;

&lt;h1&gt;
  
  
  How It Started ✨
&lt;/h1&gt;

&lt;p&gt;It all started with a Twitter post containing information about hiring a tech writer role at Devtron. I started searching about what is Devtron and what are requirements of the role are. &lt;br&gt;
Then after doing all my research, I found that Devtron is a great opportunity for me to start with because Devtron is a tool or platform that helps you to set up and monitor all devops things.&lt;br&gt;&lt;br&gt;
Like CI/CD pipeline, dockerization, K8s, etc. &lt;br&gt;
Want to explore Devtron? Here's the &lt;a href="https://devtron.ai/" rel="noopener noreferrer"&gt;platform link&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNTJwdHd5OTY1ODk0YXZ6b3RycjB2MDhrbXN6NmE5b2M2N2o1azd6MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2Je4CdnzGOkPESC4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNTJwdHd5OTY1ODk0YXZ6b3RycjB2MDhrbXN6NmE5b2M2N2o1azd6MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2Je4CdnzGOkPESC4/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Interview Process 🎯
&lt;/h1&gt;

&lt;p&gt;There are a total of four rounds there. &lt;/p&gt;
&lt;h3&gt;
  
  
  Round 1 - Telephonic Interview Call ✅
&lt;/h3&gt;

&lt;p&gt;In this round, the HR manager will connect to you over the call to make sure you're good with communication and ask you about your previous work, introduction, roles, and responsibilities to work, and other introductory questions. &lt;/p&gt;
&lt;h3&gt;
  
  
  Round 2 - Writing Assessment ✅
&lt;/h3&gt;

&lt;p&gt;In this round, you have to write and solve MCQs. This round consists of 45 grammar questions and correcting the paragraph sequence(Part 1) and (Second part)you have to write on two topics in 200 words each with 30 mins (15 mins each topic).&lt;/p&gt;
&lt;h3&gt;
  
  
  Round 3
&lt;/h3&gt;

&lt;p&gt;After clearing both rounds there will be a technical round. A senior tech writer will be there to test your technical skills. This interview is 45 minutes long. The interviewer will ask you about &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Version Control System &lt;/li&gt;
&lt;li&gt;Why we need DevOps&lt;/li&gt;
&lt;li&gt;DevOps tools if you know&lt;/li&gt;
&lt;li&gt;Small task (not writing)&lt;/li&gt;
&lt;li&gt;ABout the company (Make sure you have done all your research)&lt;/li&gt;
&lt;li&gt;WHat you know about products &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These all are listed questions that the interviewer asked me while interviewing. Also, make sure you know the role requirements, research the Product, and your ideas to solve the problem. &lt;/p&gt;
&lt;h3&gt;
  
  
  Round 4
&lt;/h3&gt;

&lt;p&gt;This interview is the final with the founder of the company. They will ask you why Devtron, Goals, and personality-oriented questions as well as salary negotiations also done in this round. &lt;/p&gt;
&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;I reached round number 3 (Technical Round) and was not selected for the role. &lt;/p&gt;
&lt;h3&gt;
  
  
  Advise
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;First listen to the question carefully then answer. &lt;/li&gt;
&lt;li&gt;Aware of trends &amp;amp; tools of the market. &lt;/li&gt;
&lt;li&gt;Must Do company research.&lt;/li&gt;
&lt;li&gt;Practice some Docker, VCS, and a bit about the product. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can apply for the role from here. &lt;br&gt;
&lt;a href="https://devtron.ai/careers" rel="noopener noreferrer"&gt;Devtron career&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Support my Youtube Channel👇&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/qbwmXpvSwlQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tap into Global Markets: 5 Open-Source Tools for Localization in 2024</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Fri, 12 Jan 2024 07:26:51 +0000</pubDate>
      <link>https://forem.com/devgancode/capture-global-audience-product-localization-4h45</link>
      <guid>https://forem.com/devgancode/capture-global-audience-product-localization-4h45</guid>
      <description>&lt;p&gt;The world of software development is rapidly growing, and reaching a global audience can be a challenge. Whether you're selling products or offering services, ensuring the best experience for users is crucial. Localization becomes a key ally in connecting users seamlessly with your software.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Localization?
&lt;/h1&gt;

&lt;p&gt;Localization involves translating content from one language to another. The primary goal is to make an app multilingual. Although localization can be challenging, advancements in technology have simplified the process.&lt;/p&gt;

&lt;p&gt;Localization is about adapting your product or service to different languages and cultures to make it more accessible and appealing to a wider audience. Users prefer content in their local language, and implementing this feature through localization is now more accessible than ever.&lt;/p&gt;

&lt;p&gt;Ultimately, localization fosters genuine connections with your global users.&lt;/p&gt;

&lt;h1&gt;
  
  
  Benefits of Localization
&lt;/h1&gt;

&lt;p&gt;Product localization can benefit businesses in several ways.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global Reach&lt;/strong&gt;: Expand your software's accessibility to users worldwide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Market Expansion&lt;/strong&gt;: Enter new markets by adapting your software to local preferences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Increased Adoption&lt;/strong&gt;: Attract more users by removing language barriers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streamlined Communication&lt;/strong&gt;: Facilitate clearer communication between users and your software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved User Satisfaction&lt;/strong&gt;: Make users happier by ensuring the software feels familiar and relevant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strengthen Product trust&lt;/strong&gt;: Show your commitment to local markets and build stronger user relationships.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better market insights:&lt;/strong&gt; Gain valuable data and feedback from localized user interactions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Why Opensource Tools for Localization?
&lt;/h1&gt;

&lt;p&gt;Open-source tools are community-oriented for better discussion on product innovation and improvements. Open-source tools focus on involving the community to discuss and make the product better. This helps with innovation and improvements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost-Effective:&lt;/strong&gt; Eliminate licensing fees and reduce overall localization expenses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; Customize tools to align with your workflows and language requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Manage localization efforts across various initiatives without limitations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community Support:&lt;/strong&gt; Tap into a global network of developers, translators, and localization professionals for assistance and collaboration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fostering Innovation:&lt;/strong&gt; Open-source tools encourage the exploration of new localization approaches and technologies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  5 Open-source Localization Tools to Consider
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://github.com/tolgee/tolgee-platform?tab=readme-ov-file" rel="noopener noreferrer"&gt;Tolgee&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Tolgee is an open-source solution for painless localization. Tolgee provides fast integration to web apps, auto-machine translation, in-context translating, automatic generation of screenshots, and many more features.&lt;/p&gt;

&lt;p&gt;Are you curious to know more about Tolgee? Here's the &lt;a href="https://github.com/orgs/tolgee/repositories" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; to explore.&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%2Ffqereom5o3appe432lf8.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%2Ffqereom5o3appe432lf8.png" alt="Image description" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://github.com/mozilla/pontoon" rel="noopener noreferrer"&gt;&lt;strong&gt;Pontoon&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Pontoon is an open-source translation management system developed by the Mozilla Localization Community. Pontoon provides a web-based interface for software localization to the users. The translations are stored in the Version Control System (Git etc.) to ensure accuracy.&lt;/p&gt;

&lt;p&gt;Pontoon provides a context suggestion feature to help efficient localization. Its community-oriented platform, allows people to contribute to their project for improvements.&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="https://github.com/mozilla/pontoon" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; to explore.&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%2Fi0kuxlh4fd0osnggvzmm.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%2Fi0kuxlh4fd0osnggvzmm.png" alt="Image description" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3.&lt;/strong&gt; &lt;a href="https://weblate.org/en/hosting/" rel="noopener noreferrer"&gt;&lt;strong&gt;Weblate&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Weblate is an open-source, web-based platform for localization that manages the entire process and it's used by over 2,000+ projects.&lt;/p&gt;

&lt;p&gt;Weblate offers several features to make the localization process easier, faster, and collaborative. It supports various file formats like websites, strings, content, and code. Weblate provides descriptive analytics on localized projects that can help various areas to improve.&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="https://github.com/WeblateOrg/weblate" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; to explore.&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%2Fugwo2j2c7kseshj8d564.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%2Fugwo2j2c7kseshj8d564.png" alt="Image description" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="https://glebm.github.io/i18n-tasks/" rel="noopener noreferrer"&gt;i18n-Tasks&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;i18n-Tasks is an open-source solution for software localization. The problem with efficient translation is solved by the i18n-Tasks which offers more efficient translation. i18n-Tasks able to manage numerous translation files and simplify the process.&lt;/p&gt;

&lt;p&gt;It supports several file formats for localization. i18n-Tasks produces high-quality translations for the user and is error-free, clear, and professional. The i18n-Tasks automates the repetitive tasks to work on other business strategies.&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="https://github.com/glebm/i18n-tasks" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; to explore.&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%2Fxoq7ab1cbe3w2f9io8ou.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%2Fxoq7ab1cbe3w2f9io8ou.png" alt="Image description" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;a href="https://traduora.co/" rel="noopener noreferrer"&gt;Traduora&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Traduora is an open-source translation management platform. Traduora supports modern automated localization workflow for translation. Traduora offers import and export translation features, auto-translation of the project, and updates.&lt;/p&gt;

&lt;p&gt;Traduora allows you to work with the team in a collaborative space once you set up your project. It controls and customizes the entire localization process from API access to workflow.&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="https://github.com/ever-co/ever-traduora" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; to explore.&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%2F893ftngajgrzhvzmo5us.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%2F893ftngajgrzhvzmo5us.png" alt="Image description" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Wrap up&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;In a world going digital, language shouldn't be a barrier. These five open-source localization tools empower you to reach global audiences on a budget. In 2024, break down those barriers and deliver exceptional user experiences for everyone.&lt;/p&gt;

&lt;p&gt;So, choose your open-source localization tool and start your journey!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>FrontEnd in Depth</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Fri, 20 Oct 2023 05:31:35 +0000</pubDate>
      <link>https://forem.com/devgancode/frontend-in-depth-28jh</link>
      <guid>https://forem.com/devgancode/frontend-in-depth-28jh</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Hey Everyone, Welcome to the new article of the "DEEP DIVE SERIES" where we're focusing on going in-depth to learn a particular technology. The first article has already been published on the platform and here's the link to the article &lt;a href="https://devgancode.hashnode.dev/deep-dive-into-web-development" rel="noopener noreferrer"&gt;"Deep Dive Into Web Development"&lt;/a&gt; Visit and spread love to the community.&lt;/p&gt;

&lt;p&gt;There are multiple videos and articles out there about the JavaScript roadmap. In this tutorial, we are exploring JS topics in detail. Web development is a vast field every  week you'll see new frameworks coming out and you have to learn that but the fundamentals are the same which is JavaScript.&lt;/p&gt;

&lt;h1&gt;
  
  
  Basic Fundamentals
&lt;/h1&gt;

&lt;p&gt;The key to a good software engineer or full-stack developer is to know the fundamentals well. The better clarity you have on the fundamentals the easier you solve the problem.&lt;/p&gt;

&lt;p&gt;| Programming by definition is problem-solving.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Operators&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loops&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conditional Statements (if, else, nested if-else)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arrays&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document Object Model&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the fundamentals of JavaScript and there are lot to learn in the above-listed topics. Operators (Arithmetic, Comparison, Conditional, Assignment, Bitwise) etc. DOM(Changing HTML elements, Creating new elements, Action Listeners, Events), etc.&lt;/p&gt;

&lt;h1&gt;
  
  
  Advanced Topics
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ES6+ Concepts (const, let, map, set, arrow func, Promises, Array Methods)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Closures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event Loop&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;V8 Engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call Stack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prototypes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSON API format&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import Export Module&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the most key topics you have to learn as a JavaScript Developer and the interviewer expects you to know these concepts. Learning is not enough proof is important to showcase your ability to work for that you have to build projects along with learning.&lt;/p&gt;

&lt;p&gt;| Confidence comes from doing one thing again and again.&lt;/p&gt;

&lt;h1&gt;
  
  
  Data Structures &amp;amp; Objects
&lt;/h1&gt;

&lt;p&gt;The essential concept of programming as a developer is Data Structures. The arrays, objects, maps, sets, etc are part of DSA in JavaScript.&lt;/p&gt;

&lt;p&gt;| This section is for people who want to build a career in JavaScript.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Arrays&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;String&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Destructing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mutability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High Order Functions (Filter, Map, Reduce, Find)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  OOPs in JavaScript
&lt;/h1&gt;

&lt;p&gt;Object-oriented programming is a must for every developer whether you're a frontend or backend developer you should know the four pillars of OOP's. The JavaScript OOP's topics include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Classes and new keyword&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;this keyword&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method and Properties&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Polymorphism&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abstraction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encapsulation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inheritance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getters, Setters&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this tutorial, we cover Basic JavaScript, Advanced topics, DSA, and OOP concepts. These are a complete guide for anyone who wants to explore JavaScript in depth. We are not done here JavaScript is vast you have to learn continuously.&lt;/p&gt;

&lt;p&gt;| JavaScript Developers are lifetime students.&lt;/p&gt;

&lt;p&gt;Want to connect, Let's chat on &lt;a href="https://twitter.com/devgancode" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recent Articles 👇
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devgancode.hashnode.dev/deep-dive-into-web-development" rel="noopener noreferrer"&gt;Deep Dive into Web Development&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devgancode.hashnode.dev/a-complete-guide-to-hackthebox" rel="noopener noreferrer"&gt;Linux for Beginners&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devgancode.hashnode.dev/a-complete-guide-to-make-money-as-a-technical-writer" rel="noopener noreferrer"&gt;How to Make Money as a Technical Writer&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devgancode.hashnode.dev/lets-talk-about-devrel" rel="noopener noreferrer"&gt;What is a Developer Relationship&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devgancode.hashnode.dev/how-to-master-the-art-of-content-creation-as-a-developer" rel="noopener noreferrer"&gt;How to Master the Art of Content Creation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Support My YouTube work here 👇&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/52biDlBTrhQ?start=401"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Deep Dive Into Web Development</title>
      <dc:creator>Ganesh Patil</dc:creator>
      <pubDate>Fri, 15 Sep 2023 11:22:28 +0000</pubDate>
      <link>https://forem.com/devgancode/deep-dive-into-web-development-4297</link>
      <guid>https://forem.com/devgancode/deep-dive-into-web-development-4297</guid>
      <description>&lt;p&gt;Learn What Matters&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Hey Everyone, I starting with web development where we are going to deep dive into frontend development part one. The second part will focus on the backend area in the next article. We are focusing on concepts that actually matter.&lt;/p&gt;

&lt;p&gt;Full stack development is the best path you can follow to get a job in tech because of the availability of content and ease to learn. JavaScript is everywhere from the front end to the back end you can't ignore JS. We are going to start with the basic foundations of web development.&lt;/p&gt;

&lt;h1&gt;
  
  
  HTML
&lt;/h1&gt;

&lt;p&gt;Hyper-Text Markup Language (HTML) is not limited to the structuring web page. HTML5 is more powerful right now in terms of SEO. There are a lot of things introduced in HTML5 for better results.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic HTML5 (SEO Focus Tags)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Navbar

2. Article

3. Strong (Bold)

4. em (Italic)

5. Mark

6. Header

7. Article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ogp.me/" rel="noopener noreferrer"&gt;Open Graph Protocol&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web Components&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preloading &amp;amp; Prefetching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forms &amp;amp; Data Validations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above topics may be completely new for you all or maybe not but it's better to know what exists out there. Open Graph protocol is highly important for anyone who wants to learn web development in depth.&lt;/p&gt;

&lt;h1&gt;
  
  
  CSS
&lt;/h1&gt;

&lt;p&gt;The latest CSS3 is a complete game changer. You can do everything with it Animations, Responsiveness &amp;amp; everything without any third-party library. Also, one thing you have to keep in mind CSS is a long journey you can't master it without practice so don't fall into a loop of learning everything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Box Model&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Layouts(FlexBox, Grid Layout, Float)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Units (%, px, em, rem, vh, wh)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Calc functions &amp;amp; CSS variables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Responsive Web Development (Media Queries)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Animations (Keyframe, Transform)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS preprocessor(SAAS, LESS, PostCSS)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CSS3 is incredible and the only thing you have to do is project building. Learn Advance  &lt;a href="https://codedamn.com/referred-by/ganeshpatil1010" rel="noopener noreferrer"&gt;HTML &amp;amp; CSS&lt;/a&gt; for free.&lt;/p&gt;

&lt;h1&gt;
  
  
  JavaScript
&lt;/h1&gt;

&lt;p&gt;JavaScript is the key. Web development is really easy if you have a good command of JS. React, Next, TypeScript, Node, and all other advance frameworks and libraries build top on JavaScript. There is no perfect roadmap to master JS but required topic you can learn as follows :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Basic Fundamentals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ES6+ Syntax&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Template Literals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functions (Regular + Arrow)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Array Methods (map, sort, filter, forEach )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shorthand object Property&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Destructuring&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fetch API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Async/Await Syntax&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import and Export&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Webpack and Babel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Closures, Callbacks &amp;amp; Prototypes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  React
&lt;/h1&gt;

&lt;p&gt;React is a JavaScript library that provides a fast &amp;amp; Scalable approach for better results in web development. Components reusability, Hooks, and components are core features of react.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;File &amp;amp; Folder Structure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Components&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSX (&lt;strong&gt;JavaScript XML&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Props &amp;amp; Hooks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State &amp;amp; Events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conditional rendering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React Ecosystem&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the required concepts you should know as a front-end developer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a Developer Never Stop Learning...!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Git &amp;amp; GitHub
&lt;/h1&gt;

&lt;p&gt;Version control systems are highly recommended to learn as a developer. Git (CLI System) &amp;amp; GitHub(Web Platform) are popular ones but both are different. The version control system helps you track your code and every change you made in your code.&lt;/p&gt;

&lt;p&gt;There are multiple options are available such as Bitbucket &amp;amp; CMVC and many more. Learn &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control" rel="noopener noreferrer"&gt;Complete Version Control System&lt;/a&gt; for free.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Git Basics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git Branching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git on the Server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Distributed Git&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git Tools&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Testing Applications
&lt;/h1&gt;

&lt;p&gt;Testing is required because as a developer you should be able to test &amp;amp; improve the performance of your applications. Jest is an open-source javascript testing framework. There are different platforms that help you to test your web apps but Jest is better to learn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/8-simple-steps-to-start-testing-react-apps-using-react-testing-library-and-jest/" rel="noopener noreferrer"&gt;How to Start Testing Your React Apps Using the React Testing Library and Jest&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What Next?
&lt;/h1&gt;

&lt;p&gt;This is the complete guide on frontend development and the next article will be a guide on Backend Development. Everyone has their own path to learn web development but here I shared the common suitable way for everyone.&lt;/p&gt;

&lt;p&gt;Stay tuned for the next article. 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codedamn.com/referred-by/ganeshpatil1010" rel="noopener noreferrer"&gt;Learn with well-structured roadmaps.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Hey Everyone, I'm Ganesh Computer Science student from India. I shared everything about tech. Creating content to document my journey with articles, videos (Youtube), and short content. Connect with me on &lt;a href="https://twitter.com/ganeshstwt" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I create video content on youtube support here 👇&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/52biDlBTrhQ?start=47"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>css</category>
    </item>
  </channel>
</rss>
