<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sharjeel Yunus</title>
    <description>The latest articles on DEV Community by Sharjeel Yunus (@sharjeelyunus).</description>
    <link>https://dev.to/sharjeelyunus</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%2F485017%2F56e31f18-5f6c-408f-b9f0-1ae1963b2d04.jpg</url>
      <title>DEV Community: Sharjeel Yunus</title>
      <link>https://dev.to/sharjeelyunus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharjeelyunus"/>
    <language>en</language>
    <item>
      <title>Implementing Stripe in Ensemble: A Technical Deep Dive</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Mon, 18 Aug 2025 17:04:56 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/implementing-stripe-in-ensemble-a-technical-deep-dive-3cb7</link>
      <guid>https://dev.to/sharjeelyunus/implementing-stripe-in-ensemble-a-technical-deep-dive-3cb7</guid>
      <description>&lt;p&gt;Integrating subscriptions with Stripe is one of those tasks that looks straightforward on paper but quickly becomes complex in practice. Between ephemeral keys, client secrets, webhooks, and subscription lifecycles, it’s easy to get lost.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through the technical design of how Ensemble integrates Stripe for mobile apps, why we chose a frontend-only abstraction, and how you can set up a backend to complete the flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ The Design Philosophy
&lt;/h2&gt;

&lt;p&gt;Ensemble is a low-code platform, but we made an intentional design decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend logic (initialize Stripe, show Payment Sheet) is built in.&lt;/li&gt;
&lt;li&gt;Backend logic (create Payment Intents, manage subscriptions, handle webhooks) is left to the developer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Because billing systems vary wildly. Some apps require a single plan, while others necessitate multi-tier pricing, trials, discounts, or usage-based billing. Offloading this to developers’ backends gives flexibility without locking you in.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 The Flow
&lt;/h2&gt;

&lt;p&gt;Here’s how the Stripe integration works in Ensemble:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User taps Subscribe in your app.&lt;/li&gt;
&lt;li&gt;Ensemble initializes Stripe with your publishable key.&lt;/li&gt;
&lt;li&gt;Your backend creates a Payment Intent and returns a clientSecret.&lt;/li&gt;
&lt;li&gt;Ensemble presents the Payment Sheet with that &lt;code&gt;clientSecret&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stripe processes the payment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your backend listens to webhooks to update subscription state.&lt;/p&gt;

&lt;h2&gt;
  
  
  📐 Architecture Diagram
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  📝 Ensemble Config Example
&lt;/h2&gt;

&lt;p&gt;First, initialize Stripe:&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;Button&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Initialize Stripe&lt;/span&gt;
  &lt;span class="na"&gt;onTap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;initializeStripe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;publishableKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pk_test_your_publishable_key_here"&lt;/span&gt;
      &lt;span class="na"&gt;merchantIdentifier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;merchant.com.yourapp"&lt;/span&gt;
      &lt;span class="na"&gt;onSuccess&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;showToast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stripe&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;initialized&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;successfully"&lt;/span&gt;
      &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;showToast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;initialize&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Stripe"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, show the Payment Sheet using the &lt;code&gt;clientSecret&lt;/code&gt; from your backend:&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;initializeStripe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publishableKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pk_test_your_publishable_key_here"&lt;/span&gt;
  &lt;span class="na"&gt;merchantIdentifier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;merchant.com.yourapp"&lt;/span&gt;
  &lt;span class="na"&gt;onSuccess&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;showPaymentSheet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${paymentIntentClientSecret}&lt;/span&gt;
      &lt;span class="na"&gt;configuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;merchantDisplayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Store"&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system"&lt;/span&gt;
        &lt;span class="na"&gt;primaryButtonLabel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pay&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$29.99"&lt;/span&gt;
      &lt;span class="na"&gt;onSuccess&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;showToast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;successful!"&lt;/span&gt;
      &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;showToast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;failed"&lt;/span&gt;
  &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;showToast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;initialize&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;system"&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  🖥 Backend Implementation (Node.js Example)
&lt;/h2&gt;

&lt;p&gt;Your backend needs to create a Payment Intent and return the &lt;code&gt;clientSecret&lt;/code&gt;. Here’s a minimal Express setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Stripe&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stripe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sk_test_your_secret_key_here&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/create-payment-intent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;paymentIntent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paymentIntents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// $29.99&lt;/span&gt;
      &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;automatic_payment_methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;paymentIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client_secret&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 4242&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧩 Webhooks: The Source of Truth
&lt;/h2&gt;

&lt;p&gt;One of the most important design lessons: don’t rely solely on the client for subscription state.&lt;/p&gt;

&lt;p&gt;Stripe webhooks tell you when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A payment succeeds or fails.&lt;/li&gt;
&lt;li&gt;A subscription renews or cancels.&lt;/li&gt;
&lt;li&gt;A trial starts or ends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means your backend should update your database on every webhook event and expose that state back to your app. Ensemble can then reflect the user’s status (trial, active, canceled).&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Lessons Learned
&lt;/h2&gt;

&lt;p&gt;While building and testing this integration, here are a few takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral keys are tricky:&lt;/strong&gt; They expire quickly, so your backend must issue fresh client secrets reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing saves time:&lt;/strong&gt; The Stripe CLI is a must-have for simulating webhook events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful error handling matters:&lt;/strong&gt; Expired cards, failed renewals, and canceled subscriptions are real-world cases you need to handle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of concerns:&lt;/strong&gt; Keeping the frontend in Ensemble and backend in your stack of choice made the integration more flexible and maintainable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Stripe subscription management isn’t easy, but with Ensemble, the frontend flow becomes dead simple: initialize Stripe and show the Payment Sheet.&lt;/p&gt;

&lt;p&gt;The complexity shifts to your backend, where you create Payment Intents and manage subscription state via webhooks. This design provides developers with flexibility while eliminating 80% of the boilerplate typically required to integrate Stripe.&lt;/p&gt;

&lt;p&gt;If you’re building a subscription-based app, I’d love to hear how you’re handling Stripe integration — drop your thoughts in the comments!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Thu, 27 Feb 2025 21:43:43 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/-1554</link>
      <guid>https://dev.to/sharjeelyunus/-1554</guid>
      <description></description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Understanding Localhost: What Happens When You Type It?</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Wed, 26 Feb 2025 17:30:21 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/understanding-localhost-what-happens-when-you-type-it-3h33</link>
      <guid>https://dev.to/sharjeelyunus/understanding-localhost-what-happens-when-you-type-it-3h33</guid>
      <description>&lt;p&gt;Whether you’re a frontend developer spinning up a React app or a backend engineer debugging an API, localhost is where your journey begins. Type &lt;code&gt;npm run dev&lt;/code&gt;, and your browser opens &lt;code&gt;http://localhost:3000&lt;/code&gt;. But what &lt;em&gt;actually&lt;/em&gt; happens when you type "localhost"? Let’s peel back the layers of this networking cornerstone.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is Localhost?
&lt;/h3&gt;

&lt;p&gt;Localhost isn’t just tech jargon—it’s a reserved domain name that always points back to your own machine. Think of it as your computer’s self-address. When John types &lt;code&gt;localhost&lt;/code&gt; on his laptop and Jane does the same on her desktop, they’re each accessing their own devices, with zero overlap.&lt;/p&gt;




&lt;h3&gt;
  
  
  How Localhost Works: DNS vs. Loopback
&lt;/h3&gt;

&lt;p&gt;To understand localhost, let’s contrast it with a typical web request:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Typing "google.com"&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your browser queries DNS servers to resolve the domain to an IP (e.g., &lt;code&gt;142.250.189.206&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;The request routes through the internet to Google’s servers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Typing "localhost"&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No DNS involved!&lt;/strong&gt; Your OS immediately maps &lt;code&gt;localhost&lt;/code&gt; to the loopback IP &lt;code&gt;127.0.0.1&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;The request never leaves your machine. Instead, it’s processed internally via the &lt;strong&gt;loopback interface&lt;/strong&gt;, a virtual network card for self-communication.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;127.0.0.1: The Loopback Address Explained&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The loopback address (&lt;code&gt;127.0.0.1&lt;/code&gt;) is a special IP reserved for self-referential traffic. When your app listens on &lt;code&gt;127.0.0.1:3000&lt;/code&gt;, it’s saying, “I’ll only accept requests from this machine.”  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Where is Localhost Defined?&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux/macOS&lt;/strong&gt;: &lt;code&gt;/etc/hosts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This file contains the line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1    localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This hardcodes the mapping, overriding DNS. Fun fact: The entire &lt;code&gt;127.x.x.x&lt;/code&gt; range is reserved for loopback, but &lt;code&gt;127.0.0.1&lt;/code&gt; is the standard.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Why Port 3000? Default Ports in Development&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you run &lt;code&gt;npm run dev&lt;/code&gt;, tools like React or Next.js default to port 3000. Other common defaults:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js/Express&lt;/strong&gt;: 3000, 8000
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python/Flask&lt;/strong&gt;: 5000
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ruby on Rails&lt;/strong&gt;: 3000
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache/Nginx&lt;/strong&gt;: 80 (HTTP) or 443 (HTTPS)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Port conflicts? Use &lt;code&gt;lsof -i :3000&lt;/code&gt; (Unix) or &lt;code&gt;netstat -ano | findstr :3000&lt;/code&gt; (Windows) to identify and kill blocking processes.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Modifying the Hosts File: Proceed with Caution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can map custom domains to &lt;code&gt;127.0.0.1&lt;/code&gt; for local testing. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1    mytestsite.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;mytestsite.dev&lt;/code&gt; resolves to your machine. &lt;strong&gt;But beware&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editing the hosts file requires admin privileges.
&lt;/li&gt;
&lt;li&gt;Typos can break network functionality. Always back up the file first!
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;IPv4 vs. IPv6: Localhost’s Dual Identity&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IPv4&lt;/strong&gt;: &lt;code&gt;127.0.0.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPv6&lt;/strong&gt;: &lt;code&gt;::1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run &lt;code&gt;ping localhost&lt;/code&gt; to see which your system prefers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# IPv4 response&lt;/span&gt;
64 bytes from 127.0.0.1: &lt;span class="nv"&gt;icmp_seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;64 &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.045 ms

&lt;span class="c"&gt;# IPv6 response&lt;/span&gt;
64 bytes from ::1: &lt;span class="nv"&gt;icmp_seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;64 &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.045 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most frameworks default to IPv4. To support both, configure your server to listen on &lt;code&gt;0.0.0.0&lt;/code&gt; (IPv4) or &lt;code&gt;::&lt;/code&gt; (IPv6).  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Why Localhost Matters for Developers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offline Development&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Test apps without internet—crucial for debugging in restricted environments (e.g., airplanes, remote areas).  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safely test authentication flows (OAuth redirects to &lt;code&gt;localhost&lt;/code&gt; avoid exposing tokens online).
&lt;/li&gt;
&lt;li&gt;Database connections via &lt;code&gt;127.0.0.1&lt;/code&gt; stay isolated from external networks.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bypass network latency. Benchmark API performance locally without noise.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Localhost traffic never touches your physical network card, making it immune to eavesdropping.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Localhost in Code: Language Examples&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 127.0.0.1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LocalhostDemo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Use getByName("localhost") to force loopback resolution&lt;/span&gt;
        &lt;span class="nc"&gt;InetAddress&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InetAddress&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getByName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHostAddress&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;  &lt;span class="c1"&gt;// Output: 127.0.0.1&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;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dns&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;dns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 127.0.0.1 or ::1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Public vs. Private vs. Loopback IPs&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Globally routable (assigned by ISP).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Local network use (NAT-enabled).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loopback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal machine communication.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Common Pitfalls &amp;amp; Fixes&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Port Already in Use”&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unix&lt;/strong&gt;: &lt;code&gt;kill -9 $(lsof -ti:3000)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;taskkill /F /PID &amp;lt;process_id&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Isolation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Containers have isolated networks. Access the host’s localhost via:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;host.docker.internal&lt;/code&gt; (Docker Desktop)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--network="host"&lt;/code&gt; flag (Linux)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Firewalls Blocking Requests&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ensure localhost is whitelisted in firewall settings.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Beyond Localhost: Sharing Your Work&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tools like &lt;strong&gt;ngrok&lt;/strong&gt; or &lt;strong&gt;localhost.run&lt;/strong&gt; expose localhost to the internet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 3000  &lt;span class="c"&gt;# Creates a public URL (e.g., https://abc123.ngrok.io)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ideal for testing webhooks, sharing demos, or debugging on mobile devices.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next time you load &lt;code&gt;localhost:3000&lt;/code&gt;, remember:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your OS maps &lt;code&gt;localhost&lt;/code&gt; to &lt;code&gt;127.0.0.1&lt;/code&gt;, skipping DNS.
&lt;/li&gt;
&lt;li&gt;The loopback interface keeps traffic internal.
&lt;/li&gt;
&lt;li&gt;Your local server (React, Flask, etc.) handles the request.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From debugging to deploying, localhost is the unsung hero of development. Ready to level up? Dive into HTTPS configuration for localhost or explore Docker’s networking models.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you use localhost in your workflow? Share your tips below!&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Enhancing the Map Widget in Ensemble: Introducing Fixed &amp; Draggable Markers 🚀</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Sat, 22 Feb 2025 18:35:53 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/enhancing-the-map-widget-in-ensemble-introducing-fixed-draggable-markers-1a1h</link>
      <guid>https://dev.to/sharjeelyunus/enhancing-the-map-widget-in-ensemble-introducing-fixed-draggable-markers-1a1h</guid>
      <description>&lt;p&gt;At &lt;strong&gt;Ensemble&lt;/strong&gt;, we’re constantly looking for ways to enhance &lt;strong&gt;developer experience&lt;/strong&gt; by making our low-code/no-code framework more intuitive and powerful. Recently, I worked on upgrading our &lt;strong&gt;Map Widget&lt;/strong&gt; to introduce two powerful new features that simplify the location selection and marker interactions:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;&lt;code&gt;fixedMarker&lt;/code&gt;&lt;/strong&gt;: Pins a marker at the map’s center, letting users navigate the map beneath it.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;&lt;code&gt;draggableMarker&lt;/code&gt;&lt;/strong&gt;: Empowers users to drag and reposition markers freely.  &lt;/p&gt;

&lt;p&gt;These features address critical user needs while boosting flexibility. Let’s dive into &lt;strong&gt;why we built them&lt;/strong&gt;, &lt;strong&gt;how they work under the hood&lt;/strong&gt;, and &lt;strong&gt;how you can leverage them&lt;/strong&gt; in your apps.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 Why We Built These Features
&lt;/h2&gt;

&lt;p&gt;Previously, our Map Widget’s markers were &lt;strong&gt;static&lt;/strong&gt;, forcing users to jump through hoops to adjust locations. Here’s what drove our update:&lt;/p&gt;
&lt;h3&gt;
  
  
  1️⃣ Simplifying Precise Location Selection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: Apps like delivery services or property listings require pinpoint accuracy. Moving static markers was cumbersome.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: &lt;code&gt;fixedMarker&lt;/code&gt; keeps the marker centered while users pan the map, making location selection seamless.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2️⃣ Enabling Manual Marker Placement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: Use cases like marking custom meeting points needed manual drag-and-drop flexibility.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: &lt;code&gt;draggableMarker&lt;/code&gt; lets users reposition markers intuitively with a simple drag.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🚀 Under the Hood: Implementing the Features
&lt;/h2&gt;
&lt;h3&gt;
  
  
  📍 &lt;code&gt;fixedMarker&lt;/code&gt;: Always Center Stage
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Step 1: Centralizing Marker Data
&lt;/h4&gt;

&lt;p&gt;We created a unified class to manage the marker’s position and icon, ensuring consistency and reducing rendering overhead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FixedMarker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;LatLng&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;BitmapDescriptor&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;FixedMarker&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Initialize with a default position&lt;/span&gt;
&lt;span class="n"&gt;FixedMarker&lt;/span&gt; &lt;span class="n"&gt;_fixedMarker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FixedMarker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;position:&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultCameraLatLng&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Optimizing Position Updates
&lt;/h4&gt;

&lt;p&gt;By updating the marker’s position only when it changes (and debouncing map movements), we eliminated flickering and improved performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;_onCameraMove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CameraPosition&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCameraMove&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_cameraMoveDebouncer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;LatLngBounds&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
          &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;future&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVisibleRegion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;_executeCameraMoveAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCameraMove&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Only update the position if it's different&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fixedMarker&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
      &lt;span class="n"&gt;_fixedMarker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;_fixedMarker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🖱️ &lt;code&gt;draggableMarker&lt;/code&gt;: Freedom to Drag and Drop
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Enabling Marker Drag
&lt;/h4&gt;

&lt;p&gt;We added a flag to toggle drag functionality and linked it to an event handler that updates the marker’s stored position after movement. The marker’s new position is persisted in real-time, allowing seamless integration with other app components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;markerPayload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Marker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;markerId:&lt;/span&gt; &lt;span class="n"&gt;markerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;position:&lt;/span&gt; &lt;span class="n"&gt;markerPayload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;latLng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;icon:&lt;/span&gt; &lt;span class="n"&gt;markerAsset&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;BitmapDescriptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultMarker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;draggable:&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draggableMarker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Enables dragging&lt;/span&gt;
  &lt;span class="nl"&gt;consumeTapEvents:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;onDrag:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latLng&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_moveCamera&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latLng&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Update position on drag&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nl"&gt;onTap:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_selectMarker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;markerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ How to Use These Features in Your Ensemble App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enable &lt;code&gt;fixedMarker&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Keep the marker centered while panning by setting &lt;code&gt;fixedMarker: true&lt;/code&gt; in your Map configuration.&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;Map&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fixedMarker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable &lt;code&gt;draggableMarker&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Allow users to drag markers freely with &lt;code&gt;draggableMarker: true&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;Map&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;draggableMarker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Combine Both for Ultimate Flexibility
&lt;/h3&gt;

&lt;p&gt;Enable both flags to let users start with a centered marker that becomes draggable on demand.&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;Map&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fixedMarker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;draggableMarker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 &lt;strong&gt;Ready to Try It Yourself?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Explore these features in &lt;strong&gt;Ensemble Studio&lt;/strong&gt; or dive deeper into our documentation:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ensembleui.com/" rel="noopener noreferrer"&gt;Ensemble&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ensembleui.com/widgets/Map" rel="noopener noreferrer"&gt;Map Widget Documentation&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔑 Lessons Learned
&lt;/h2&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Debounce Strategically&lt;/strong&gt;: Throttling camera move events reduced redundant state updates.&lt;br&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Optimize Marker Caching&lt;/strong&gt;: Centralizing marker data streamlined state management.&lt;br&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Prioritize Developer Control&lt;/strong&gt;: Clear configuration flags let developers tailor interactions to their app’s needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌟 What’s Next?
&lt;/h2&gt;

&lt;p&gt;We’re just getting started! What features would &lt;strong&gt;you&lt;/strong&gt; like to see in the Map Widget?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live location tracking&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable gesture controls&lt;/strong&gt;?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us know in the comments below! 💬  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Happy building!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ensemble</category>
      <category>googlemaps</category>
      <category>lowcode</category>
      <category>flutter</category>
    </item>
    <item>
      <title>Goodbye Create React App</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Mon, 20 Mar 2023 00:09:38 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/goodbye-create-react-app-ncd</link>
      <guid>https://dev.to/sharjeelyunus/goodbye-create-react-app-ncd</guid>
      <description>&lt;p&gt;React is a popular JavaScript library that helps you build user interfaces for websites and apps. When starting a new project with React, you may wonder if you should use a framework or not. React just released its new documentation &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React Docs&lt;/a&gt; and the creators of React recommend using a framework, and in this article, we'll see why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Framework
&lt;/h3&gt;

&lt;p&gt;Frameworks are pre-built sets of tools and features that can help you build websites and apps faster and more efficiently. They provide features like routing (helping you move between different parts of your site or app), data fetching (helping you get data from a server), and generating HTML (helping your site or app load faster).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;While you can use React without a framework, building a project fully with React can lead to problems as your project grows. As you add more features, your JavaScript code can become larger, leading to slower load times. You may also need to figure out how to split code for every route individually or encounter server-client network waterfalls that make your app feel very slow. This is why Svelte has SvelteKit, Vue has Nuxt, and other frameworks exist to solve these problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;React frameworks solve these problems by default, with no extra work from your side. They let you start with a lean codebase and scale your app with your needs. Each React framework has a community, so finding answers to questions and upgrading tooling is easier. Frameworks also give structure to your code, helping you and others retain context and skills between different projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if I still want to use CRA?
&lt;/h3&gt;

&lt;p&gt;If you have unusual constraints that aren't served well by existing frameworks or you simply prefer to create your own custom setup, you can still use React without a framework. You can grab &lt;code&gt;react&lt;/code&gt; and &lt;code&gt;react-dom&lt;/code&gt; from npm, set up your custom build process with a bundler like &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; or &lt;a href="https://parceljs.org/" rel="noopener noreferrer"&gt;Parcel&lt;/a&gt;, and add other tools as you need them for routing, static generation or server-side rendering, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclution
&lt;/h3&gt;

&lt;p&gt;In summary, while it's possible to use React without a framework, the creators of React recommend using a framework to solve common problems and make building your app or website faster and more efficient. Its time to say Goodbye to &lt;code&gt;create-react-app&lt;/code&gt; and start using Production-grade React frameworks like Next.js, Remix, Gatsby or Expo (for native apps).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>React 18 release candidate mode is finally here!!</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Wed, 09 Mar 2022 23:12:37 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/react-18-release-candidate-mode-is-finally-here-3dl6</link>
      <guid>https://dev.to/sharjeelyunus/react-18-release-candidate-mode-is-finally-here-3dl6</guid>
      <description>&lt;p&gt;React is an open-source JavaScript UI library designed by Facebook, it has gained a lot of popularity in the front-end developer community.&lt;/p&gt;

&lt;p&gt;React has finally released React 18 in Release Candidate mode and has some exciting features and updates for the React.js development community. That means it is now officially stable in a way and there will not be lot more changes or lot more things added to react 18.&lt;/p&gt;

&lt;p&gt;So now React 18 is in release candidate mode you can go ahead and now install &lt;code&gt;npm install react@rc&lt;/code&gt; it will install a release candidate version for you.&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%2Frk5gxr1rc679g5r62x90.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%2Frk5gxr1rc679g5r62x90.png" alt="Installation" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's look at what is new in React and what you can expect!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Concurrent Rendering
&lt;/h3&gt;

&lt;p&gt;So the biggest thing obviously which react 18 brings is concurrent rendering and this had been renamed from concurrent mode to concurrent rendering so that you know there's not a breaking versus a non-breaking mode in react now this is just concurrent rendering where react would try to render stuff concurrently whenever you're using ReactDOM.createRoot instead of ReadDOM.render&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%2Fwcgn5chp01xveyorlzcf.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%2Fwcgn5chp01xveyorlzcf.png" alt="createRoot" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Server Rendering APIs
&lt;/h3&gt;

&lt;p&gt;Earlier from a server-side you could have streamed the response to the client and that would have worked but it did not support the concurrent rendering and suspense very properly. So react 18 also adds support for a new couple of functions which properly streams not only the response but also with the ability to hold data for suspense and whenever that arrives it can stream the rest of the stuff.&lt;br&gt;
So again this is required for things like React Server Components might use and might benefit from this new streaming API.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Automatic Batching
&lt;/h3&gt;

&lt;p&gt;React 18 also brings in support for batching the state updates. Batching is when React groups multiple state updates into a single re-render for better performance. Earlier react also used to batch state updates for example if setA(5) and setB(7) where setA and setB are two state variables and of course it will batch them together nut there were certain conditions where react would not batch them for example in setTimeout. So, that is now fixed or in a way improved in react 18.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Before React 18 only React events were batched

function handleClick() {
  setCount(c =&amp;gt; c + 1);
  setFlag(f =&amp;gt; !f);
  // React will only re-render once at the end (that's batching!)
}

setTimeout(() =&amp;gt; {
  setCount(c =&amp;gt; c + 1);
  setFlag(f =&amp;gt; !f);
  // React will render twice, once for each state update (no batching)
}, 1000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. useId
&lt;/h3&gt;

&lt;p&gt;There is a new Hook useId which actually gives you a deterministic and stable unique identifier both on client and server.&lt;br&gt;
So what happens when your server delivers some react server-side rendered document to the client, of course, that is delivered as an HTML file but you still have to rehydrate that with JS, so this rehydration process sometimes results in a mismatch between what JavaScript expects on the client versus what has been sent from the server and usually that is in cases of keys or stuff which is client-specific and so on.&lt;br&gt;
SO userId is a new hook that allows you to create deterministic keys or deterministic values on server and client both and it's useful in fact it's important in React 18 because of how concurrent rendering works and how things will arrive out of order on the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Dropping support for Internet Explorer
&lt;/h3&gt;

&lt;p&gt;React is now dropping its support for internet explorer completely. Now internet explorer has arrived at its end of life. React 18 cannot support it because of these concurrent rendering and interesting features which requires things like micro task queues for scheduling and interrupting the main thread allowing the user input to interrupt the main thread when react is working so all of those things are very hard to bring support to internet explorer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;So, these were the top 5 changes react 18 is bringing. React 18 is still in release candidate mode now so you can install react@rc and react-dom@rc in react release candidate mode as well and get started with your React 18 journey. And of course, this will pass on the benefits to frameworks like NextJS and Remix also because these things also use react as the underlying library.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>react18</category>
    </item>
    <item>
      <title>How to upload a JSON file to firebase and access it as list items from the web?</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Sun, 18 Apr 2021 11:09:23 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/how-to-upload-a-json-file-to-firebase-and-access-it-as-list-items-from-the-web-20o8</link>
      <guid>https://dev.to/sharjeelyunus/how-to-upload-a-json-file-to-firebase-and-access-it-as-list-items-from-the-web-20o8</guid>
      <description>&lt;p&gt;If you have a large JSON file and you wanna upload it to a database, &lt;strong&gt;Firebase Realtime Database&lt;/strong&gt; would be your first choice. But how can you import that large file directly without doing everything manually? And how can you fetch this data to as List items via Vanilla JavaScript?&lt;/p&gt;

&lt;p&gt;Let's start with JSON =&amp;gt; (JavaScript Object Notation) is used when data is sent from a server to a web page.&lt;/p&gt;

&lt;p&gt;Here's how our JSON file looks like!⤵&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Certificates-List"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"courseName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Elements of AI: Introduction to AI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"institute"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"University of Helsinki"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"courseName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Javascript Beginner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"institute"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Udemy"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"courseName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Introduction to Flutter Development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"institute"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"App Brewery"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First of all Configure your Firebase project for the web &lt;a href="https://www.youtube.com/watch?v=q5tAUb_bvqg&amp;amp;ab_channel=TACV-TheAmazingCode-Verse" rel="noopener noreferrer"&gt;How to Configure Google Firebase for Web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now click on 3 dots and select import JSON, select your file.&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%2Ft5v7xmtbxk3bg9v2oniz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5v7xmtbxk3bg9v2oniz.jpg" alt="Alt Text" width="800" height="371"&gt;&lt;/a&gt;&lt;br&gt;
Ahhan! your JSON file is now uploaded to Firebase Realtime Database.&lt;br&gt;
Now your database should look like this:&lt;br&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%2Fc44ft10clmdrq9jv83ta.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%2Fc44ft10clmdrq9jv83ta.png" alt="Alt Text" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see this as an API, Copy the URL of the database and write the folder name .json after it. Like this =&amp;gt; &lt;a href=""&gt;https://test-45959-default-rtdb.firebaseio.com/Certificates-List.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now how can we access this data to a webpage using Vanilla JavaScript?&lt;br&gt;
Create a ul tag with id="Certificates-List".&lt;br&gt;
Your Project should look like this⤵&lt;br&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%2Fm3avjywcrphwedpd3erq.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%2Fm3avjywcrphwedpd3erq.png" alt="Alt Text" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Time for the real part: &lt;strong&gt;Access data from Firebase to Web&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a function to add items to the list like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addItemsToList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;institute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ul&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Certificates-List&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_courseName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_institute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;_courseName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CourseName: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;_institute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Institute: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;institute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_courseName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_institute&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;Here we grab the &lt;code&gt;ul&lt;/code&gt; tag by id and then create the list items via &lt;code&gt;li&lt;/code&gt; tag. Using appendChild store the grabbed data to list items.&lt;/p&gt;

&lt;p&gt;Now create a function to fetch data from database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FetchAllData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;firebase&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;database&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Certificates-List&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChildSnapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;courseName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ChildSnapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;val&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;institute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ChildSnapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;val&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;institute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;addItemsToList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;courseName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;institute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we're fetching our data from Firebase Realtime Database with the ref of database folder name i.e Certificates-List. And then calling the &lt;code&gt;addItemsToList()&lt;/code&gt; to get the data.&lt;/p&gt;

&lt;p&gt;Now to load data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FetchAllData&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your code should be like this:&lt;br&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%2F0rs3wrcvawahay8yaswj.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%2F0rs3wrcvawahay8yaswj.png" alt="Alt Text" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's how your web page should look like:&lt;br&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%2Fkvfgfhmmcyrqpk9wmald.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%2Fkvfgfhmmcyrqpk9wmald.png" alt="Alt Text" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. We're all OK. Now you can customize this data and webpage however you like.👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>json</category>
      <category>firebase</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Web Developer? Terms you should understand!</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Sun, 14 Mar 2021 22:27:27 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/web-developer-terms-you-should-understand-1kc5</link>
      <guid>https://dev.to/sharjeelyunus/web-developer-terms-you-should-understand-1kc5</guid>
      <description>&lt;p&gt;The Tech Industry is full of peculiar words, to which anyone can get confused. Web development is no rule-breaking, and if you need to make it as a programmer, you need to be having some knowledge of the industry lingo.&lt;/p&gt;

&lt;p&gt;This list will give you a good introduction to some of the most important terms that you’ll come across when working in web development. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;br&gt;
Code is essentially what web developers write using programming languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug&lt;/strong&gt;&lt;br&gt;
A bug is an error that prevents a website or app from running as it should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;br&gt;
Debugging is the process of identifying and dealing with BUGs. &lt;br&gt;
Debugging is a multistep process: the developer locates the problem, isolates the source and then gets to work on fixing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;br&gt;
“Application Program Interface” An API enables two different programs to communicate with each other by making some parts of the website code available to developers.&lt;br&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%2Fwpc98o7zm0dqvgcnm076.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpc98o7zm0dqvgcnm076.jpg" alt="Alt Text" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;br&gt;
Frameworks were invented to make the process of building a website faster and easier. They provide you with a base to build your code and design. Some common frameworks include Ruby on Rails, Bootstrap, AngularJS and Vue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jamstack&lt;/strong&gt;&lt;br&gt;
Jamstack is an architecture designed to make the web faster, more secure, and easier to scale. It typically comprises 3 components: JavaScript, APIs and Markup.&lt;br&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%2Fp4brgeg54quv3lmbhttb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4brgeg54quv3lmbhttb.jpg" alt="Alt Text" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Graphql&lt;/strong&gt;&lt;br&gt;
GraphQL is a query language for APIs. it is used to load data from a server to a client -- it's a way to get data from an API into your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;&lt;br&gt;
An Algorithm is basically a set of steps for carrying out certain tasks. In computer programming, algorithms are a key part of problem-solving. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Structures&lt;/strong&gt;&lt;br&gt;
Data Structures are a way of organizing and storing data for maximum efficiency — much like books in a library. Data structures make it easy to find, access, sort, insert and delete data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;br&gt;
Git is a version control system where developers can store and manage their code. Git enables you to track changes in Code and reverse them if necessary, and also to work together with other teams and manage multiple projects at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;
GitHub is a cloud interface for Git. Its the largest host of source code in the world! GitHub offers all the version control functionality of Git, but also offers its own features, such as bug tracking, task management and project wikis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Libraries&lt;/strong&gt;&lt;br&gt;
Libraries are stores of pre-written code, or modules, that programmers can take and insert into the code they’re writing. Libraries can save developers considerable time and effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile-first&lt;/strong&gt;&lt;br&gt;
Mobile-first is an approach to web design and development that prioritizes mobile devices. Rather than building a website with a desktop in mind and then considering how it might look on a mobile device, with a mobile-first approach, the website is first built for the small screen.&lt;br&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%2Fibifpydkgjswdaz6jcf8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibifpydkgjswdaz6jcf8.jpg" alt="Alt Text" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps&lt;/strong&gt;&lt;br&gt;
“Development Operations.” System of working that helps to keep development, IT operations, and quality assurance departments on the same page to make for better end-products and collaborations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GUI&lt;/strong&gt;&lt;br&gt;
“Graphical User Interface.” The image of how a website is laid out and meant to be interacted with. In website design, this is how everything will ideally look in layout.&lt;br&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%2F5hb33nicrnshjeno8mgf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hb33nicrnshjeno8mgf.jpg" alt="Alt Text" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is by no means an exhaustive list, but it should help you to start talking about the web developer talk.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>codenewbie</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Swag by HactoberFest</title>
      <dc:creator>Sharjeel Yunus</dc:creator>
      <pubDate>Sun, 18 Oct 2020 10:38:15 +0000</pubDate>
      <link>https://dev.to/sharjeelyunus/swag-by-hactoberfest-kf4</link>
      <guid>https://dev.to/sharjeelyunus/swag-by-hactoberfest-kf4</guid>
      <description>&lt;p&gt;To support open-source contribution a program "HactoberFest" is held by DEV and Digital Ocean in collaboration with Github every year.&lt;br&gt;
GitHub is a version control platform where you can share your projects and can also contribute to other projects, for that you have to open a pull request.&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%2Fi%2Fe2ovdk0zende8jx4tqyk.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%2Fi%2Fe2ovdk0zende8jx4tqyk.png" alt="Alt Text" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
HactoberFest is an event based on opening 4 pull request to encourage open source contribution. And as an award by DEV and Digital Ocean swags are given to them. These swags includes tree/t-shirt, stickers and badges.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to Join this Event?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;To participate, register at the official site: &lt;a href="//hacktoberfest.digitalocean.com"&gt;hacktoberfest.digitalocean.com&lt;/a&gt; Make sure you are connected with your GitHub account. Then, submit at least four pull-request (PRs) to any public GitHub repository.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
