<?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: Beatrice Egumandi</title>
    <description>The latest articles on Forem by Beatrice Egumandi (@icyy_bee).</description>
    <link>https://forem.com/icyy_bee</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%2F990860%2Fe84a4c5d-c0b3-4636-ae41-3b1bbe16722b.jpeg</url>
      <title>Forem: Beatrice Egumandi</title>
      <link>https://forem.com/icyy_bee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/icyy_bee"/>
    <language>en</language>
    <item>
      <title>How to Connect to Your VPN on macOS Using Tunnelblick and a Certificate</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Fri, 05 Sep 2025 16:57:06 +0000</pubDate>
      <link>https://forem.com/icyy_bee/how-to-connect-to-your-vpn-on-macos-using-tunnelblick-and-a-certificate-5hig</link>
      <guid>https://forem.com/icyy_bee/how-to-connect-to-your-vpn-on-macos-using-tunnelblick-and-a-certificate-5hig</guid>
      <description>&lt;p&gt;Using a VPN on macOS can be straightforward when you have the right configuration files and certificates (and of course, the right guide 😉. This article walks you through the setup process step by step. By following this guide, you can securely connect to your VPN using Tunnelblick and a &lt;code&gt;.p12&lt;/code&gt; or &lt;code&gt;.ovpn&lt;/code&gt; file.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Install Tunnelblick
&lt;/h3&gt;

&lt;p&gt;Tunnelblick is a free, open-source OpenVPN client for macOS.&lt;br&gt;
&lt;strong&gt;1.&lt;/strong&gt; Download the latest, most stable version from &lt;a href="https://tunnelblick.net/downloads.html" rel="noopener noreferrer"&gt;Tunnelblick’s website&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Open the &lt;code&gt;.dmg&lt;/code&gt; file and drag the Tunnelblick icon to your Applications folder.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Launch Tunnelblick and allow it to make changes if prompted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tunnelblick manages OpenVPN connections and simplifies certificate handling, making it ideal for Mac users.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Step 2: Gather Your Configuration Files
&lt;/h3&gt;

&lt;p&gt;You will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;code&gt;.ovpn&lt;/code&gt; configuration file from your VPN provider.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;code&gt;.p12&lt;/code&gt; or PKCS#12 certificate file (contains your client certificate and private key).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Place both files in a folder on your Mac that is easy to locate, 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;~/Desktop/VPNConfig/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Add or Prepare Your Certificate for Tunnelblick
&lt;/h3&gt;

&lt;p&gt;Your VPN may provide a &lt;code&gt;.p12&lt;/code&gt; (PKCS#12) certificate, which contains both your client certificate and private key. Tunnelblick can sometimes read the &lt;code&gt;.p12&lt;/code&gt; directly, but in some cases, you need to separate it into &lt;code&gt;.pem&lt;/code&gt; files. Luckily, this guide covers both scenarios 😁&lt;/p&gt;

&lt;h4&gt;
  
  
  Option 1: Directly Import the &lt;code&gt;.p12&lt;/code&gt; File
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Double-click the &lt;code&gt;.p12&lt;/code&gt; certificate.&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; macOS will prompt you to choose where to store it: Login, System, or iCloud. Choose Login.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Enter the password provided by your VPN provider.&lt;br&gt;
&lt;strong&gt;4.&lt;/strong&gt; Tunnelblick may now recognize the &lt;code&gt;.p12&lt;/code&gt; file. When adding the VPN configuration, you can select this certificate directly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This works if Tunnelblick accepts the certificate without errors like “unable to load Private Key.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h4&gt;
  
  
  Option 2: Extract &lt;code&gt;.pem&lt;/code&gt; Files (If Direct Import Fails)
&lt;/h4&gt;

&lt;p&gt;If Tunnelblick cannot read the &lt;code&gt;.p12&lt;/code&gt;, you need to extract the private key and client certificate into separate &lt;code&gt;.pem&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Open Terminal and navigate to your folder containing the &lt;code&gt;.p12&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/Desktop/VPNConfig/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Extract the private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl pkcs12 -in [your-certificate].p12 -nocerts -out [your-private-key].pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enter the &lt;code&gt;.p12&lt;/code&gt; password when prompted.&lt;/li&gt;
&lt;li&gt;You may be asked to create a new passphrase for the private key; you can choose to do so or skip it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Extract the client certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl pkcs12 -in [your-certificate].p12 -clcerts -nokeys -out [your-client-cert].pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Extract the CA certificate (if your &lt;code&gt;.p12&lt;/code&gt; includes it):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl pkcs12 -in [your-certificate].p12 -cacerts -nokeys -out [your-ca-cert].pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Remember to replace the placeholders [your-certificate], [your-private-key], [your-ca-cert], and [your-client-cert] with your actual file names.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; Ensure all &lt;code&gt;.pem&lt;/code&gt; files are in the same folder as your &lt;code&gt;.ovpn&lt;/code&gt; configuration file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using separate &lt;code&gt;.pem&lt;/code&gt;files guarantees Tunnelblick can read the certificate and private key properly, avoiding passphrase and key errors.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Step 4: Configure Your &lt;code&gt;.ovpn&lt;/code&gt; File
&lt;/h3&gt;

&lt;p&gt;Open the &lt;code&gt;.ovpn&lt;/code&gt; file in a text editor. Ensure the following lines reference your certificate and private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ca [your-ca-cert].pem
cert [your-client-cert].pem
key [your-private-key].pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 5: Fix Cipher Compatibility
&lt;/h3&gt;

&lt;p&gt;Newer OpenVPN versions require specifying &lt;code&gt;data-ciphers&lt;/code&gt;, so add the following to your &lt;code&gt;.ovpn&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cipher AES-256-CBC
data-ciphers AES-256-CBC:AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
data-ciphers-fallback AES-256-CBC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures your client negotiates correctly with the server, especially when using older or specific cipher configurations.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Add Your Configuration to Tunnelblick
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Open Tunnelblick and select &lt;strong&gt;I have configuration files&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Drag your &lt;code&gt;.ovpn&lt;/code&gt; file into the Tunnelblick window (or just double click on the file).&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; When prompted, Tunnelblick may ask for your macOS password to authorize storing the configuration.&lt;br&gt;
&lt;strong&gt;4.&lt;/strong&gt; Choose whether to make the VPN available to all users or only your account; for most personal setups, selecting &lt;strong&gt;only me&lt;/strong&gt; is safer.&lt;br&gt;
&lt;strong&gt;5.&lt;/strong&gt; Enter the passphrase for your certificate if required.&lt;/p&gt;

&lt;p&gt;Tunnelblick will then store this configuration and display it in the list of available VPN connections, ready to connect.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 7: Connect to the VPN
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click the Tunnelblick icon in the macOS menu bar.&lt;/li&gt;
&lt;li&gt;Select the configuration you added and click Connect.&lt;/li&gt;
&lt;li&gt;Monitor the status in the Tunnelblick window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Common messages include “Authorizing” followed by “Connected.” If the connection loops, verify your cipher settings and certificate passphrase.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 9: Troubleshoot Common Issues
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Passphrase not accepted&lt;/td&gt;
&lt;td&gt;Ensure you are using the same passphrase used during &lt;code&gt;.p12&lt;/code&gt; extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate errors&lt;/td&gt;
&lt;td&gt;Check that the certificate is correctly added to the &lt;strong&gt;Login Keychain&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cipher negotiation failed&lt;/td&gt;
&lt;td&gt;Ensure &lt;code&gt;data-ciphers&lt;/code&gt; includes &lt;code&gt;AES-256-CBC&lt;/code&gt; and set &lt;code&gt;data-ciphers-fallback AES-256-CBC&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Looping between Authorizing and Reconnecting&lt;/td&gt;
&lt;td&gt;Confirm your certificate, key, and &lt;code&gt;.ovpn&lt;/code&gt; paths are correct&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;This guide provides a detailed, beginner-friendly approach to connecting to a VPN on macOS using Tunnelblick. Following it ensures your certificate and configuration are correctly set up, minimizing common errors that cause connection failures.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>openvpn</category>
      <category>tunnelblick</category>
      <category>vpn</category>
    </item>
    <item>
      <title>🧠 State-of-the-Art Programming vs 🎧 Vibe Coding: A Tale of Two Dev Modes</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Tue, 10 Jun 2025 10:25:11 +0000</pubDate>
      <link>https://forem.com/icyy_bee/state-of-the-art-programming-vs-vibe-coding-a-tale-of-two-dev-modes-38ja</link>
      <guid>https://forem.com/icyy_bee/state-of-the-art-programming-vs-vibe-coding-a-tale-of-two-dev-modes-38ja</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;One is clean, scalable, and built for teams.&lt;br&gt;
The other is chaotic, magical, and runs on pure flow and vibes&lt;br&gt;
Both? Completely valid just in the right context.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✨ What Is State-of-the-Art Programming?
&lt;/h2&gt;

&lt;p&gt;This isn’t a formal technical term, it’s more of a vibe… an elite one.&lt;/p&gt;

&lt;p&gt;When someone says, “We do state-of-the-art programming” they’re really saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We write smart, clean, scalable code using the best tools and practices modern development has to offer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No legacy stuff. No spaghetti coding. Definitely no commit messages like &lt;code&gt;final_reallyfinal_FIX&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠 What It Looks Like in Practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modern workflows&lt;/strong&gt;: Trunk-Based Development, GitOps, CI/CD pipelines, Infrastructure as Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;: Clean Architecture, &lt;a href="https://medium.com/wearewaes/ports-and-adapters-as-they-should-be-6aa5da8893b" rel="noopener noreferrer"&gt;Ports and Adapters&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs" rel="noopener noreferrer"&gt;CQRS&lt;/a&gt;, &lt;a href="https://microservices.io/" rel="noopener noreferrer"&gt;Microservices&lt;/a&gt; (if you must).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best practices&lt;/strong&gt;: SOLID principles, DRY, TDD/BDD, Domain-Driven Design, Version control strategies that don’t leave your git log looking like a crime scene.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-quality tooling&lt;/strong&gt;: TypeScript (because JavaScript is a little too wild😅), ESLint/Prettier, Lint-staged + Husky, Automated tests (Jest, Playwright), Feature flags (Flagsmith), Observability tools (Sentry, LogRocket), etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer experience (DX)&lt;/strong&gt;: Write once, debug never (okay, rarely 😅), Clean commits, Readable code (code should be readable by future-you and not feel like a scavenger hunt), Great onboarding docs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even a junior dev could jump in and say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh wow, this codebase makes sense.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  👩🏽‍💻 Real Example
&lt;/h3&gt;

&lt;p&gt;When your boss prefers a single main branch using Trunk-Based Development instead of main + dev, what they're really doing is leaning into state-of-the-art ideas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuous integration for faster feedback.&lt;/li&gt;
&lt;li&gt;Reducing branching complexity.&lt;/li&gt;
&lt;li&gt;Encouraging smaller, shippable changes.&lt;/li&gt;
&lt;li&gt;Leveraging feature flags instead of long-lived branches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎧 So… What Is Vibe Coding?
&lt;/h2&gt;

&lt;p&gt;Now this is where things get spicy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✨Vibe coding means going with the flow.&lt;br&gt;
✨No roadmap. No strict rules. Just vibes, baby.&lt;br&gt;
✨That late-night, hoodie-on, playlist-blasting kind of flow where the code just... happens. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're coding on instinct, inspiration, or pure curiosity. It's spontaneous. It’s artistic and sometimes... it’s kinda messy.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Vibe Coding Looks Like
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No Jira ticket. No Figma design. Just a mental image and caffeine.&lt;/li&gt;
&lt;li&gt;No testing yet, we’re still “figuring things out.”&lt;/li&gt;
&lt;li&gt;Your Git history is a ghost town.&lt;/li&gt;
&lt;li&gt;TDD becomes “TBD” (To Be Determined 😂).&lt;/li&gt;
&lt;li&gt;You’re building it as it forms in your head, tabs everywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vibe coding is the jazz of programming.&lt;br&gt;
Sometimes genius. Sometimes chaotic. Sometimes both.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🎯 When It’s Perfectly Valid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prototypes and MVPs&lt;/li&gt;
&lt;li&gt;Personal or experimental projects&lt;/li&gt;
&lt;li&gt;Exploring ideas that may or may not ship&lt;/li&gt;
&lt;li&gt;Learning a new framework or tool without pressure&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚠️ When It’s Risky
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In production codebases&lt;/li&gt;
&lt;li&gt;On team projects&lt;/li&gt;
&lt;li&gt;When “I’ll clean this up later” becomes a lifestyle&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Examples
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;State-of-the-Art 🧠&lt;/th&gt;
&lt;th&gt;Vibe Coding 🎧&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setting up a project&lt;/td&gt;
&lt;td&gt;CI/CD, commit hooks, tests&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npx create-next-app&lt;/code&gt; + hope 😂&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A quick fix&lt;/td&gt;
&lt;td&gt;Feature flag, tests, PR review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;console.log(“please work, yolo 💅🏾”)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev mindset&lt;/td&gt;
&lt;td&gt;“Will this scale?”&lt;/td&gt;
&lt;td&gt;“Will this run?”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team experience&lt;/td&gt;
&lt;td&gt;Predictable, clean, documented&lt;/td&gt;
&lt;td&gt;🤷🏽‍♀️ Depends on who wrote it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✨ Real Talk: You Need Both
&lt;/h2&gt;

&lt;p&gt;Here’s the thing: &lt;em&gt;The best developers know when to switch modes.&lt;/em&gt;&lt;br&gt;
You vibe code to explore and unblock your creativity.&lt;br&gt;
You state-of-the-art when it’s time to scale, collaborate, or ship production-quality code.&lt;br&gt;
Too much structure can kill momentum.&lt;br&gt;
Too much chaos can burn out teams.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You prototype with vibes. You scale with discipline.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trait&lt;/th&gt;
&lt;th&gt;State-of-the-Art Programming 🧠&lt;/th&gt;
&lt;th&gt;Vibe Coding 🎧&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Structure&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best used for&lt;/td&gt;
&lt;td&gt;Production, team projects&lt;/td&gt;
&lt;td&gt;Side projects, prototyping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing &amp;amp; QA&lt;/td&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;td&gt;“Eventually?”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mood&lt;/td&gt;
&lt;td&gt;Disciplined engineer&lt;/td&gt;
&lt;td&gt;Creative hacker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools&lt;/td&gt;
&lt;td&gt;Linters, CI/CD, architecture&lt;/td&gt;
&lt;td&gt;Keyboard, caffeine, vibes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code lifespan&lt;/td&gt;
&lt;td&gt;Long-term&lt;/td&gt;
&lt;td&gt;Who knows? 🤷🏽‍♀️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💬 So... Which One Are You Today?
&lt;/h2&gt;

&lt;p&gt;Me? I’ve got my main branch locked down with Trunk-Based Dev…&lt;br&gt;
But I just built my onboarding flow without a Figma design in a side project for fun.&lt;/p&gt;

&lt;p&gt;And that’s okay. Sometimes it’s discipline.&lt;br&gt;
Sometimes it’s jazz.&lt;br&gt;
And sometimes it’s both.&lt;/p&gt;

&lt;p&gt;Which one are you vibing with lately? Clean architecture or chaos mode? Drop your stories, fails, and wins in the comments.&lt;/p&gt;

&lt;p&gt;Let’s normalize both ends of the dev spectrum 🤝&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>vibecoding</category>
      <category>cleancode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Trees vs Graphs: Understanding the Key Differences in Data Structures</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Wed, 14 May 2025 11:07:02 +0000</pubDate>
      <link>https://forem.com/icyy_bee/trees-vs-graphs-understanding-the-key-differences-in-data-structures-5hmo</link>
      <guid>https://forem.com/icyy_bee/trees-vs-graphs-understanding-the-key-differences-in-data-structures-5hmo</guid>
      <description>&lt;p&gt;A month ago, I had a task to generate a dynamic, visual and fluid graph using a mock data. I thought it would be a fun, straightforward challenge, something I could knock out in a few hours or at most a day. Little did I know that I was about to fall into a classic “data structure trap”.&lt;/p&gt;

&lt;p&gt;I spent hours designing my custom nodes, tweaking my layout logic, and trying to make my graph flexible and visually engaging. But when I stepped back to review my work, it hit me: I had built &lt;strong&gt;a tree, not a graph&lt;/strong&gt; 😅.&lt;/p&gt;

&lt;p&gt;This moment was a learning opportunity and it got me thinking deeply about how trees and graphs differ and how easy it is to confuse the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌳 All Trees Are Graphs, But Not All Graphs Are Trees
&lt;/h2&gt;

&lt;p&gt;At the core, trees are a subset of graphs. While all trees are technically graphs, not all graphs are trees. So, what’s the real distinction between the two?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trees&lt;/strong&gt; are structured and hierarchical. There’s one root, and each node has exactly one parent. A node can only be reached through a single path from the root, that means there’s no backtracking or looping. Think of a company structure, where you have one manager, who manages employees, who manage their own teams. It’s a clear, well-defined chain of command.&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%2Fyqbbccmrzjlezsvbdrxk.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%2Fyqbbccmrzjlezsvbdrxk.jpg" alt="Tree Data Structure" width="736" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;Graphs&lt;/strong&gt; embrace complexity. Graphs are less rigid and can have multiple connections between nodes, forming loops or cycles, and they don’t necessarily have a clear structure. Consider your social network: You might be connected to people in many ways, and there’s no single parent-child relationship. Nodes can branch off, loop back, or even be unconnected. It’s a messy, interconnected web of relationships.&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%2Fgnjwp2e1ixpiij6pdx79.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%2Fgnjwp2e1ixpiij6pdx79.jpg" alt="Graph Data Structure" width="736" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚗 A Simple Analogy: Navigating Cities&lt;/strong&gt;&lt;br&gt;
Let’s think of graphs and trees in terms of navigation (this might help make things clearer).&lt;/p&gt;

&lt;p&gt;In a tree-like road system, imagine you're driving from City A to City C. To get to City C, you must first pass through City B, which is connected to City A. There’s only one route to each city, and no detours. This represents the strict structure of a tree — one parent, one path.&lt;/p&gt;

&lt;p&gt;Now, let’s think of a graph-like road system. Here, there might be multiple ways to get to City C. You could go through City B, but you might also be able to take a shortcut through City D or City E. Roads could form loops, allowing you to circle back or take alternate routes. This represents a graph where nodes (cities) can connect in various ways, forming a more flexible, interconnected network.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 How to Spot the Difference: Rules vs Chaos
&lt;/h2&gt;

&lt;p&gt;Here’s the big takeaway: &lt;strong&gt;Trees follow rules, graphs embrace chaos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you trace a path from the root and find there’s only one way to reach any node, you’re dealing with a tree. It's rigid and follows a set path.&lt;/p&gt;

&lt;p&gt;If you find that there are multiple paths, loops, or cycles, you're working with a graph. It’s more chaotic, and that's exactly what makes it useful for representing more complex systems, like networks, relationships, learning paths or even web links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you spot the difference? 💁🏽‍♀️&lt;/strong&gt;&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%2F0wu7ervm1cq8n4k9tyik.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%2F0wu7ervm1cq8n4k9tyik.png" alt="Can you spot the difference" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 What Happens When You Mix Them Up?
&lt;/h2&gt;

&lt;p&gt;The difference might seem subtle at first, but understanding it is crucial for building the right kind of data structure for your project. In my case, I spent hours designing what I thought was a dynamic, fluid graph, only to realize it was a tree. I had constrained my structure, thinking I was being flexible.&lt;/p&gt;

&lt;p&gt;If I had wanted a true graph, I would have needed to allow for more connections, more paths, and more possibilities. Realizing this helped me take a step back and rethink my approach, something I believe is an essential part of the learning process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🙋‍♀️ Your Data Structure Fails&lt;/strong&gt;&lt;br&gt;
Has this ever happened to you? Have you ever built the “wrong” data structure, only to have that moment of realization when things just clicked? I’d love to hear your thoughts on how you've learned from your mistakes or moments of confusion in building data structures.&lt;/p&gt;

&lt;p&gt;Share your experiences in the comments let's learn out loud.&lt;/p&gt;

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

&lt;p&gt;Keep Exploring the Messy Side of Graphs. The next time you’re working with data structures, remember: &lt;strong&gt;Not all graphs are messy and Not all trees are perfectly neat&lt;/strong&gt; — sometimes things aren’t as straightforward as they seem! Embrace the complexity when you need it and the structure when it’s called for. Both trees and graphs are essential tools for solving different kinds of problems and understanding the differences will help you build better, more efficient systems.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And as for me?&lt;/em&gt; I’m diving deeper into graphs, ready to embrace the chaos and flexibility they offer. But I’ll keep my trees in mind when I need a solid, well-defined structure. 😉&lt;/p&gt;

</description>
      <category>programming</category>
      <category>algorithms</category>
      <category>datastructures</category>
      <category>learning</category>
    </item>
    <item>
      <title>Customizing Tailwind CSS in Next.js: A Complete Guide</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Thu, 30 Mar 2023 12:32:21 +0000</pubDate>
      <link>https://forem.com/icyy_bee/customizing-tailwind-css-in-nextjs-a-complete-guide-3jjp</link>
      <guid>https://forem.com/icyy_bee/customizing-tailwind-css-in-nextjs-a-complete-guide-3jjp</guid>
      <description>&lt;p&gt;Welcome to the second article in our series on building gorgeous websites with Next.js and Tailwind CSS! In our &lt;a href="https://dev.to/icyybee/sailing-smoothly-with-nextjs-and-tailwindcss-how-to-create-gorgeous-websites-with-ease-2c88"&gt;first article&lt;/a&gt;, we covered the basics of installing Tailwind CSS in a Next.js project and getting started with its utility classes. Now, we're taking things up a notch and diving into the world of customization.&lt;/p&gt;

&lt;p&gt;Tailwind CSS is an amazing &lt;a href="https://tailwindcss.com/docs/utility-first" rel="noopener noreferrer"&gt;utility-first&lt;/a&gt; CSS framework that allows you to create beautiful, responsive designs quickly and easily, but what if you want to customize those styles to fit your project's specific needs? Fear not, because in this article, we'll walk you through some of the most common customization options, including customizing colors, adding custom spacing, defining custom typography and customizing breakpoints. &lt;/p&gt;

&lt;p&gt;Before we begin, it's important to note that there's a handy extension for Visual Studio Code called &lt;code&gt;Tailwind CSS IntelliSense&lt;/code&gt; that can help make the process smoother. This extension provides features such as autocomplete, syntax highlighting and linting. If you're using VS Code, we highly recommend installing it before continuing with this tutorial. Now, let's get started and make your website truly your own!&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Customizing colors&lt;/li&gt;
&lt;li&gt;Customizing typography&lt;/li&gt;
&lt;li&gt;Customizing screens&lt;/li&gt;
&lt;li&gt;Customizing spacing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Customizing colors
&lt;/h2&gt;

&lt;p&gt;When it comes to branding, colors play a vital role in creating a unique and memorable identity. Tailwind CSS makes it incredibly easy to customize your project's color scheme. By default, Tailwind comes with a set of pre-defined &lt;a href="https://tailwindcss.com/docs/customizing-colors" rel="noopener noreferrer"&gt;colors&lt;/a&gt; that can be used in your project. For instance, you can set the background color and text color of an element using its default colors like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="bg-purple-800 text-grey-50"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the bg-purple-800 class sets the background color of the h1 element to a shade of purple. The number 800 represents the saturation level of the purple color; and the text-grey-50 class sets the color of the text to a shade of grey.&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%2Fdzr9utdyfmlmi049xus2.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%2Fdzr9utdyfmlmi049xus2.PNG" alt="Welcome to tailwind world" width="800" height="220"&gt;&lt;/a&gt;&lt;br&gt;
But what if you want to use a color that is not included in the default set? This is where customizing colors comes in handy. It's worth noting that when customizing your styles, in the theme object of your project's tailwind.config file, you keep in mind the order of your customizations. If you want to overwrite the default Tailwind colors with your own custom colors, make sure to place your custom color definition above the extend key. Contrarily, if you want to use your custom colors in addition to the default Tailwind colors, place your custom color definition below the extend key. This way, the default colors will be extended with your custom colors. &lt;/p&gt;

&lt;p&gt;For example, let's say you want to add a custom color to your project called "primary" and still let tailwind default colors be present. You can add it in the theme object in a colors section 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;module.exports = {
  theme: {
    extend: {
      colors: {
        primary: "#801111",
      },
    },
  },
  variants: {},
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can use the primary color in your project by referencing it in your CSS classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="bg-primary"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sets the background color of the h1 element to your custom primary color. You can also set different shades 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;// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: {
          100: "#7a1d1d",
          500: "#741b1b",
          900: "#5a0e0e",
        },
        secondary: "#7630a1"
      },
    },
  },
  variants: {},
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we're adding new shades with different hex values to the primary and secondary colors. Now, you can use the new shades in your project like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="bg-primary-100"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h1&amp;gt;
&amp;lt;h1 className="bg-secondary"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another way to customize your colors is by using the &lt;a href="https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values" rel="noopener noreferrer"&gt;arbitrary values method&lt;/a&gt;. This method is particularly useful when you need to apply a specific value to an element, such as &lt;code&gt;top: 117px&lt;/code&gt;, without having to create a separate class in your CSS file. With Tailwind's square bracket notation, you can easily generate classes with arbitrary values for various custom stylings, including background colors, font sizes, pseudo-element content, and more. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="top-[117px] h-[500px] w-[800px]"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we're using the top-[117px], h-[500px] and w-[800px] classes to apply an arbitrary top, height and width to the div, respectively. The possibilities are endless with this method, allowing you to customize your styles to your heart's content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Typography
&lt;/h2&gt;

&lt;p&gt;Customizing typography is all about defining your own font families, font sizes, font weights and more. This allows you to create a unique typography system that fits your project's specific needs. To do that, you can add new font families, font sizes, font weights and other typography-related styles to the theme section of your tailwind.config.js file. For example, you can define new font families 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;module.exports = {
  theme: {
    fontFamily: {
      'sans': ['Helvetica', 'Arial', 'sans-serif'],
      'serif': ['Georgia', 'serif'],
      'mono': ['Courier', 'monospace'],
    },
  },
  variants: {},
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then reference it in your CSS classes like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="font-sans"&amp;gt;
  Hello World!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is after you must have already attached the font links meta tags in the head of your HTML file. Another way to customize typography and basically customize any style is by using the globals.css file. Just as the name implies, the globals.css file defines global styles that can be used throughout your project. For instance, suppose you want to define a global font family and background color. You can do this in the globals.css file 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;@import url('https://fonts.googleapis.com/css2?family=Alkatra&amp;amp;display=swap');

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
    html {
        background-color: violet;
        font-family: 'Alkatra', cursive;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we import the Alkatra font family from &lt;a href="https://fonts.google.com/specimen/Alkatra" rel="noopener noreferrer"&gt;Google Fonts&lt;/a&gt; using &lt;a class="mentioned-user" href="https://dev.to/import"&gt;@import&lt;/a&gt;, then use it to set the font-family of the html element in the @layer base block. &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%2Fyethlvum2n3czwubylf9.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%2Fyethlvum2n3czwubylf9.PNG" alt="Font family import" width="331" height="650"&gt;&lt;/a&gt;&lt;br&gt;
Additionally, we set the background color of the html element to violet. We use the &lt;a href="https://tailwindcss.com/docs/functions-and-directives#layer" rel="noopener noreferrer"&gt;@layer&lt;/a&gt; directive to specify the category of a custom style set. These styles can be classified into three valid layers, namely base, components, and utilities. You can adjust this value to whatever you prefer for your project.&lt;/p&gt;
&lt;h2&gt;
  
  
  Customizing Screens
&lt;/h2&gt;

&lt;p&gt;Breakpoints are the pre-defined screen sizes that Tailwind uses to create responsive designs. By default, Tailwind provides a set of breakpoints that you can use to create responsive designs. However, you may want to customize these breakpoints to fit your project's specific needs. To customize your breakpoints, you need to add a screens object to your tailwind.config.js file. This object defines the new breakpoints and their values. 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;module.exports = {
  theme: {
    screens: {
      sm: '480px',
      md: '768px',
      lg: '976px',
      xl: '1440px',
    },
  },
  variants: {},
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's important to note that Tailwind uses the min-width media query instead of the max-width media query. This means that when you define a screen size, you're actually defining the minimum screen size that the styles should apply to.&lt;/p&gt;

&lt;p&gt;For example, in the code above, the sm screen applies to screens that are 480 pixels wide or larger, the md screen applies to screens that are 768 pixels wide or larger, and so on. We can now use these custom screen sizes in our utility classes. 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;&amp;lt;h2 className="text-primary-100 text-1xl lg:text-7xl"&amp;gt;
  Welcome to tailwind world!
&amp;lt;/h2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the text-primary-100 class sets the text color to the primary shade 100, the text-1xl class sets the font size to 1rem and the lg:text-7xl class sets the font size to 7rem on large screens. This means that on screens with a width of 976px or greater, the font size of the h2 element will be 7rem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Spacing
&lt;/h2&gt;

&lt;p&gt;In Tailwind CSS, spacing refers to the space between elements. By default, Tailwind provides a set of predefined spacing values that you can use to create visually appealing layouts. However, you may want to customize these values to fit your project's specific needs.&lt;/p&gt;

&lt;p&gt;To customize spacing in Tailwind, you need to add a spacing object to your tailwind.config.js file. This object defines the new spacing values and their names. 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;module.exports = {
  theme: {
    spacing: {
      '1': '8px',
      '2': '12px',
      '3': '16px',
      '4': '24px',
    }
  },
  variants: {},
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code above, we added new spacing values with their respective values. We can now use these custom spacing values in our utility classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 className="p-2 mb-1"&amp;gt;
  Hello World!
&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we used the p-2 class to set a padding of 12px and the mb-1 class to set a margin bottom of 8px on the h2 element.&lt;/p&gt;

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

&lt;p&gt;Customizing the default settings can seem intimidating, but with the tips outlined in this article, you can easily create a custom design that fits your project's specific needs. From customizing colors to defining your own spacing scale, the possibilities are endless with Tailwind CSS. So go ahead, get creative and happy coding!&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>nextjs</category>
      <category>customization</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Sailing Smoothly with Next.js and TailwindCSS: How to Create Gorgeous Websites with Ease</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Tue, 28 Mar 2023 18:30:42 +0000</pubDate>
      <link>https://forem.com/icyy_bee/sailing-smoothly-with-nextjs-and-tailwindcss-how-to-create-gorgeous-websites-with-ease-2c88</link>
      <guid>https://forem.com/icyy_bee/sailing-smoothly-with-nextjs-and-tailwindcss-how-to-create-gorgeous-websites-with-ease-2c88</guid>
      <description>&lt;p&gt;In this article, we're setting sail on a journey to create stunning websites with ease using Next.js and TailwindCSS; and the best part is, we're not stopping at just one tutorial! We'll have a series of articles that will take you on a journey from the basics of installation to advanced techniques and everything in between. &lt;/p&gt;

&lt;p&gt;Before we begin, it's important to note that we assume you already have some basic familiarity with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS" rel="noopener noreferrer"&gt;CSS&lt;/a&gt; and Next.js and have already created a Next.js project. In case you haven't, don't worry! You can visit &lt;a href="https://nextjs.org/docs/getting-started" rel="noopener noreferrer"&gt;this link&lt;/a&gt; for a step-by-step guide on how to get started with Next.js. If you're new to this, don't fret! We'll make sure you're sailing smoothly in no time. Let's get started with our first part:&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up and installing TailwindCSS in our Next.js project
&lt;/h2&gt;

&lt;p&gt;There are different methods available to install TailwindCSS but for the essence of this article we'll be using the &lt;a href="https://tailwindcss.com/docs/installation/framework-guides" rel="noopener noreferrer"&gt;Framework Guides installation&lt;/a&gt; method. We'll also need to use a package manager such as npm or yarn. Choose the one that you prefer, depending on your project's setup. For this tutorial, we'll be using npm but the steps should be similar for yarn as well. Open your terminal and navigate to your Next.js project folder, and enter the following command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will install TailwindCSS, PostCSS, and Autoprefixer as development dependencies in your project. Then enter the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx tailwindcss init -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate a tailwind.config.js file in your project directory where your customizations can be done. The -p flag tells TailwindCSS to generate a postcss.config.js file as well. To configure TailwindCSS for your specific project setup, you'll need to add a template to the content array in the Tailwind config file. For example, if your project has an app folder, you'll need to add the app template to the content array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"./app/**/*.{js,ts,jsx,tsx}",
"./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
"./src/**/*.{js,ts,jsx,tsx}",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, it is assumed that the project has an app, pages, components and src folder.&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%2F7knkwmmai4yqwdk27365.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%2F7knkwmmai4yqwdk27365.PNG" alt="Tailwind configuration" width="726" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this image, the pages folder is what we have in the project hence, the pages template was used. Once you've updated the Tailwind config file, open the globals.css file in your project's styles directory and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will configure Tailwind to apply its base, component, and utility styles to your project.&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%2F0yldqiam7lvpceihuxwu.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%2F0yldqiam7lvpceihuxwu.PNG" alt="Tailwind directives" width="488" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now start using Tailwind to style our content. Add the following code in your index.js file in your pages directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function Home() {
  return (
    &amp;lt;h1 className="text-3xl font-bold underline"&amp;gt;
      Welcome to tailwind world!
    &amp;lt;/h1&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The className 'text-3xl' will set the font size to 3 times the base font size, 'font-bold' will make the font bold and 'underline' will underline the text. Once that is done, run your development server using the following command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will start the Next.js development server and you can access your application by visiting &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; in your web browser.&lt;/p&gt;

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

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

&lt;p&gt;We've covered the basics of installation and getting started with TailwindCSS in your Next.js project, as well as how to style your content using TailwindCSS classes. Keep in mind that this is just the beginning! There are a lot more techniques and features of TailwindCSS and Next.js to explore, and there'll be more articles to help you become a pro in no time. Happy coding😁😁!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Streamlining Your React Development with Next.js: A Guide to Migration for Developers</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Sun, 26 Mar 2023 17:03:35 +0000</pubDate>
      <link>https://forem.com/icyy_bee/streamlining-your-react-development-with-nextjs-a-guide-to-migration-for-developers-385</link>
      <guid>https://forem.com/icyy_bee/streamlining-your-react-development-with-nextjs-a-guide-to-migration-for-developers-385</guid>
      <description>&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; has been one of the most popular frontend frameworks for building web applications and it has been widely used by developers all over the world. However, using the outdated create-react-app CLI (Command Line Interface) to start new projects can be tedious and time-consuming, especially when it comes to configuring server-side rendering (SSR), handling image optimization, and improving performance. &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To address these challenges, &lt;strong&gt;Next.js&lt;/strong&gt;, a popular React framework, was introduced to streamline the development process by providing a set of tools and features that help to optimize the development process, improve the user experience, and make the project more scalable. &lt;a href="https://nextjs.org/docs" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this guide, I will walk you through the benefits of migrating to Next.js and provide a step-by-step guide on how to migrate your React project to Next.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Migrating to Next.js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Server-side Rendering: Next.js comes with built-in support for &lt;a href="https://www.debugbear.com/blog/server-side-rendering" rel="noopener noreferrer"&gt;server-side rendering&lt;/a&gt;(SSR), which allows you to pre-render the initial HTML on the server, and deliver it to the client, resulting in faster load times and improved SEO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic Code Splitting: Next.js automatically splits your code into small chunks and loads only the necessary parts, which improves the performance of your application, especially for larger applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Image Optimization: Next.js provides an automatic image optimization feature that compresses images and serves them in WebP format, resulting in faster load times and improved performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Static Site Generation: Next.js supports &lt;a href="https://www.freecodecamp.org/news/static-site-generation-with-nextjs/" rel="noopener noreferrer"&gt;static site generation&lt;/a&gt;, which allows you to pre-render your pages at build time, resulting in faster load times and improved SEO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic Prefetching: Next.js automatically prefetches links that are in the user's viewport, resulting in faster navigation and improved user experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Guide to Migrate Your React Project to Next.js
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a New Next.js Project&lt;/strong&gt;&lt;br&gt;
The first step is to create a new Next.js project using the command-line interface. You can create a new project by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a new Next.js app in a directory of your choosing.&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%2F4x6rdmxcef30n57sx50b.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%2F4x6rdmxcef30n57sx50b.PNG" alt="Install package" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
During the project creation process, you may also be prompted to install additional optional packages, depending on your project requirements. You can choose to install these packages or skip them for now and install them later as needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Run the Development Server&lt;/strong&gt;&lt;br&gt;
Once you have made all the necessary installments, you can run the development server using the following command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will start the Next.js development server, and you can access your application by visiting &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; in your web browser.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Copy React Components&lt;/strong&gt;&lt;br&gt;
Copy all your existing React components from your previous project into the pages directory of your new Next.js project. Next.js requires all pages to be inside the pages directory, so you will need to adjust your file structure accordingly.&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%2Fiarto9n4gs8isv52v2m5.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%2Fiarto9n4gs8isv52v2m5.PNG" alt="New next project" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Adjust Routing&lt;/strong&gt;&lt;br&gt;
Next.js uses a &lt;a href="https://nextjs.org/docs/routing/introduction" rel="noopener noreferrer"&gt;file-system based routing system&lt;/a&gt;, which means that the file name determines the route path. For example, a file named about.js in the pages directory will create a route path /about.&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%2Foi1qpr35xrx4opqm9ggw.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%2Foi1qpr35xrx4opqm9ggw.PNG" alt="about file" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fectk465rzdfw3lehdzj1.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%2Fectk465rzdfw3lehdzj1.PNG" alt="about page" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
You will need to adjust your routing accordingly to match the new file structure.&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%2Fs3ylggw14divxi5uwvo4.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%2Fs3ylggw14divxi5uwvo4.PNG" alt="File hierachy" width="237" height="728"&gt;&lt;/a&gt; &lt;br&gt;
In this image, index.js is the default page for the root URL /, about.js is the page for the URL path /about, contact/index.js is the page for the URL path /contact and shop/index.js is the page for the URL path /shop. &lt;/p&gt;

&lt;p&gt;The shop/[slug].js file is a dynamic route that matches any URL path that starts with /shop/ and has a segment after it. The key "slug" is actually a common term used in web development to refer to a portion of a URL that identifies a particular resource on a website. For example, in the URL &lt;a href="http://localhost:3000/shop/shoes" rel="noopener noreferrer"&gt;http://localhost:3000/shop/shoes&lt;/a&gt;, "shoes" is the slug that identifies the specific product being viewed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Adjust the Entry Point&lt;/strong&gt;&lt;br&gt;
Next.js requires an entry point file called index.js in the pages directory. For example, if you moved the about.js page to a new directory called company, you would need to update the entry point file to reflect the new location of the about.js page. To do this, you could either choose to create a new index.js file or modify the existing one that Next.js provides by default and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import About from './company/about';

export default About;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I imported the About page component from the new location ./company/about. This tells Next.js that the About page should be the new entry point for your application, so when a user navigates to the root URL of your application, the content of the About page will be rendered instead of the previous index.js page. You can adjust the entry point file in a similar way to match your new file structure.&lt;/p&gt;

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

&lt;p&gt;Migrating your React project to Next.js can streamline your development process and improve the performance and user experience of your application. By following the step-by-step guide provided in this article, you can easily migrate your project to Next.js and take advantage of its many features and benefits. Happy Coding!&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Ultimate Guide to Converting React Apps to Progressive Web Apps</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Sat, 11 Mar 2023 19:54:35 +0000</pubDate>
      <link>https://forem.com/icyy_bee/the-ultimate-guide-to-converting-react-apps-to-progressive-web-apps-1pnp</link>
      <guid>https://forem.com/icyy_bee/the-ultimate-guide-to-converting-react-apps-to-progressive-web-apps-1pnp</guid>
      <description>&lt;p&gt;Do you want to take your React app to the next level and offer your users an app-like experience without the struggle of downloading a native app? Then Progressive Web Apps (PWAs) are the answer! PWAs offer offline functionality, push notifications and more, making them a game-changer in web development. In this article, I'll walk you through the steps on converting your React app to a PWA, allowing you to deliver an immersive, app-like experience to your users.&lt;/p&gt;

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

&lt;p&gt;To get familiar with the terms I will be referring to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Progressive Web Apps (PWAs)&lt;/strong&gt; are a new development trend that offers users an app-like experience on their mobile devices without installing a native app. PWAs are essentially websites that run on the mobile browser and can be stored on a device. They create an icon that looks and feels like a mobile application when opened. &lt;a href="https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service workers&lt;/strong&gt; are like special helpers that sit between your browser and the server. They can help your website work better by allowing it to be accessed even if you don't have an internet connection. They can also make your website faster by caching (storing) certain data so that it doesn't have to be reloaded every time you visit the website. &lt;a href="https://developer.chrome.com/docs/workbox/service-worker-overview/" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web App Manifest&lt;/strong&gt; is a JSON file that describes your app and provides metadata about it, such as its name, icons, and start URL. The manifest is used by the browser to add your app to the home screen and to provide a more app-like experience. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Manifest" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having covered the key terms and concepts, we can now dive straight into the steps required to convert your React app to a Progressive Web App.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create a new React app
&lt;/h2&gt;

&lt;p&gt;To begin you must create a new React project with cra-template-pwa template, which includes the necessary configurations and files for building a progressive web app. Enter the following command into your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app my-app --template cra-template-pwa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Enable service worker functionality
&lt;/h2&gt;

&lt;p&gt;Upon creating a new React app, the service worker files are automatically included. To enable the app to function as a PWA, you need to modify the default service worker registration from 'unregister()' to 'register()' in your index.js file. This change ensures that the service worker is registered as a persistent background process, allowing your app to behave like a PWA even after users close their browser or turn off their device. It should look 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%2Fs104nt94nsy4fo64cw9u.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%2Fs104nt94nsy4fo64cw9u.PNG" alt="Service worker image" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Enable your Web app manifest
&lt;/h2&gt;

&lt;p&gt;To customize the appearance of your PWA, you can edit the manifest.json file located in the public directory of your React app. For example, if you want to change the name of your app, you can modify the name property in this file. I will be changing the name of my PWA using this approach.&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%2Frjlldz971zbe2hgxd5po.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%2Frjlldz971zbe2hgxd5po.PNG" alt="manifest.json image" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Editing App.js to Customize Your React PWA
&lt;/h2&gt;

&lt;p&gt;You can add any content you want to your App.js file. Here is an example of what my App.js file looks like:&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%2F5e9xuddrsmaum9le6opx.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%2F5e9xuddrsmaum9le6opx.PNG" alt="app.js image" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Build the App
&lt;/h2&gt;

&lt;p&gt;The next step is to build the app. This will create a production-ready version of your app in the build directory. To build the app, run the following command in the terminal:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Serve the App
&lt;/h2&gt;

&lt;p&gt;The final step is to serve the production-ready version of your app located in the build directory. This will create a local server and serve your PWA directly from the build folder. First run the following command to install 'serve' package globally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g serve
//or
yarn global add serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run this command to start a server at &lt;a href="http://localhost:5000" rel="noopener noreferrer"&gt;http://localhost:5000&lt;/a&gt; (or another available port) and serve your PWA from the build directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx serve -s build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F1ps0g8lrlphjtbiqyxna.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%2F1ps0g8lrlphjtbiqyxna.PNG" alt="terminal image" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you run your app in your browser it should look 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%2Fwv9zj7u2gzogidqntrl8.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%2Fwv9zj7u2gzogidqntrl8.PNG" alt="react pwa image" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also add a prompt for ios using the 'react-ios-pwa-prompt' library by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i react-ios-pwa-prompt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in your index.js file, you should import the PWAPrompt component from the 'react-ios-pwa-prompt' library using the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import PWAPrompt from 'react-ios-pwa-prompt';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, wrap your app using the PWAPrompt component and the React.StrictMode component as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;React.StrictMode&amp;gt;
  &amp;lt;App /&amp;gt;
  &amp;lt;PWAPrompt
    promptOnVisit={1}
    timesToShow={3}
    copyClosePrompt="Close"
    permanentlyHideOnDismiss={false}
  /&amp;gt;
&amp;lt;/React.StrictMode&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The promptOnVisit prop determines when the prompt will be displayed, with a value of 1 indicating that it will be displayed on the first visit. The timesToShow prop determines how many times the prompt will be shown. The copyClosePrompt prop sets the text for the close button, and the permanentlyHideOnDismiss prop determines whether the prompt will be permanently hidden if dismissed.&lt;/p&gt;

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

&lt;p&gt;Congratulations! In this article we walked through the process of converting a React app to a Progressive Web App. We started by understanding the key features and requirements of a PWA, including a service worker and a manifest file and how to implement them. Additionally, we explored advanced PWA features, such as push notifications and home screen icons and title and learned how to incorporate them into a React app. Happy coding!&lt;/p&gt;

</description>
      <category>pwa</category>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Creating an App with React, Apollo, and GraphQL: A Step-by-Step Guide to Fetching Data and Error Handling</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Sat, 18 Feb 2023 22:12:54 +0000</pubDate>
      <link>https://forem.com/icyy_bee/creating-an-app-with-react-apollo-and-graphql-a-step-by-step-guide-to-fetching-data-and-error-handling-5bgh</link>
      <guid>https://forem.com/icyy_bee/creating-an-app-with-react-apollo-and-graphql-a-step-by-step-guide-to-fetching-data-and-error-handling-5bgh</guid>
      <description>&lt;p&gt;Are you looking to build a modern web application with scalable, data-driven user interfaces? Then this article is for you. In this step-by-step guide, I'll walk you through the steps required to fetch data from a GraphQL endpoint using Apollo Client in a React application, and how to handle errors that may occur during the process.&lt;/p&gt;

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

&lt;p&gt;In case you are not familiar with the terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GraphQL&lt;/strong&gt; is a powerful query language for APIs (Application Programming Interface) that was developed by Facebook. It provides a more efficient, powerful, and flexible alternative to REST APIs (Representational State Transfer Application Programming Interface) for building modern web applications. With GraphQL, instead of requesting pre-defined data structures from a server, clients can specify exactly what data they need and receive a JSON (JavaScript Object Notation) object that matches their request. This means that you can retrieve only the data you need, reducing the amount of network traffic and improving performance. &lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apollo Client&lt;/strong&gt; is a JavaScript library that provides a way to interact with a GraphQL API from a client-side application. It allows you to fetch data from a GraphQL server, cache it locally, and manage its state in your application. It provides a simple and flexible way to query and mutate data using GraphQL, making it easy to build powerful, data-driven user interfaces. &lt;a href="https://www.apollographql.com/docs/react/" rel="noopener noreferrer"&gt;See Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
You'll need to have some basic knowledge of React and JavaScript.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up the Environment
&lt;/h2&gt;

&lt;p&gt;Before we get started, let's make sure we have the necessary tools and libraries installed. We'll be using create-react-app to create a new React project, and Apollo Client to query our GraphQL endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app my-app
cd my-app
npm install @apollo/client graphql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Defining the GraphQL Endpoint
&lt;/h2&gt;

&lt;p&gt;To fetch data from a GraphQL API, we need to define the endpoint that we'll be making requests to. For this example, we'll use the following endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://countries.trevorblades.com/graphql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setting up Apollo Client
&lt;/h2&gt;

&lt;p&gt;Next, we'll set up Apollo Client in our index.js file and wrap our App component with the Apollo Provider. Our index.js file should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';

const client = new ApolloClient({
  uri: 'https://countries.trevorblades.com/graphql',
  cache: new InMemoryCache(),
});

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;ApolloProvider client={client}&amp;gt;
      &amp;lt;App /&amp;gt;
    &amp;lt;/ApolloProvider&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code creates a new instance of ApolloClient, and sets the URI to our GraphQL endpoint. It wraps our App in the ApolloProvider passing client object as a prop. You might be wondering why "uri" (Uniform Resource Identifier) and not "url"(Uniform Resource Locator) and that's because in the context of Apollo Client, "uri" refers to the location of the GraphQL server that the client will connect to in order to fetch data. This is likely because the URI includes not only the location of the server, but also additional details such as the protocol and any query parameters, while a URL refers specifically to the location of a resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Query Component
&lt;/h2&gt;

&lt;p&gt;Now that we have our GraphQL endpoint and Apollo Client set up, we can now fetch data from the API. In our App.js file paste in the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useQuery, gql } from '@apollo/client';

const GET_LOCATIONS = gql`
  query GetLocations {
    country(code: "BR") { //Add your query here
      name
      native
      capital
      emoji
      currency
      languages {
        code
        name
      }
    }
  }
`;

const App = () =&amp;gt; {
 const { loading, error, data } = useQuery(GET_LOCATIONS);
 const {name, currency, capital, native, emoji, languages} = data?.country || {};

 if (loading) return &amp;lt;p&amp;gt;Loading...&amp;lt;/p&amp;gt;;
 if (error) return &amp;lt;p&amp;gt;Error: {error.message}&amp;lt;/p&amp;gt;;

return (
 &amp;lt;div key={name}&amp;gt;
      &amp;lt;h2&amp;gt;Let's Know Our Countries 🚀&amp;lt;/h2&amp;gt;
      &amp;lt;h3&amp;gt;Country: {name}&amp;lt;/h3&amp;gt;
      &amp;lt;br /&amp;gt;
      &amp;lt;b&amp;gt;About this location:&amp;lt;/b&amp;gt;
      &amp;lt;ol&amp;gt;
        &amp;lt;li&amp;gt;Capital is known as {capital}&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Its symbol is {emoji}&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Its native is {native}&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Currency: {currency}&amp;lt;/li&amp;gt; 
        {languages?.map((lang) =&amp;gt; (
          &amp;lt;ol key={lang.code}&amp;gt;
            &amp;lt;li&amp;gt;Language: {lang.name}&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;Code: {lang.code}&amp;lt;/li&amp;gt;
          &amp;lt;/ol&amp;gt;
        ))}
      &amp;lt;/ol&amp;gt;
 &amp;lt;/div&amp;gt;
);

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code uses the useQuery hook from Apollo Client to take a GraphQL query as its argument and return an object that contains the data, loading, and error states for that query. In this case, the query is defined using the gql template literal function and assigned to a variable called GET_LOCATIONS. &lt;br&gt;
The App component then calls useQuery with GET_LOCATIONS as its argument, and destructures the resulting loading, error, and data states. The data state is destructured further to get the name, currency, capital, native, emoji, and languages fields from the GraphQL response. It also handles loading and error states and returns the UI to be displayed once the data is loaded.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running the Application
&lt;/h2&gt;

&lt;p&gt;Finally, we can run our application to see the results of our code. Run the following command in your terminal:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will start the development server and open up a new tab in your web browser displaying the application. It should look 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%2Fo7p90k1xxc1qw4jtg9um.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%2Fo7p90k1xxc1qw4jtg9um.PNG" alt="GraphQl UI rendered" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Congratulations! In this article, we walked through the process of fetching data from a GraphQL API using Apollo Client in our React application and how to handle errors that may occur during the process. With this knowledge, you can start building powerful, data-driven user interfaces on your own. Happy coding!&lt;/p&gt;

</description>
      <category>gratitude</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Firebase Error: Unauthorized Domain in Deployed Site</title>
      <dc:creator>Beatrice Egumandi</dc:creator>
      <pubDate>Mon, 30 Jan 2023 10:57:23 +0000</pubDate>
      <link>https://forem.com/icyy_bee/firebase-error-unauthorized-domain-in-deployed-site-50ed</link>
      <guid>https://forem.com/icyy_bee/firebase-error-unauthorized-domain-in-deployed-site-50ed</guid>
      <description>&lt;p&gt;Hello Everyone! In this article we will be exploring the "FirebaseError: Firebase: auth/unauthorized-domain" error. We will be discussing what the error means, why it is displayed and how to resolve it.&lt;/p&gt;

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

&lt;p&gt;Firebase is a popular backend platform used for developing web and mobile applications. It provides various features such as real-time database, authentication, hosting, and more. However, sometimes users may encounter errors during deployment, and one of the common errors is "auth/unauthorized Domain." This error occurs when the domain used for hosting the website is not authorized in the Firebase console.&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%2Fk8fr5z9nohdatkjxzcdb.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%2Fk8fr5z9nohdatkjxzcdb.PNG" alt="Error message" width="800" height="106"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Here's how you can resolve this issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the Firebase Console and select your project.&lt;/li&gt;
&lt;li&gt;Navigate to the Build section and click on the "Authentication" menu.&lt;/li&gt;
&lt;li&gt;Go to the "Settings" bar and click on "Authorized domains" and add your domain link using the "Add domain" button.&lt;/li&gt;
&lt;li&gt;Once the domain has been verified, refresh the website again.&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%2Fequvjxvo16f00s9nuaot.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%2Fequvjxvo16f00s9nuaot.PNG" alt="Solution Image" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might have been wondering why your firebase authentication is working perfectly on your local host but not on your deployed site and this is because by default, Firebase allows access to your website through the local host (i.e. localhost:3000), which makes it convenient for development and testing purposes. &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%2Fbplzsnv0ccox390ydxtx.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%2Fbplzsnv0ccox390ydxtx.PNG" alt="localhost whitelisted" width="481" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In summary, when you want to deploy your website to a custom domain, you need to add that domain to the list of authorized domains in the Firebase Console. By white-listing your custom domain, you can ensure that your website is accessible only through authorized domains and improve the security of your data.&lt;/p&gt;

&lt;p&gt;Thank you for reading this article!&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>react</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
