<?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: Chidubem Okoli</title>
    <description>The latest articles on DEV Community by Chidubem Okoli (@duubemmm).</description>
    <link>https://dev.to/duubemmm</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%2F2185225%2Ff6ce66b0-eb2d-4bf0-8eab-5b60889078bd.png</url>
      <title>DEV Community: Chidubem Okoli</title>
      <link>https://dev.to/duubemmm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/duubemmm"/>
    <language>en</language>
    <item>
      <title>Set Up SSH Keys on Windows: A Step-by-Step Guide</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Tue, 02 Sep 2025 08:08:57 +0000</pubDate>
      <link>https://dev.to/duubemmm/set-up-ssh-keys-on-windows-a-step-by-step-guide-43d5</link>
      <guid>https://dev.to/duubemmm/set-up-ssh-keys-on-windows-a-step-by-step-guide-43d5</guid>
      <description>&lt;p&gt;Secure Shell (SSH) is a security protocol that creates a highly secure connection between your computer and GitHub. It uses a pair of cryptographic keys—a public key you share and a private key you keep safe—to verify your identity.&lt;/p&gt;

&lt;p&gt;The main benefit of using SSH keys is convenience and security. Once set up, you can connect to GitHub to push and pull code without having to enter your username and personal access token every time.&lt;/p&gt;

&lt;p&gt;Here's a step-by-step guide on how to set up your SSH keys in a Windows environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Check for Existing SSH Keys&lt;/strong&gt;&lt;br&gt;
First, let's see if you already have an SSH key pair. It's good practice to avoid creating new ones if you don't have to.&lt;/p&gt;

&lt;p&gt;a) Open &lt;strong&gt;PowerShell&lt;/strong&gt; (press the Windows key, type PowerShell, and press Enter).&lt;/p&gt;

&lt;p&gt;b) The default directory is /.ssh. Run the following command to list files in the .ssh directory, which is where keys are typically stored:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -a ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;c) Look for a pair of files named something like id_rsa and id_rsa.pub, or id_ed25519 and id_ed25519.pub. If you see a .pub file, you already have a key and can skip to &lt;strong&gt;Step 3&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Alternatively, you can get the key by typing into the powershell terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Generate a New SSH Key Pair&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don't have an existing key, you'll need to create one. We'll generate a modern and secure Ed25519 key.&lt;/p&gt;

&lt;p&gt;a) In your PowerShell terminal, run the following command. Make sure to replace "&lt;a href="mailto:your_email@example.com"&gt;your_email@example.com&lt;/a&gt;" with the email address associated with your GitHub account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "your_email@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b) The command will prompt you to choose a location to save the key. The default location (~/.ssh/id_ed25519) is perfect, so just press Enter.&lt;/p&gt;

&lt;p&gt;c) Next, you'll be asked to enter a passphrase. 🔐 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A passphrase adds an extra layer of security; if someone gains access to your computer, they still can't use your key without knowing the passphrase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's highly recommended to use one, but you can leave it blank by pressing Enter twice.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Enter passphrase (empty for no passphrase): [Type a passphrase]
&amp;gt; Enter same passphrase again: [Type passphrase again]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You've now created two files in your ~/.ssh directory: id_ed25519 (your private key) and id_ed25519.pub (your public key). Never share your private key!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Add Your SSH Key to the ssh-agent&lt;/strong&gt;&lt;br&gt;
The ssh-agent is a background program that securely stores your private key and manages its passphrase so you don't have to re-enter it constantly.&lt;/p&gt;

&lt;p&gt;a) First, ensure the ssh-agent service is running. This command will start it if it isn't active.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start-SshAgent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b) Now, add your private SSH key to the agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;c) If you created a passphrase in the previous step, you will be prompted to enter it now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add Your Public SSH Key to GitHub&lt;/strong&gt;&lt;br&gt;
Now you need to tell GitHub about your public key so it can grant you access.&lt;br&gt;
a) Now you need to copy your public SSH key. To do this, we’re going to use a command called cat to read the file to the console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b) Open your browser and navigate to GitHub.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click your profile picture in the top-right corner, then click Settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the left sidebar, click SSH and GPG keys.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;c) Click the New SSH key button.&lt;/p&gt;

&lt;p&gt;d) In the Title field, give your key a descriptive name, like "My Windows Laptop" or "Work PC".&lt;/p&gt;

&lt;p&gt;e) Click inside the Key field and paste your key by pressing Ctrl + V.&lt;/p&gt;

&lt;p&gt;f) Finally, click Add SSH key. You may be asked to enter your GitHub password to confirm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Test Your SSH Connection&lt;/strong&gt; &lt;br&gt;
Let's make sure everything is working correctly.&lt;/p&gt;

&lt;p&gt;a) Back in your PowerShell terminal, run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b) You may see a warning about the authenticity of the host. This is normal for the first connection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The authenticity of host 'github.com (IP ADDRESS)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type yes and press Enter.&lt;/p&gt;

&lt;p&gt;c) If everything is set up correctly, you'll see a welcome message with your username! 🎉&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.

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

&lt;/div&gt;



&lt;p&gt;You're all set! You can now clone, pull, and push to your GitHub repositories using SSH without needing to enter your credentials every time.&lt;/p&gt;

</description>
      <category>github</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Fixed Firebase’s “Unauthorized Domain” Error While Building Resumpire</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Wed, 09 Jul 2025 14:52:58 +0000</pubDate>
      <link>https://dev.to/duubemmm/how-i-fixed-firebases-unauthorized-domain-error-while-building-resumpire-2567</link>
      <guid>https://dev.to/duubemmm/how-i-fixed-firebases-unauthorized-domain-error-while-building-resumpire-2567</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Problem:&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%2F64ke1z161s0dp8hqt7lv.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%2F64ke1z161s0dp8hqt7lv.jpg" alt="Firebase Error" width="800" height="385"&gt;&lt;/a&gt;&lt;br&gt;
I was deep into building &lt;a href="//resumpire.vercel.app"&gt;resumpire.vercel.app&lt;/a&gt; (a resume builder app) when I hit a wall. Firebase kept rejecting my authentication requests with an “Unauthorized Domain” error.&lt;/p&gt;

&lt;p&gt;At first, I was running through all the usual suspects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Maybe I broke something in my codebase?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Could there be a dependency version conflict?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there a typo in my config?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After scouring my codebase trying to find the bug, I finally spotted the issue.&lt;br&gt;
Turns out, the issue was much simpler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Culprit: Firebase’s Authorized Domain List&lt;/strong&gt;&lt;br&gt;
Firebase Authentication only allows requests from domains you explicitly authorize. That means:&lt;/p&gt;

&lt;p&gt;If you’re testing locally, you must add &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt; (or your custom dev URL) to Firebase’s Authorized Domains list.&lt;/p&gt;

&lt;p&gt;If you’re deploying, your live domain (e.g., resumpire.vercel.app) needs to be added too.&lt;/p&gt;

&lt;p&gt;My deployed domain resumpire.vercel.app wasn't in the Firebase Authorized Domains list. I'd only added localhost during development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I Fixed It&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Opened Firebase Console → Authentication → Settings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scrolled to “Authorized Domains”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added my production domain (resumpire.vercel.app)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reloaded the app → Auth worked instantly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lesson learned: Always check the docs (and the obvious settings) first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
This wasn’t just about fixing an error—it reinforced a bigger lesson:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Small oversights cause big blockers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reading docs &amp;gt; guessing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every error is an avenue to learn and grow which makes you a better dev.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How I Built an AI-Powered Text Processor Using Chrome AI API.</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Thu, 27 Mar 2025 08:40:36 +0000</pubDate>
      <link>https://dev.to/duubemmm/how-i-built-an-ai-powered-text-processor-using-chrome-ai-api-1j0f</link>
      <guid>https://dev.to/duubemmm/how-i-built-an-ai-powered-text-processor-using-chrome-ai-api-1j0f</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;When I first discovered the Chrome AI API, I recognized its potential immediately. The ability to integrate AI-powered text processing directly into a web app—without requiring a backend—opens up new possibilities for seamless user experiences. Using React and TailwindCSS, I built a practical AI Text Processor capable of summarizing, translating, and detecting languages entirely in the browser.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll walk you through:&lt;br&gt;
✔ Why the Chrome AI API is a game-changer&lt;br&gt;
✔ Step-by-step setup (including troubleshooting tips)&lt;br&gt;
✔ How I built the UI with React &amp;amp; TailwindCSS&lt;br&gt;
✔ Lessons learned and where to go next&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup &amp;amp; Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before diving in, you’ll need:&lt;/p&gt;

&lt;p&gt;1) Comply with Google’s AI Policies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure your use case follows Google’s Generative AI Prohibited Use Policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) Install Chrome Canary&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download Chrome Canary (v129.0.6639.0 or newer).
Why Canary? The API is experimental and only available here for now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) Check Storage Requirements&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum 22GB free storage. If storage drops below 10GB, Chrome automatically deletes the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4) Enable the Summarization API&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open chrome://flags/#summarization-api-for-gemini-nano&lt;/li&gt;
&lt;li&gt;Select Enabled&lt;/li&gt;
&lt;li&gt;Relaunch Chrome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5) Force-Download the AI Model&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open DevTools (F12) and run:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;await ai.summarizer.create(); // Triggers model download&lt;br&gt;
await ai.summarizer.capabilities(); // Check status&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Repeat the second command until it returns "readily" (~3-5 mins).&lt;/p&gt;

&lt;p&gt;Stuck? If you see:&lt;/p&gt;

&lt;p&gt;"The model was available but there was no execution config available for the feature."&lt;/p&gt;

&lt;p&gt;Wait 24 hours and retry (Google rolls out access gradually).&lt;/p&gt;

&lt;p&gt;Troubleshooting Tip: For full documentation, check Chrome’s AI API Guide &lt;a href="https://docs.google.com/document/d/1bzpeKk4k26KfjtR-_d9OuXLMpJdRMiLZAOVNMuFIejk/edit?tab=t.0" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Chrome AI API?
&lt;/h2&gt;

&lt;p&gt;This API brings serverless AI to the browser with:&lt;br&gt;
✅ No backend needed – Runs entirely client-side.&lt;br&gt;
✅ Blazing fast – Responses in milliseconds.&lt;br&gt;
✅ Privacy-focused – No data sent to third-party servers.&lt;br&gt;
✅ Easy integration – Just call ai. methods like translate() or summarize().&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Features
&lt;/h2&gt;

&lt;p&gt;The AI Text Processor includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Text Input - A responsive text area for content entry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Language Detection - Automatic identification of input text language&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Text Summarization - Concise distillation of key information&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multilingual Translation - Conversion between supported languages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accessible Interface - Screen reader compatible with keyboard navigation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Error Handling - Graceful failure modes and user feedback&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;React – UI components &amp;amp; state management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TailwindCSS – Rapid styling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chrome AI API – ai.summarizer, ai.translator, ai.detector.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building the App
&lt;/h2&gt;

&lt;p&gt;1) Initialize the Project&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm create vite@latest ai-text-processor --template react&lt;br&gt;
cd ai-text-processor&lt;br&gt;
npm install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2) Add TailwindCSS&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -D tailwindcss postcss autoprefixer&lt;br&gt;
npx tailwindcss init -p&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configure tailwind.config.js:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export default {&lt;br&gt;
  content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],&lt;br&gt;
  theme: { extend: {} },&lt;br&gt;
  plugins: [],&lt;br&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add to index.css:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@tailwind base;&lt;br&gt;
@tailwind components;&lt;br&gt;
@tailwind utilities;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3) Create the UI&lt;br&gt;
A simple layout with:&lt;/p&gt;

&lt;p&gt;A textarea for input.&lt;/p&gt;

&lt;p&gt;Buttons for actions (Summarize/Translate/Detect).&lt;/p&gt;

&lt;p&gt;A results panel (conditional rendering with error handling).&lt;/p&gt;

&lt;p&gt;4) Integrate the Chrome AI API&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const handleSummarize = async () =&amp;gt; {&lt;br&gt;
  try {&lt;br&gt;
    const summary = await ai.summarizer.summarize(text);&lt;br&gt;
    setResult(summary);&lt;br&gt;
  } catch (error) {&lt;br&gt;
    setResult("Error: " + error.message);&lt;br&gt;
  }&lt;br&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;More languages – Expand translation support.&lt;/p&gt;

&lt;p&gt;Offline mode – Cache results for poor connectivity.&lt;/p&gt;

&lt;p&gt;Custom prompts – Let users tweak summarization style.&lt;/p&gt;

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

&lt;p&gt;The Chrome AI API opens up exciting possibilities for browser-based AI apps. While still experimental, it’s a glimpse into a future where frontend devs can leverage AI without backend complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the demo &amp;amp; code
&lt;/h2&gt;

&lt;p&gt;GitHub Repo Link &lt;a href="https://github.com/Duubemmm/hng12-stage3-AI-Text-Processing-App" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;br&gt;
Live Link &lt;a href="https://hng12-stage3-ai-text-processing-app.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Note: This implementation is currently available only for desktop platforms&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>api</category>
      <category>ai</category>
    </item>
    <item>
      <title>Recreating the Interswitch Homepage with React and TailwindCSS.</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Tue, 14 Jan 2025 13:24:30 +0000</pubDate>
      <link>https://dev.to/duubemmm/recreating-the-interswitch-homepage-with-react-and-tailwindcss-2ppf</link>
      <guid>https://dev.to/duubemmm/recreating-the-interswitch-homepage-with-react-and-tailwindcss-2ppf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recreating a modern, visually appealing landing page is always an exciting challenge. This week, I focused on building a replica of the Interswitch homepage using React and TailwindCSS. This article provides a technical walkthrough of the process, from project setup to implementing reusable components and styling. Here's how I approached it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Setup with Vite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vite has become my go-to tool for React projects due to its blazing-fast build times and simplicity. The setup process involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm create vite@latest interswitch-clone --template react
cd interswitch-clone
npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the development server running, I was ready to start coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structuring Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Breaking the homepage into reusable components was essential for maintainability and scalability. Below are a few key components I implemented. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NavBar Component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from "react";
import { FaBars, FaTimes } from "react-icons/fa";
import { FiChevronDown } from "react-icons/fi";

const Navbar = () =&amp;gt; {
  const [isOpen, setIsOpen] = useState(false);
  const [dropdownOpen, setDropdownOpen] = useState(false);

  const navLinks = [
    { title: "About Us", hasDropdown: true },
    { title: "What We Do", hasDropdown: true },
    { title: "Financial Inclusion", hasDropdown: false },
    { title: "Corporate Responsibility", hasDropdown: false },
    { title: "News &amp;amp; Insights", hasDropdown: false },
  ];

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stats Component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Stats = () =&amp;gt; {
  return (
    &amp;lt;div className="bg-blue-50 py-12"&amp;gt;
      &amp;lt;div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"&amp;gt;
        &amp;lt;div className="flex flex-col gap-8"&amp;gt;
          &amp;lt;div className="flex flex-col md:flex-row items-start gap-8"&amp;gt;
            &amp;lt;h2 className="text-3xl md:text-4xl font-semibold text-gray-900 flex-1"&amp;gt;
              Pushing the boundaries of innovation to deliver payment solutions that enable commerce across Africa
            &amp;lt;/h2&amp;gt;
            &amp;lt;div className="flex-1 flex flex-col gap-4"&amp;gt;
              &amp;lt;p className="text-xl text-gray-700"&amp;gt;
                Bespoke payment solutions for your modern lifestyle, business collections, disbursements, and payment processing.
              &amp;lt;/p&amp;gt;
              &amp;lt;button className="bg-blue-950 text-white px-6 py-3 rounded-md hover:bg-blue-900 transition w-fit"&amp;gt;
                Learn More
              &amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
export default Stats;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Styling with TailwindCSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TailwindCSS made styling the components seamless. By leveraging utility classes, I could focus on functionality without writing custom CSS. For example, the hero section below uses Tailwind’s gradient and typography utilities to create an eye-catching design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Hero = () =&amp;gt; {
  return (
    &amp;lt;div className="text-blue-950 pt-6 relative"&amp;gt;
      &amp;lt;div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"&amp;gt;
        &amp;lt;div className="grid md:grid-cols-2 gap-12 items-center"&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;h1 className="text-2xl md:text-7xl mb-6 mt-16 font- text-blue-950"&amp;gt;
              The Gateway To Africa&amp;amp;apos;s Payment Ecosystem
            &amp;lt;/h1&amp;gt;
            &amp;lt;p className="text-xl md:text-xl mb-8 text-black-200"&amp;gt;
              We create and sustain a payment ecosystem that helps 
  commmerce evolve, businesses grow and individuals thrive.
            &amp;lt;/p&amp;gt;
          &amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
     &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;


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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Componentization: Breaking the UI into reusable components ensured better maintainability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TailwindCSS: The utility-first approach made styling intuitive and efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vite: Its fast build times improved the development experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recreating the Interswitch homepage was a rewarding experience that solidified my understanding of React and TailwindCSS. By leveraging modern tools and best practices, I built a scalable and visually appealing landing page. If you’re working on a similar project or have questions, let’s connect in the comments!&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>tailwindcss</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Elevate Your JavaScript Journey: Tackling Projects and Unlocking Features 🚀</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Thu, 05 Dec 2024 17:04:36 +0000</pubDate>
      <link>https://dev.to/duubemmm/elevate-your-javascript-journey-tackling-projects-and-unlocking-features-3mk9</link>
      <guid>https://dev.to/duubemmm/elevate-your-javascript-journey-tackling-projects-and-unlocking-features-3mk9</guid>
      <description>&lt;p&gt;JavaScript is an ever-evolving journey where each project adds a new layer to your skills. Whether you're building a ticketing system or adding functionality to a to-do list, there's always something new to learn! Let me walk you through my recent experiments, lessons, and insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a Ticketing System 🎟️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When working on a ticket system, I wanted to level it up by allowing users to input any number of tickets instead of relying on predefined buttons. The goal was simple: improve flexibility while keeping the system intuitive.&lt;/p&gt;

&lt;p&gt;Here’s what I learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DOM Manipulation Is Key&lt;/strong&gt;: Capturing input values dynamically and using them effectively in your JavaScript logic is vital.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validations Matter&lt;/strong&gt;: When you let users enter values, ensure you're checking for edge cases like negative numbers or empty inputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iterate &amp;amp; Improve&lt;/strong&gt;: Building on the foundational ticket counter I developed earlier, I realized how important it is to refactor code for scalability.&lt;br&gt;
If you're considering a project like this, start small. Add basic functionality, then challenge yourself to build on top of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding Delete Functionality to a To-Do List ✔️❌&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To-do lists are a staple project for beginners—and for good reason! They offer a practical way to learn about adding and removing elements from the DOM. Recently, I wanted to add a delete button to each item dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Approach&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate Buttons on Item Creation&lt;/strong&gt;: When the user adds a new task, a delete button is created alongside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add Event Listeners Dynamically&lt;/strong&gt;: I attached an event listener to each button to handle the deletion logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parent-Child DOM Interaction&lt;/strong&gt;: Using parentElement, I ensured clicking the delete button would remove its corresponding list item.&lt;br&gt;
Here’s a snippet of the core idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function addTask(taskText) {

  const li = document.createElement("li");
  li.textContent = taskText;

  const deleteBtn = document.createElement("button");
  deleteBtn.textContent = "Delete";


  deleteBtn.addEventListener("click", () =&amp;gt; {
    li.remove();
  });

  li.appendChild(deleteBtn);
  document.querySelector("#task-list").appendChild(li);
}

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

&lt;/div&gt;



&lt;p&gt;With this approach, I learned how important it is to structure your DOM interactions cleanly and avoid cluttered logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned 🧠&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.Experimentation Drives Learning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Projects like these reinforce that theory is nothing without practice. By experimenting with features, I gained a deeper understanding of DOM manipulation, event listeners, and JavaScript logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Simple Features, Big Impact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The smallest changes—like a delete button—can significantly enhance your project's user experience. Don't underestimate the value of small wins!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.Learn in Layers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building on previous projects is the best way to reinforce your skills. I started with a basic ticket counter, then expanded it. Similarly, I took my to-do list from "add-only" to "add-and-delete."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next?🔮&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JavaScript is all about iteration. I’m excited to explore more advanced concepts like input validations, animations, and even local storage to persist data between sessions.&lt;/p&gt;

&lt;p&gt;If you're on a similar journey, start small and stay consistent. Every project you complete is another step forward.&lt;/p&gt;

&lt;p&gt;Let me know in the comments—what’s your favorite beginner-friendly JavaScript project?&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Installing And Running NPM Packages Using The Terminal</title>
      <dc:creator>Chidubem Okoli</dc:creator>
      <pubDate>Mon, 04 Nov 2024 08:57:52 +0000</pubDate>
      <link>https://dev.to/duubemmm/installing-and-running-npm-packages-using-the-terminal-1i09</link>
      <guid>https://dev.to/duubemmm/installing-and-running-npm-packages-using-the-terminal-1i09</guid>
      <description>&lt;p&gt;When working on a JavaScript project, chances are you'll need to install and use npm (Node Package Manager) packages. &lt;/p&gt;

&lt;p&gt;npm is essential for managing libraries and tools that enhance your development process. If you're new to this, here's a step-by-step guide to installing and running npm packages using the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
Install Node.js: Ensure that the recent version of Node.js is installed on your machine, as npm comes bundled with it. You can check if it's installed by running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node -v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm -v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If you don't have it installed, download it from &lt;a href="https://nodejs.org/https://nodejs.org/" rel="noopener noreferrer"&gt;https://nodejs.org/https://nodejs.org/&lt;/a&gt; and follow the installation instructions.&lt;/p&gt;

&lt;p&gt;After confirming it is successfully installed, create a folder for your project or navigate to an existing one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize The Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To start using npm, you need a package.json file, which tracks the project's dependencies and scripts. You can create one by running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You’ll be prompted with some basic questions (like project name, version, description, etc.). You can either answer each or press Enter to accept the defaults.&lt;br&gt;
Alternatively, you can use &lt;code&gt;npm init -y&lt;/code&gt; to create a default package.json file without prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing npm Packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With npm, you can install packages either globally or locally to your project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local Installation: Installs the package in the project directory and adds it to your package.json.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npm install package-name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This installs the package locally. You'll find it under the node_modules folder, and it will be listed in your package.json file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global Installation: Installs the package globally on your system, making it available from any directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npm install -g package-name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This installs the package globally, allowing you to run the package commands directly in any project without needing to install it locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using npm Scripts to Run Commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scripts defined in package.json can simplify common tasks like running tests or starting the server. In your package.json, there’s a "scripts" section where you can define custom commands.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;&lt;br&gt;
"scripts": {&lt;br&gt;
  "start": "node index.js",&lt;br&gt;
  "test": "echo \"Error: no test specified\" &amp;amp;&amp;amp; exit 1"&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
In this example:&lt;/p&gt;

&lt;p&gt;"start" will run "node index.js".&lt;br&gt;
You can replace "test" or "start" with other custom scripts.&lt;/p&gt;

&lt;p&gt;To run a script, use:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm run script-name&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running Installed Packages from the Terminal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you installed a package globally, you can use it directly in the terminal.&lt;br&gt;
For locally installed packages, use npx, which comes bundled with npm:&lt;br&gt;
&lt;code&gt;npx package-name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app my-app&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This command runs the create-react-app package without needing to install it globally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updating and Removing Packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To update a package, use:&lt;br&gt;
&lt;code&gt;npm update package-name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
To remove a package, use:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm uninstall package-name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This command will remove the package from the node_modules folder and from package.json.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
By understanding these basic npm commands, you can confidently install, run, and manage packages in any Node.js project.&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
