<?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: Badejo Emmanuel Adewale</title>
    <description>The latest articles on Forem by Badejo Emmanuel Adewale (@professor12).</description>
    <link>https://forem.com/professor12</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%2F1256493%2F91dee5f6-1c29-4b04-b8af-f42a1c9315e7.png</url>
      <title>Forem: Badejo Emmanuel Adewale</title>
      <link>https://forem.com/professor12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/professor12"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Sat, 14 Feb 2026 10:49:30 +0000</pubDate>
      <link>https://forem.com/professor12/-la7</link>
      <guid>https://forem.com/professor12/-la7</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/isaactony" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F1431652%2Fd0464842-5438-48fd-836d-b71a3d305473.png" alt="isaactony"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/isaactony/what-is-web-hosting-and-how-does-it-work-1ja9" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;What is Web Hosting and How Does It Work?&lt;/h2&gt;
      &lt;h3&gt;Isaac Tonyloi - SWE ・ Jan 13 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hosting&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#web&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webservers&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>hosting</category>
      <category>web</category>
      <category>webservers</category>
    </item>
    <item>
      <title>What better way to understand deeply media apis provided by modern browsers than to build something cool?</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Wed, 22 Oct 2025 16:39:51 +0000</pubDate>
      <link>https://forem.com/professor12/what-better-way-to-understand-deeply-media-apis-provided-by-modern-browsers-than-to-build-something-1733</link>
      <guid>https://forem.com/professor12/what-better-way-to-understand-deeply-media-apis-provided-by-modern-browsers-than-to-build-something-1733</guid>
      <description>&lt;p&gt;In this blog post, I’ll be documenting my approach, tools, implementation details, and services used while building my own Loom-inspired video recorder.&lt;/p&gt;

&lt;p&gt;If you’re an engineer like me and want to dive straight into the code, the repo is available here 👉 &lt;a href="https://github.com/professor-12/loom-clone" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo video
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://loop.oauife.uk/share/e5f64dd3-6632-493c-a931-10ab00d44cdc" rel="noopener noreferrer"&gt;How to create a simple bash script video recorded using loop&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack &amp;amp; Third-Party Dependencies
&lt;/h3&gt;

&lt;p&gt;The project is built using a modern web stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js — App routing, server actions &amp;amp; API routes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React — Component-based UI architecture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PostgreSQL — Database for persisting user and video metadata&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google &amp;amp; GitHub OAuth — Seamless social authentication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisma — Type-safe ORM for database management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TailwindCSS — Rapid styling and responsive design&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understanding Social Auth (From My POV)
&lt;/h3&gt;

&lt;p&gt;I implemented OAuth authentication with both Google and GitHub from scratch, which gave me a deeper understanding of how social authentication works under the hood.&lt;/p&gt;

&lt;p&gt;This process involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handling the authorization code exchange&lt;/li&gt;
&lt;li&gt;Fetching access tokens&lt;/li&gt;
&lt;li&gt;Retrieving user profile data via Next.js API routes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both providers have slightly different flows, but getting them to work seamlessly together was incredibly rewarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Video Recording with the MediaRecorder API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isRecording&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsRecording&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mediaRecorderRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MediaRecorder&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recordedChunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startRecording&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mediaDevices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUserMedia&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;video&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;mediaRecorderRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MediaRecorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video/webm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;mediaRecorderRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ondataavailable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;recordedChunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;mediaRecorderRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onstop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;recordedChunks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video/webm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Recorded video URL:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;videoUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;mediaRecorderRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;setIsRecording&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling Media Streams &amp;amp; Uploads
&lt;/h2&gt;

&lt;p&gt;Once recording worked, I moved on to uploading videos efficiently.&lt;/p&gt;

&lt;p&gt;I used the &lt;code&gt;FormData&lt;/code&gt; API to send the recorded blob to the backend, which handles storage via Cloudinary.&lt;/p&gt;

&lt;p&gt;This allowed me to easily manage uploads, generate thumbnails, and display the video later on the frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listing &amp;amp; Deleting Videos
&lt;/h2&gt;

&lt;p&gt;I also implemented endpoints, server actions, and a management UI for user videos.&lt;br&gt;
This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetching a user’s uploaded videos&lt;/li&gt;
&lt;li&gt;Deleting videos by ID&lt;/li&gt;
&lt;li&gt;Displaying thumbnails, titles, and timestamps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this, the full loop was complete:&lt;br&gt;
Record ➝ Upload ➝ Manage ✅&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;⚠️ Major Challenge — Mobile Recording&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One ongoing challenge I’m facing is recording on mobile devices.&lt;/p&gt;

&lt;p&gt;For some reason, mobile browsers often fail to start recording or capture either audio or video. I suspect this is due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permission handling differences across mobile browsers&lt;/li&gt;
&lt;li&gt;Limited MIME type support for MediaRecorder&lt;/li&gt;
&lt;li&gt;Streaming of videos in chunks instead of sending the whole binary Object accross a single request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still debugging this. If you’ve solved this before, I’d love to hear from you!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🌐 Links&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Live Demo: &lt;a href="https://loop.oauife.uk/" rel="noopener noreferrer"&gt;loop.oauife.uk&lt;/a&gt;&lt;br&gt;
Source Code: &lt;a href="https://github.com/professor-12/loom-clone" rel="noopener noreferrer"&gt;github___repo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🧭 Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For me, building tools and clones is the best way to deeply understand new technologies.&lt;/p&gt;

&lt;p&gt;Throughout this project, I learned a lot about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser APIs&lt;/li&gt;
&lt;li&gt;Real-time media handling&lt;/li&gt;
&lt;li&gt;The full-stack flow from recording to upload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every challenge taught me something new and that’s what makes this journey fun.&lt;/p&gt;

&lt;p&gt;If you’ve experimented with MediaRecorder or mobile stream capture, I’d love your insights!&lt;br&gt;
Feel free to reach out at &lt;a href="//badejoemmanuel805@gmail.com"&gt;badejoemmanuel805@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please check out &lt;a href="https://loop.oauife.uk/" rel="noopener noreferrer"&gt;Loop&lt;/a&gt; let me know what you think! 🙌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Understanding the concept of System design Part 1</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Tue, 12 Aug 2025 10:23:03 +0000</pubDate>
      <link>https://forem.com/professor12/understanding-the-concept-of-system-design-part-1-3e63</link>
      <guid>https://forem.com/professor12/understanding-the-concept-of-system-design-part-1-3e63</guid>
      <description>&lt;p&gt;Ever wondered how Netflix streams without buffering during peak hours or how Amazon handles millions of orders daily without collapsing?&lt;br&gt;
It’s not magic it’s System Design.&lt;/p&gt;

&lt;p&gt;It’s been a while since I last posted (exams + project defense had me busy 🎓), but it feels great to be back!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is System Design?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;System design is the process of defining the architecture, components, interfaces, and data flow of a system to meet specific needs. Think of it as a blueprint before the actual construction.&lt;/p&gt;

&lt;p&gt;It tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What parts make up the system (frontend, backend, database, etc.)&lt;/li&gt;
&lt;li&gt;How those parts talk to each other&lt;/li&gt;
&lt;li&gt;Where data goes and comes from&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;What Problems Does System Design Solve?&lt;/strong&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Problem:&lt;br&gt;
An app that works fine for 1,000 users might break when 1,000,000 join.&lt;/p&gt;

&lt;p&gt;How it’s solved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load balancing spreads traffic across multiple servers.&lt;/li&gt;
&lt;li&gt;Caching (e.g., Redis) stores frequently used data for quick access.&lt;/li&gt;
&lt;li&gt;Sharding splits large datasets into smaller, manageable chunks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: Instagram &lt;code&gt;caches&lt;/code&gt; your feed so it doesn’t have to query the database every single time you scroll.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Fault Tolerance&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Problem:&lt;br&gt;
One failure can bring down the whole system.&lt;/p&gt;

&lt;p&gt;How it’s solved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication keeps multiple copies of critical data.&lt;/li&gt;
&lt;li&gt;Failover systems automatically switch to backups when one server fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: Netflix &lt;code&gt;stores&lt;/code&gt; your watch history in multiple regions so you can resume your movie even if one data center is down.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Cost Efficiency&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Problem:&lt;br&gt;
Overbuilding wastes money; underbuilding leads to crashes.&lt;/p&gt;

&lt;p&gt;How it’s solved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-scaling adjusts resources based on real-time demand.&lt;/li&gt;
&lt;li&gt;Choosing the right database saves costs for specific workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: Uber scales up servers during rush hours and scales down late at night to save money.&lt;/p&gt;

&lt;p&gt;Systems with poor or no system designs will often face problems like these.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is a System &amp;amp; Why Design It?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A system is a group of connected parts working together to achieve a goal.&lt;br&gt;
Designing it ensures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It works as intended under different conditions.&lt;/li&gt;
&lt;li&gt;It’s efficient and cost-effective. &lt;/li&gt;
&lt;li&gt;It can handle growth and unexpected failures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why It Matters&lt;br&gt;
A good design helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle more users as your app grows.&lt;/li&gt;
&lt;li&gt;Make your system easier to maintain and debug.&lt;/li&gt;
&lt;li&gt;Ensure speed and reliability.&lt;/li&gt;
&lt;li&gt;Build a foundation that lasts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my next post, we will take a look at a simple real life example of how to design a System&lt;/p&gt;

&lt;p&gt;💬 Final Thoughts&lt;br&gt;
As a software engineer, learning system design is like learning how to build cities instead of just houses. Without it, even a great idea can fail under real-world pressure.&lt;/p&gt;

&lt;p&gt;Have you ever worked on an app without a clear design plan?&lt;br&gt;
What did you learn from the experience? Let’s share stories 👇&lt;/p&gt;

</description>
      <category>software</category>
      <category>programming</category>
      <category>computerscience</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Angular</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Sun, 01 Jun 2025 07:44:34 +0000</pubDate>
      <link>https://forem.com/professor12/angular-51m0</link>
      <guid>https://forem.com/professor12/angular-51m0</guid>
      <description></description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>🔔 How i added a web push notification feature in my project</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Sat, 17 May 2025 08:43:40 +0000</pubDate>
      <link>https://forem.com/professor12/how-i-added-a-web-push-notification-feature-in-my-project-34po</link>
      <guid>https://forem.com/professor12/how-i-added-a-web-push-notification-feature-in-my-project-34po</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;I am thrilled to announce to you that I have implemented a push notification feature on my &lt;a href="https://chatx-fwdl.onrender.com/" rel="noopener noreferrer"&gt;ChatX&lt;/a&gt; project.&lt;br&gt;
Now you can get real-time updates even when you’re not on the ChatX tab. Anytime someone sends you a message, you’ll get a notification straight to your device.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;em&gt;How it works&lt;/em&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;1. Service Worker&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" rel="noopener noreferrer"&gt;Service worker&lt;/a&gt; is a JavaScript file that runs in the background of your browser independently from the web page. It allows your app to handle things like push notifications, background syncing, and caching even when the user is not actively on your site.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. VAPID Keys&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These are cryptographic keys that authenticate your server with the browser’s push service. They allow you to send web push notifications securely and directly, without relying on external services like Firebase &lt;code&gt;Cloud Messaging (FCM)&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. Subscription&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When a user allows push notifications, the browser creates a subscription object containing an endpoint URL and encryption keys. This subscription is sent to your backend and used to identify and securely send push messages to that user’s device.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Overall Idea&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We prompt the user to accept permissions for notification&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service Worker&lt;/strong&gt;: We register a Service worker. Its job is to listen for push events and trigger notifications sent from the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscribing to PushManager&lt;/strong&gt;:&lt;br&gt;
After permission is granted, we subscribe the user to push notifications through the browser’s &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/PushManager" rel="noopener noreferrer"&gt;PushManager&lt;/a&gt;. This returns a subscription object with the endpoint and keys, which we send to our backend to store.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;subscribeUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serviceWorker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;registration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pushManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;userVisibleOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;applicationServerKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;YOUR_PUBLIC_VAPID_KEY&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Send the subscription payload to the server to store &lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/save-subscription&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;3 &lt;strong&gt;Sending Notifications from the Server&lt;/strong&gt;:&lt;br&gt;
When there is a new chat message, the server uses the saved subscriptions to send push notifications via the Web Push Protocol using &lt;code&gt;VAPID keys&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="nx"&gt;webpush&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVapidDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mailto:you@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VAPID_PUBLIC_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VAPID_PRIVATE_KEY&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendNotification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;webpush&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendNotification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. &lt;strong&gt;Handling Push Events in the Service Worker&lt;/strong&gt;:
&lt;/h2&gt;

&lt;p&gt;The Service Worker listens for push events and displays notifications to the user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;push&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;registration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showNotification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/icon.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notificationclick&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Next up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video Chatting functionality using WebRTC&lt;/li&gt;
&lt;li&gt;Add and remove users from a group&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check it out live: &lt;a href="https://chatx-fwdl.onrender.com/" rel="noopener noreferrer"&gt;ChatX&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Real-time full stack NextJS chat application</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Wed, 09 Apr 2025 19:05:47 +0000</pubDate>
      <link>https://forem.com/professor12/real-time-full-stack-nextjs-chat-application-5pc</link>
      <guid>https://forem.com/professor12/real-time-full-stack-nextjs-chat-application-5pc</guid>
      <description>&lt;p&gt;🔨 Project in Progress&lt;br&gt;
Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;I'm currently working on a full-stack real-time chat application using Next.js, and WebSocket, and I wanted to start sharing my journey here&lt;/p&gt;

&lt;p&gt;You can find the link to the project at the end of the post.&lt;/p&gt;

&lt;p&gt;✅ What I’ve done so far:&lt;br&gt;
🔐 Implemented authentication&lt;br&gt;
💬 Added the ability to message other users&lt;br&gt;
⚡ Implemented real-time updates using WebSocket&lt;br&gt;
📱 Made the app responsive across devices&lt;/p&gt;

&lt;p&gt;🚧 What I’m working on now:&lt;br&gt;
🎥 Implementing video calling with WebRTC&lt;br&gt;
🎨 Improving the UI/UX&lt;br&gt;
👥 Adding group chat functionality&lt;/p&gt;

&lt;p&gt;💡 I’ll be posting regular updates as I go. If you're curious about the tech stack, tools, or any specific part of the build, feel free to drop a comment or question!&lt;/p&gt;

&lt;p&gt;Live link: &lt;a href="https://chatx-fwdl.onrender.com" rel="noopener noreferrer"&gt;chatx-fwdl.onrender.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>Understanding the complexity of web development (Frontend)</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Mon, 07 Apr 2025 04:38:26 +0000</pubDate>
      <link>https://forem.com/professor12/understanding-the-complexity-of-web-development-frontend-56p9</link>
      <guid>https://forem.com/professor12/understanding-the-complexity-of-web-development-frontend-56p9</guid>
      <description>&lt;p&gt;It’s been a while since I last posted here. I’ve been busy with school exams, but it feels good to be back! 😊&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through some modern tools and concepts every frontend developer should understand.&lt;/p&gt;

&lt;p&gt;In the early days of the web, development was relatively simple. A basic website required just HTML for structure, CSS for styling, and a bit of JavaScript for interactivity. Developers didn’t have to worry about complex build tools, state management, or performance optimizations.&lt;/p&gt;

&lt;p&gt;However, as the internet evolved, user expectations grew, and web applications became more complex. Modern development now involves frameworks like React, Vue, and Angular, along with tools like Webpack, Babel, and TypeScript.&lt;/p&gt;

&lt;p&gt;At first, this can feel overwhelming—especially when you're just starting out. But once you understand what each tool does and why it exists, it all begins to make sense.&lt;/p&gt;

&lt;p&gt;Let’s break it down 😎&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Babel
&lt;/h3&gt;

&lt;p&gt;Babel is a JavaScript compiler that allows developers to write modern JavaScript (ES6+ and beyond) while ensuring compatibility with older browsers and environments that do not support the latest features. It works by transpiling (or converting) modern JavaScript code into an older version, such as ES6 to ES5&lt;/p&gt;

&lt;p&gt;Babel solves the problem of JavaScript compatibility across different browsers. As JavaScript evolves, new features (like ES6+) are introduced, but older browsers don’t always support them. Without Babel, developers would have to manually write fallback code or avoid using modern JavaScript features altogether&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Webpack
&lt;/h3&gt;

&lt;p&gt;As web applications scales, managing multiple JavaScript files manually becomes difficult. Dependencies must be loaded in the correct order, and too many requests can slow down performance. For instance, loading a script tag that depends on another script can cause runtime errors if the required file hasn’t loaded yet. Manually managing this becomes complex as the project scales. Webpack solves this by automatically bundling and resolving dependencies, ensuring scripts load in the correct order while optimizing performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Typescript
&lt;/h3&gt;

&lt;p&gt;JavaScript is dynamically typed, meaning variables can change types at runtime, leading to unexpected bugs and harder debugging in large projects. TypeScript solves this by enforcing strict types, catching errors at compile-time rather than runtime.&lt;/p&gt;

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

&lt;p&gt;Vite is a fast, modern build tool and development server.&lt;br&gt;
What it solves: Improves development experience with instant server start and lightning-fast hot module replacement (HMR). Unlike Webpack, which bundles everything upfront, Vite serves your source files on demand using native ES modules.&lt;/p&gt;

&lt;p&gt;Vite replaces tools like Babel and Webpack by using modern browser features and a faster build process. Instead of bundling everything upfront, Vite serves code using native ES modules, which makes development much faster. It uses ESBuild (which is faster than Babel) to handle modern JavaScript and TypeScript. Vite also has built-in support for hot module replacement (HMR) and JSX, with no extra setup. For production builds, it uses Rollup instead of Webpack. Overall, Vite is simpler, faster, and great for modern frontend projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Summary of Webpack, Babel, TypeScript and Vite&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As web development evolved, new challenges emerged, leading to the creation of powerful tools like &lt;strong&gt;Webpack, Babel, TypeScript , Vite etc.&lt;/strong&gt; to improve efficiency, compatibility, and maintainability.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Webpack&lt;/strong&gt;: A &lt;strong&gt;module bundler&lt;/strong&gt; that automatically manages dependencies, optimizes assets, and improves performance by bundling JavaScript, CSS, and images into efficient output files.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Babel&lt;/strong&gt;: A &lt;strong&gt;JavaScript compiler&lt;/strong&gt; that converts modern JavaScript (ES6+) into older versions (like ES5) to ensure compatibility across all browsers.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt;: A &lt;strong&gt;superset of JavaScript&lt;/strong&gt; that adds &lt;strong&gt;static typing&lt;/strong&gt;, helping developers catch errors early, improve code structure, and write more scalable applications. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt;: A modern build tool and dev server offering blazing-fast startup and hot reloading. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these tools streamline modern web development, making it faster, more reliable, and easier to manage. 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building Cloud Store: Solving Storage Limitations with React.js and Django</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Thu, 13 Feb 2025 07:08:38 +0000</pubDate>
      <link>https://forem.com/professor12/building-cloud-store-solving-storage-limitations-with-reactjs-and-django-1mh3</link>
      <guid>https://forem.com/professor12/building-cloud-store-solving-storage-limitations-with-reactjs-and-django-1mh3</guid>
      <description>&lt;p&gt;I’m currently working on a project called “cloud store”&lt;/p&gt;

&lt;p&gt;I got the idea from the problem I had concerning insufficient storage on my device.&lt;/p&gt;

&lt;p&gt;To solve this problem, I built a storage system that allows you to save files securely in the cloud, access them from any device and manage them effortlessly.&lt;/p&gt;

&lt;p&gt;Right now, I am working on adding file sharing and collaboration features to enhance user experience.&lt;/p&gt;

&lt;p&gt;Key features include: authentication, file uploads, the ability to download saved files, and support for both dark mode and light mode.&lt;/p&gt;

&lt;p&gt;One of the biggest challenges I faced was optimizing file uploads. At first uploading a file that is as small as 2kb took minutes, which was not user friendly. But I tackled the issue with the help of cloudinary. &lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts! What’s the most important feature you’d want in a cloud storage solution? Let’s discuss in the comments! 👇&lt;/p&gt;

&lt;p&gt;You can find the link to project in the comments section  below &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>coding</category>
    </item>
    <item>
      <title>Understanding the concept of single page applications (spa)</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Fri, 20 Dec 2024 10:25:49 +0000</pubDate>
      <link>https://forem.com/professor12/understanding-the-concept-of-single-page-applications-spa-22ej</link>
      <guid>https://forem.com/professor12/understanding-the-concept-of-single-page-applications-spa-22ej</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;What are single page applications?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They are  basically  web applications that serves a single html page into the browser and dynamically  updates contents with javascript without the need to reload the full page.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Single Page Applications (SPAs) are Important 🤔&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: SPAs load the main HTML, CSS, and JavaScript files once. Which then subsequently fetch only the necessary data from the server via APIs (e.g., REST or GraphQL). Only necessary data is fetched and rendered, reducing server load and improving response times. This is very crucial for the server since most of the work load is shipped to the client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless User Experience&lt;/strong&gt; : Eliminates page reloads by dynamically updating content using javascript. For instance smooth navigation can enhance and improve the user experience since it does not require the&lt;br&gt;
need to reload the entire page. Anytime a page reloads temporary states may be lost and the browser might need to send a new request to the server which could lead to perfomance issues and poor user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: SPAs are ideal for growing applications with complex user interactions and scalable functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offline Support&lt;/strong&gt;: refers to a feature in web or mobile applications that allows users to continue using the application, at least partially, even when the user is not connected to the internet. With the implementation of caching, Spas can cache data using Service Workers for offline functionalities which can also help in the user experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How SPAs Work&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Uses JavaScript frameworks/libraries to manage routing and state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates the DOM dynamically through APIs like AJAX or Fetch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Communicates with the server using REST or GraphQL for data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Downsides of Single Page Applications (SPAs)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Initial Load Time&lt;/strong&gt;: The initial load time is slower since the browser needs to download large Javascript bundle before a page is rendered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JavaScript Dependency&lt;/strong&gt;:  Requires JavaScript to be enabled on the client’s browser, as most functionality depends on it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Vulnerabilities&lt;/strong&gt;: SPAs are more vulnerable to client-side attacks, such as Cross-Site Scripting (XSS), due to the heavy reliance on JavaScript on the client's browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO Challenge&lt;/strong&gt;: &lt;br&gt;
SEO stands for Search Engine Optimization. It refers to the process of improving a website's visibility and ranking on search engine results pages (SERPs), like Google or Bing. Most search engine bots find it difficut to index pages which are dynamically generated with javascript and this can cause potential harming organic traffic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SPAs (Single Page Applications) are not inherently consistent with browser history because they dynamically manipulate the browser's state using JavaScript rather than fully reloading pages. This behavior introduces certain challenges with how SPAs manage and interact with the browser's history stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Single Page Applications (SPAs) Are Best For Creating&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dashboards and Analytics Tools&lt;/li&gt;
&lt;li&gt;Social Media Platforms&lt;/li&gt;
&lt;li&gt;E-commerce Applications&lt;/li&gt;
&lt;li&gt;Interactive Web Applications&lt;/li&gt;
&lt;li&gt;Learning Management Systems (LMS)&lt;/li&gt;
&lt;li&gt;PWAs (Progressive web apps)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Single Page Applications (SPAs) represent a modern approach to web application development that emphasizes performance, seamless user experiences, and scalability. By dynamically updating content without requiring full-page reloads, SPAs reduce server load, improve responsiveness, and create a desktop-like experience for users.&lt;/p&gt;

&lt;p&gt;However, they come with challenges such as initial load time, JavaScript dependency, SEO optimization difficulties, and browser history inconsistencies, which developers must carefully address. Despite these downsides, SPAs excel in applications that demand interactivity, real-time updates, and offline functionality, making them ideal for dashboards, social media platforms, e-commerce, and Progressive Web Applications (PWAs).&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>React</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Wed, 18 Dec 2024 08:07:09 +0000</pubDate>
      <link>https://forem.com/professor12/react-30fg</link>
      <guid>https://forem.com/professor12/react-30fg</guid>
      <description></description>
      <category>react</category>
    </item>
    <item>
      <title>Building emmanuel-dot-clone.netlify.app (A clone of dot.ai) with Astro JS</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Sat, 19 Oct 2024 12:36:16 +0000</pubDate>
      <link>https://forem.com/professor12/building-emmanuel-dot-clonenetlifyapp-a-clone-of-dotai-with-astro-js-4e8n</link>
      <guid>https://forem.com/professor12/building-emmanuel-dot-clonenetlifyapp-a-clone-of-dotai-with-astro-js-4e8n</guid>
      <description>&lt;p&gt;In this blog post, I’ll walk you through how I cloned the landing page of Dot ai using Astro JS, TypeScript and Tailwind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astro js&lt;/strong&gt; is  a JavaScript web framework optimized for building fast, content-driven websites, with Astro's server side rendering abilities and typescript's static typing with my favourite css library (Tailwind), this project became a best learning experience for building fast and optimized websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up the project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installing Astro, initializing the project.&lt;/li&gt;
&lt;li&gt;Setting up TypeScript.&lt;/li&gt;
&lt;li&gt;Installing and configuring Tailwind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started with the project, you need to initialise an Astro project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create a new project with npm&lt;/span&gt;
npm create astro@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install or setup tailwindcss&lt;/p&gt;

&lt;p&gt;First, install the &lt;code&gt;@astrojs/tailwind&lt;/code&gt; and tailwind packages using your package manager.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @astrojs/tailwind tailwind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installing , Astro will create a &lt;code&gt;tailwind.config.mjs&lt;/code&gt; file in your project’s root directory and then boom! you are good to go.&lt;/p&gt;

&lt;p&gt;If this doesn't work, you can go through the manual setup.&lt;/p&gt;

&lt;p&gt;To run astro dev server&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~dot-clone&amp;gt; npm run dev

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; dot-clone@0.0.1 dev
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; astro dev

14:19:58 &lt;span class="o"&gt;[&lt;/span&gt;build] Waiting &lt;span class="k"&gt;for &lt;/span&gt;integration &lt;span class="s2"&gt;"@astrojs/tailwind"&lt;/span&gt;, hook &lt;span class="s2"&gt;"astro:config:setup"&lt;/span&gt;...
14:19:59 &lt;span class="o"&gt;[&lt;/span&gt;types] Generated 11ms

 astro  v4.14.5 ready &lt;span class="k"&gt;in &lt;/span&gt;35428 ms

┃ Local    http://localhost:4321/
┃ Network  use &lt;span class="nt"&gt;--host&lt;/span&gt; to expose  

14:20:04 watching &lt;span class="k"&gt;for &lt;/span&gt;file changes...

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Website Layout
&lt;/h2&gt;

&lt;p&gt;After inspecting and proper review of the website i noticed lot of similar design patterns, functionalities and  animations used in sections of the website. For instance the footer, navbar, buttons, hero section for each pages and so on.&lt;/p&gt;

&lt;p&gt;Since astro supports the creation of custom components, i was able to create and use  reusable components accross the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's look at the custom link component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;href&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;className&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Astro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; inline-flex items-center gap-[6px] justify-center rounded-xl body-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background border border-gray-200 text-black hover:bg-secondary/80 py-2 md:py-3.5 px-6 md:h-[52px] h-[48px] body-sm xl:body-md border-none bg-[#c0d2f9]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code has two sections, the frontmatter and the html markup&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontmatter&lt;/strong&gt;: Contains logic and props destructuring for the component, making it dynamic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML Markup&lt;/strong&gt;: Renders an anchor tag, with props dynamically applied to attributes and a slot for additional content.&lt;br&gt;
Reusability: The component is reusable and flexible due to its use of props and the slot feature.&lt;/p&gt;

&lt;p&gt;This combination of server-side logic (in the frontmatter) and the component's HTML structure (in the markup) makes Astro components highly dynamic and reusable, just like in frameworks such as React but with Astro’s focus on static generation and performance.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responsive Design&lt;/strong&gt;: The cloned website is fully responsive, ensuring that it looks and functions well on devices of all sizes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component-Based Architecture&lt;/strong&gt;: Reusable components were created using Astro and TypeScript to ensure modularity and maintainability.&lt;br&gt;
Optimized Performance: Astro’s static site generation helped optimize page load times, resulting in better performance and SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tailwind for Styling&lt;/strong&gt;: Tailwind was used for consistent and streamlined styling, making use of utility classes for fast, responsive design adjustments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/professor-12/dot-ai-clone" rel="noopener noreferrer"&gt;https://github.com/professor-12/dot-ai-clone&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://emmanuel-dot-clone.netlify.app/" rel="noopener noreferrer"&gt;Link to the cloned project&lt;/a&gt;&lt;/p&gt;

</description>
      <category>astro</category>
      <category>frontend</category>
    </item>
    <item>
      <title>AngularJs vs ReactJs</title>
      <dc:creator>Badejo Emmanuel Adewale</dc:creator>
      <pubDate>Fri, 28 Jun 2024 09:09:32 +0000</pubDate>
      <link>https://forem.com/professor12/angularjs-vs-reactjs-43c7</link>
      <guid>https://forem.com/professor12/angularjs-vs-reactjs-43c7</guid>
      <description>&lt;p&gt;AngularJS and ReactJS are two of the most popular JavaScript frameworks used for developing modern web applications. Both have their strengths and cater to different project needs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Overview
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AngularJS&lt;/strong&gt;: Developed by Google and released in 2010, AngularJS is a full-fledged framework that provides a complete solution for building dynamic single-page applications (SPAs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ReactJS&lt;/strong&gt;: Developed by Facebook and released in 2013, ReactJS is a library focused on building user interfaces, particularly for single-page applications. React introduces a component-based architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Key Features
&lt;/h4&gt;

&lt;h5&gt;
  
  
  AngularJS
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Two-Way Data Binding&lt;/strong&gt;: Automatically synchronizes data between the model and the view components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Injection&lt;/strong&gt;: Facilitates the management of dependencies between components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Directives&lt;/strong&gt;: Extend HTML with custom attributes and elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MVC Architecture&lt;/strong&gt;: Separates the application into three main components: Model, View, and Controller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Solution&lt;/strong&gt;: Provides a complete set of tools out-of-the-box, including routing, form validation, and HTTP client.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  ReactJS
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Virtual DOM&lt;/strong&gt;: Efficiently updates and renders components by maintaining a virtual representation of the DOM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component-Based Architecture&lt;/strong&gt;: Encourages reusability and modularity through encapsulated components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-Way Data Binding&lt;/strong&gt;: Ensures data flows in a single direction, making the application easier to understand and debug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSX&lt;/strong&gt;: Combines JavaScript and HTML-like syntax, allowing developers to write UI components in a declarative manner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem Flexibility&lt;/strong&gt;: React can be paired with various libraries and tools for state management (like Redux) and routing (like React Router).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Choosing between AngularJS and ReactJS depends on the specific needs of your project. AngularJS is a complete framework offering a structured approach and a wealth of built-in features, making it ideal for large-scale applications. ReactJS, on the other hand a JavaScript library, excels in flexibility and performance with its component-based architecture and virtual DOM, making it a great choice for interactive and dynamic user interfaces.&lt;/p&gt;

&lt;h4&gt;
  
  
  Their use cases.
&lt;/h4&gt;

&lt;p&gt;Consider the nature of your project, your team's expertise, and the specific requirements of your application when making your decision. Both frameworks have their merits and can significantly enhance your web development experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;Click here to join the HNGX internship&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you need to find and Hire Elite Freelance Talent! &lt;a href="https://hng.tech/hire" rel="noopener noreferrer"&gt;Click here!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
