<?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: Mamedul Islam</title>
    <description>The latest articles on Forem by Mamedul Islam (@mamedul).</description>
    <link>https://forem.com/mamedul</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%2F3311184%2F92672d42-4366-4d06-b4ae-8870722a559a.png</url>
      <title>Forem: Mamedul Islam</title>
      <link>https://forem.com/mamedul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mamedul"/>
    <language>en</language>
    <item>
      <title>Introducing node-hooker: WordPress Hooks for Your Node.js App</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sat, 06 Sep 2025 20:46:51 +0000</pubDate>
      <link>https://forem.com/mamedul/introducing-node-hooker-wordpress-hooks-for-your-nodejs-app-2bn7</link>
      <guid>https://forem.com/mamedul/introducing-node-hooker-wordpress-hooks-for-your-nodejs-app-2bn7</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Tightly-Coupled Code
&lt;/h2&gt;

&lt;p&gt;If you've built a few non-trivial applications in Node.js, you've likely run into a common problem: as your application grows, different parts become increasingly tangled together. Modifying one component often has unintended side effects on another. How can we allow different parts of our application to interact without being so tightly coupled?&lt;/p&gt;

&lt;p&gt;For years, the WordPress community has had an elegant solution: the Hooks system. It provides two main components: &lt;strong&gt;Actions&lt;/strong&gt; and &lt;strong&gt;Filters&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Actions&lt;/strong&gt; allow you to execute code at specific points in your application's lifecycle.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Filters&lt;/strong&gt; allow you to modify data that is being passed between different parts of your code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This system is the backbone of WordPress's famous extensibility. I wanted to bring this powerful, battle-tested pattern to the Node.js ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: &lt;code&gt;node-hooker&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Today, I'm excited to launch &lt;a href="https://github.com/mamedul/node-hooker" rel="noopener noreferrer"&gt;&lt;code&gt;node-hooker&lt;/code&gt;&lt;/a&gt;, a zero-dependency library that faithfully implements the WordPress Hooks API for Node.js.&lt;/p&gt;

&lt;p&gt;It's a simple, lightweight, and powerful way to build decoupled, extensible architectures in your JavaScript applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full WordPress Hook API compatibility:&lt;/strong&gt; All the functions you'd expect are there: &lt;code&gt;add_action&lt;/code&gt;, &lt;code&gt;do_action&lt;/code&gt;, &lt;code&gt;add_filter&lt;/code&gt;, &lt;code&gt;apply_filters&lt;/code&gt;, &lt;code&gt;remove_action&lt;/code&gt;, &lt;code&gt;did_action&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies:&lt;/strong&gt; It won't add any bloat to your project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser Support:&lt;/strong&gt; It includes a UMD bundle, so you can use the exact same event system on the client-side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to use:&lt;/strong&gt; The API is intuitive and well-documented.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How It Works: A Quick Example
&lt;/h3&gt;

&lt;p&gt;Here’s a quick look at how you might use &lt;code&gt;node-hooker&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;hooker&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;node-hooker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Somewhere in your user authentication code&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleUserLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`User &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; logged in.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Announce that a user has logged in.&lt;/span&gt;
    &lt;span class="c1"&gt;// Other parts of the app can "hook" into this event.&lt;/span&gt;
    &lt;span class="nx"&gt;hooker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;do_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user_logged_in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Somewhere else, maybe in an analytics or notifications module&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendWelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Sending a welcome email to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// "Hook" the email function to the user login event.&lt;/span&gt;
&lt;span class="nx"&gt;hooker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user_logged_in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sendWelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Now, when you call the login handler...&lt;/span&gt;
&lt;span class="nf"&gt;handleUserLogin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;alex@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
User Alex logged in.&lt;br&gt;
Sending a welcome email to alex@example.com...&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Notice how the &lt;code&gt;handleUserLogin&lt;/code&gt; function doesn't need to know anything about sending emails. It just announces that an event happened. This makes your code incredibly modular and easy to test and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check It Out!
&lt;/h3&gt;

&lt;p&gt;I'm really proud of how &lt;code&gt;node-hooker&lt;/code&gt; turned out, and I believe it can be a valuable tool for many Node.js developers.&lt;/p&gt;

&lt;p&gt;You can find the full source code, documentation, and more examples on GitHub.&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;&lt;a href="https://github.com/mamedul/node-hooker" rel="noopener noreferrer"&gt;https://github.com/mamedul/node-hooker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;&lt;a href="https://mamedul.github.io/node-hooker" rel="noopener noreferrer"&gt;https://mamedul.github.io/node-hooker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, please consider giving it a star on GitHub! Thanks for reading.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 jQuery.scrollPaging v1.1.0 – Infinite Scroll Made Easy</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sun, 31 Aug 2025 09:16:41 +0000</pubDate>
      <link>https://forem.com/mamedul/jqueryscrollpaging-v110-infinite-scroll-made-easy-13l5</link>
      <guid>https://forem.com/mamedul/jqueryscrollpaging-v110-infinite-scroll-made-easy-13l5</guid>
      <description>&lt;p&gt;If you’ve ever needed &lt;strong&gt;infinite scroll&lt;/strong&gt; or &lt;strong&gt;scroll pagination&lt;/strong&gt; for your site, check out &lt;a href="https://github.com/mamedul/jquery-scrollpaging" rel="noopener noreferrer"&gt;&lt;strong&gt;jQuery.scrollPaging&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Why use it?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-loads content on scroll (blogs, feeds, shops)&lt;/li&gt;
&lt;li&gt;Works &lt;strong&gt;vertically, horizontally, or both&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO-friendly&lt;/strong&gt; with History API support&lt;/li&gt;
&lt;li&gt;Fully customizable with callbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📦 Quick Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"jquery.scrollpaging.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;a href="https://mamedul.github.io/jquery-scrollpaging/examples/example4.html" rel="noopener noreferrer"&gt;Live Demos&lt;/a&gt; | &lt;a href="https://github.com/mamedul/jquery-scrollpaging" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re looking for a &lt;strong&gt;powerful but lightweight infinite scroll plugin&lt;/strong&gt;, this might be the solution 🚀&lt;/p&gt;

&lt;p&gt;#javascript #jquery #webdev #opensource&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>jquery</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Javascript Advanced Object Validator</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sun, 31 Aug 2025 08:55:42 +0000</pubDate>
      <link>https://forem.com/mamedul/javascript-advanced-object-validator-5d64</link>
      <guid>https://forem.com/mamedul/javascript-advanced-object-validator-5d64</guid>
      <description>&lt;h1&gt;
  
  
  objectPropValidator: Simple, Recursive JavaScript Object Validation
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/mamedul/objectpropvalidator" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fversion-2.0.1-blue.svg" alt="Version" width="90" height="20"&gt;&lt;/a&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%2Fvisitor-badge.laobi.icu%2Fbadge%3Fpage_id%3Dmamedul.objectpropvalidator" 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%2Fvisitor-badge.laobi.icu%2Fbadge%3Fpage_id%3Dmamedul.objectpropvalidator" alt="visitors" width="80" height="20"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FLicense-MIT-yellow.svg" alt="License: MIT" width="82" height="20"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FMade%2520with%2520%25E2%259D%25A4%25EF%25B8%258F%2520in-Bangladesh-green.svg" alt="Made with Love in Bangladesh" width="178" height="20"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FHire%2520Me-Available-brightgreen.svg" alt="Hire Me" width="112" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;objectPropValidator&lt;/strong&gt; is a lightweight, zero-dependency JavaScript utility for validating object properties against a defined schema. It's designed to be simple, flexible, and powerful, allowing for recursive validation of nested objects with clear, helpful error messages.&lt;/p&gt;

&lt;p&gt;Whether you're validating API responses, configuration objects, or function arguments, this library ensures your data structure is correct without adding bloat to your project.&lt;/p&gt;


&lt;h2&gt;
  
  
  Core Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Schema-Based Validation&lt;/strong&gt;: Define a clear and reusable schema for your objects.&lt;/li&gt;
&lt;li&gt;recursi &lt;strong&gt;Recursive/Nested Validation&lt;/strong&gt;: Effortlessly validate complex, nested object structures.&lt;/li&gt;
&lt;li&gt;💪 &lt;strong&gt;Flexible Rules&lt;/strong&gt;: Check for property &lt;code&gt;type&lt;/code&gt;, whether it's &lt;code&gt;required&lt;/code&gt;, and add your own custom &lt;code&gt;validator&lt;/code&gt; functions.&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Specific Error Logging&lt;/strong&gt;: Get clear, actionable error messages in the console that pinpoint exactly what failed.&lt;/li&gt;
&lt;li&gt;🕊️ &lt;strong&gt;Lightweight &amp;amp; Zero-Dependency&lt;/strong&gt;: Tiny footprint. No external libraries needed.&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Universal Compatibility&lt;/strong&gt;: Works in modern browsers and Node.js environments.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;You can use &lt;code&gt;objectPropValidator&lt;/code&gt; by directly including the script in your HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/mamedul/objectpropvalidator/src/objectpropvalidator.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or for &lt;code&gt;npm&lt;/code&gt; installation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;npm&lt;/span&gt; install objectpropvalidator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick Start: Basic Usage
&lt;/h2&gt;

&lt;p&gt;Getting started is simple. Just define a schema and create a validator function from it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Define a &lt;code&gt;schema&lt;/code&gt;&lt;/strong&gt; that describes the expected structure of your object.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Call &lt;code&gt;objectPropValidator(schema)&lt;/code&gt;&lt;/strong&gt; to create a reusable validator function.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Use the new function&lt;/strong&gt; to check your data object. It returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&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="c1"&gt;// 1. Define the validation schema&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&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="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&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;email&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="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;// This property is optional&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;age&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="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&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="c1"&gt;// Add a custom validator function for more complex logic&lt;/span&gt;
    &lt;span class="nf"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&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;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[Validation Error] User must be 18 or older.&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isValid&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="c1"&gt;// 2. Create a reusable validator function&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;objectPropValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Test it with some data&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mamedul Islam&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;26&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;invalidUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Wrong type&lt;/span&gt;
  &lt;span class="c1"&gt;// 'age' is missing&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;Is the first user valid?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;validateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validUser&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&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;Is the second user valid?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;validateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invalidUser&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="c1"&gt;// Console will show:&lt;/span&gt;
&lt;span class="c1"&gt;// [Validation Error] Invalid type for property 'name'. Expected 'String' but received 'Number'.&lt;/span&gt;
&lt;span class="c1"&gt;// [Validation Error] Missing required property: 'age'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Advanced Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nested Object Validation
&lt;/h3&gt;

&lt;p&gt;The real power of &lt;code&gt;objectPropValidator&lt;/code&gt; comes from its ability to handle nested objects recursively. Simply set the &lt;code&gt;validator&lt;/code&gt; property to another validator instance.&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="c1"&gt;// Schema for a user object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userValidator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;objectPropValidator&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&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="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&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;username&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="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Schema for a blog post, which includes a nested 'author' object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&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;author&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&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;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userValidator&lt;/span&gt; &lt;span class="c1"&gt;// Use the user validator here!&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;validatePost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;objectPropValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postSchema&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;validPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My First 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;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mamedul&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalidPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Another 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;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// Invalid type, should be Number&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;validatePost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validPost&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;   &lt;span class="c1"&gt;// true&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="nf"&gt;validatePost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invalidPost&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="c1"&gt;// Console will show:&lt;/span&gt;
&lt;span class="c1"&gt;// [Validation Error] Invalid type for property 'id'. Expected 'Number' but received 'String'.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuring Error Logs
&lt;/h3&gt;

&lt;p&gt;You can pass a configuration object as the second argument to control how errors are logged.&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;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;logLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Use console.warn instead of the default console.error&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;myValidator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;objectPropValidator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;logLevel&lt;/code&gt;&lt;/strong&gt;: Can be &lt;code&gt;'error'&lt;/code&gt; (default), &lt;code&gt;'warn'&lt;/code&gt;, or &lt;code&gt;'log'&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  API Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;objectPropValidator(schema, [config])&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Creates and returns a new validator function.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;schema&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(Object)&lt;/code&gt;: An object where each key is a property to validate. The value is an object containing the validation rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;config&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(Object, optional)&lt;/code&gt;: Configuration options.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;logLevel&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(String)&lt;/code&gt;: Sets the console logging method. Defaults to &lt;code&gt;'error'&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Schema Rule Properties
&lt;/h3&gt;

&lt;p&gt;For each property in your &lt;code&gt;schema&lt;/code&gt;, you can define the following rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;type&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(Constructor | Array&amp;lt;Constructor&amp;gt;)&lt;/code&gt;: The expected type (e.g., &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Number&lt;/code&gt;, &lt;code&gt;Object&lt;/code&gt;, &lt;code&gt;Array&lt;/code&gt;). You can also provide an array for multiple allowed types, like &lt;code&gt;[String, Number]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;required&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(Boolean)&lt;/code&gt;: If &lt;code&gt;true&lt;/code&gt;, the property must exist in the object being validated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;validator&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;(Function)&lt;/code&gt;: A custom function that receives the property's value and should return &lt;code&gt;true&lt;/code&gt; if valid, and &lt;code&gt;false&lt;/code&gt; otherwise. This is also the mechanism for nested validation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Contributions are welcome! Please feel free to submit a pull request or open an issue on the &lt;a href="https://github.com/mamedul/objectpropvalidator" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the &lt;strong&gt;MIT License&lt;/strong&gt;. Copyright (c) 2022 by &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Mamedul Islam&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://opensource.org/licenses/MIT" rel="noopener noreferrer"&gt;LICENSE&lt;/a&gt; file for more details.&lt;/p&gt;




&lt;h2&gt;
  
  
  Author &amp;amp; Hire Me
&lt;/h2&gt;

&lt;p&gt;This project was created and is maintained by &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Mamedul Islam&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am a passionate &lt;strong&gt;web developer&lt;/strong&gt; with experience in creating interactive and user-friendly web components. I am currently &lt;em&gt;available for freelance projects&lt;/em&gt; or full-time opportunities.&lt;/p&gt;

&lt;p&gt;I help businesses grow their online presence with custom web solutions. Specializing in &lt;strong&gt;WordPress&lt;/strong&gt;, &lt;strong&gt;WooCommerce&lt;/strong&gt;, and &lt;strong&gt;Shopify&lt;/strong&gt;, I build modern, responsive, and high-performance websites.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp&lt;/strong&gt;: &lt;a href="https://wa.me/8801847406830?text=Hi%2C%20I%27d%20like%20to%20hire%20you." rel="noopener noreferrer"&gt;message me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio&lt;/strong&gt;: &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;mamedul.github.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/mamedul" rel="noopener noreferrer"&gt;@mamedul&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/in/mamedul/" rel="noopener noreferrer"&gt;Connect with me!&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter (X)&lt;/strong&gt;: &lt;a href="https://www.x.com/mamedul/" rel="noopener noreferrer"&gt;@mamedul&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FHire%2520Me-Available-brightgreen.svg" alt="Hire Me" width="112" height="20"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Show Your Support
&lt;/h3&gt;

&lt;p&gt;If you find this extension useful, please consider giving it a star on GitHub! Your support helps motivate further development and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mamedul/jquery-scrollpaging/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmamedul%2Fjquery-scrollpaging%3Fstyle%3Dfor-the-badge" alt="GitHub stars" width="95" height="28"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;If you found this project helpful, give it a ⭐ on GitHub!&lt;/p&gt;

</description>
      <category>objectvalidator</category>
      <category>javascript</category>
      <category>schema</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Vanilla JS PWA: My Age &amp; Duration Calculator Project</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Fri, 29 Aug 2025 17:46:09 +0000</pubDate>
      <link>https://forem.com/mamedul/i-built-a-vanilla-js-pwa-my-age-duration-calculator-project-mf4</link>
      <guid>https://forem.com/mamedul/i-built-a-vanilla-js-pwa-my-age-duration-calculator-project-mf4</guid>
      <description>&lt;p&gt;Hey Dev community!&lt;/p&gt;

&lt;p&gt;I wanted to share a project I recently completed—a fast, responsive, and installable Age &amp;amp; Duration Calculator. My goal was to build a useful utility without relying on any heavy frameworks, focusing on pure JavaScript, modern CSS, and Progressive Web App principles.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Tech Stack
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vanilla JavaScript (ES6+):&lt;/strong&gt; For performance and to keep the project lightweight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tailwind CSS:&lt;/strong&gt; For rapid, utility-first styling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PWA:&lt;/strong&gt; Service Worker for offline caching and a Web App Manifest for installability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A Feature I Enjoyed Building
&lt;/h4&gt;

&lt;p&gt;One of the coolest features is the live "current time" mode. It uses &lt;code&gt;setInterval&lt;/code&gt; to update the 'To' date every second and recalculates the duration on the fly, creating a real-time running clock effect.&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="c1"&gt;// Simplified logic for the live timer&lt;/span&gt;
    &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setCurrentDateTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setCurrentDateTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Gets current time, formats it, and updates the input value&lt;/span&gt;
        &lt;span class="c1"&gt;// Then calls the main calculateAndDisplay() function&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Why a PWA?
&lt;/h4&gt;

&lt;p&gt;Making it a PWA was a key goal to provide a more native, accessible experience. The Service Worker caches all necessary assets on the first visit, allowing the tool to work perfectly offline.&lt;/p&gt;

&lt;p&gt;It was a great learning experience in core DOM manipulation, date logic, and PWA fundamentals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt; &lt;a href="https://mamedul.github.io/age-calculator/" rel="noopener noreferrer"&gt;https://mamedul.github.io/age-calculator/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/mamedul/age-calculator" rel="noopener noreferrer"&gt;https://github.com/mamedul/age-calculator&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback is welcome! Let me know what you think.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>pwa</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Unit Converter PWA – Vanilla JavaScript &amp; Offline-Ready</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sat, 23 Aug 2025 15:35:12 +0000</pubDate>
      <link>https://forem.com/mamedul/unit-converter-pwa-vanilla-javascript-offline-ready-1nb1</link>
      <guid>https://forem.com/mamedul/unit-converter-pwa-vanilla-javascript-offline-ready-1nb1</guid>
      <description>&lt;p&gt;Looking for a fast, modern, and offline-first &lt;strong&gt;unit converter&lt;/strong&gt;? Meet &lt;strong&gt;Instant Unit Converter&lt;/strong&gt;, a Progressive Web App (PWA) built entirely with &lt;strong&gt;Vanilla JavaScript (ES5)&lt;/strong&gt;—no frameworks, no jQuery. Convert units instantly, anytime, anywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mamedul.github.io/unit-converter" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FLive-Demo-brightgreen%3Fstyle%3Dfor-the-badge%26logo%3Dgithubpages" alt="Live Demo" width="130" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

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




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wide Range of Units&lt;/strong&gt;: Length, Mass, Volume, Temperature, Time, Speed, Area, Data Storage, Currency, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Conversion&lt;/strong&gt;: Results update instantly as you type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline First&lt;/strong&gt;: Fully functional without internet thanks to a Service Worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Currency Rates&lt;/strong&gt;: Fetches and caches the latest exchange rates every hour.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modern UI/UX&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sleek, responsive design&lt;/li&gt;
&lt;li&gt;Light &amp;amp; Dark themes with gradient backgrounds&lt;/li&gt;
&lt;li&gt;Searchable dropdowns for units (powered by Choices.js)&lt;/li&gt;
&lt;li&gt;Smooth animations for a user-friendly interface&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Installable (PWA)&lt;/strong&gt;: Add it to your home screen for an app-like experience.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Dependencies&lt;/strong&gt;: Pure Vanilla JavaScript, lightweight and fast.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: HTML5, CSS3, Vanilla JavaScript (ES5)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI Enhancements&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choices.js&lt;/strong&gt; for searchable select boxes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SweetAlert2&lt;/strong&gt; for beautiful alerts&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;PWA&lt;/strong&gt;: Service Worker for offline caching, Web App Manifest&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fonts&lt;/strong&gt;: Inter – modern and readable&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt;: &lt;code&gt;exchangerate-api.com&lt;/code&gt; for live currency rates&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/unit-converter/
├── index.html
├── manifest.json
├── scripts.js
├── styles.css
├── favicon.ico
├── README.md
└── icons/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;Since this is a PWA, opening &lt;code&gt;index.html&lt;/code&gt; directly may not work due to Service Worker restrictions. Use a local server instead.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repository&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mamedul/unit-converter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;unit-converter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run a local server&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Easiest way: &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;VS Code Live Server&lt;/a&gt; extension&lt;/li&gt;
&lt;li&gt;Or using Node.js:
&lt;/li&gt;
&lt;/ul&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; &lt;span class="nt"&gt;-g&lt;/span&gt; http-server
http-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open your browser at &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  👨‍💻 About Me
&lt;/h2&gt;

&lt;p&gt;Hi! I’m &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;Mamedul Islam&lt;/a&gt;, a passionate web developer specializing in &lt;strong&gt;PWAs, WooCommerce, WordPress, PHP, MySQL&lt;/strong&gt;, and modern web apps. I’ve been creating digital experiences since 2017.&lt;/p&gt;

&lt;p&gt;📬 Connect with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;WhatsApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;Fiverr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mamedul/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mamedul" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.x.com/mamedul" rel="noopener noreferrer"&gt;X (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m open to freelance projects in &lt;strong&gt;PWA, E-commerce, Firebase, WebSocket, PHP/MySQL&lt;/strong&gt;, and more.&lt;/p&gt;




&lt;h2&gt;
  
  
  📝 License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the &lt;a href="https://mit-license.org/" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt; — free to use, modify, and distribute.&lt;/p&gt;




&lt;p&gt;If you enjoy this project, please consider giving it a ⭐ on &lt;a href="https://github.com/mamedul/unit-converter" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;! Your support helps keep it growing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mamedul/unit-converter/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmamedul%2Funit-converter%3Fstyle%3Dfor-the-badge" alt="GitHub stars" width="95" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>pwa</category>
      <category>webdev</category>
      <category>vanillajs</category>
    </item>
    <item>
      <title>❤️ Love Calculator - PWA</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sat, 23 Aug 2025 15:18:07 +0000</pubDate>
      <link>https://forem.com/mamedul/love-calculator-pwa-17m1</link>
      <guid>https://forem.com/mamedul/love-calculator-pwa-17m1</guid>
      <description>&lt;p&gt;A fun, beautiful, and installable Progressive Web App (PWA) to calculate love compatibility between two people. Built with vanilla HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;MAMEDUL ISLAM&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://mamedul.github.io/love-calculator" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FLive-Demo-brightgreen%3Fstyle%3Dfor-the-badge%26logo%3Dgithubpages" alt="Live Demo" width="130" height="28"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modern UI/UX:&lt;/strong&gt; Gorgeous, responsive design with a pink, gradient-based theme and a repeating heart background.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PWA Ready:&lt;/strong&gt; Installable on any device (desktop or mobile) and works offline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Results:&lt;/strong&gt; Get a unique love score based on the names entered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Heartfelt Animations:&lt;/strong&gt; A beautiful heart-shaped progress bar appears while calculating.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confetti Celebration:&lt;/strong&gt; A fun confetti explosion for scores over 33%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shareable Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Download as Image:&lt;/strong&gt; Download a clean image of your result to share anywhere.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Share via Link:&lt;/strong&gt; Generate a unique, shareable link that reproduces the result for others.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO Optimized:&lt;/strong&gt; Meta tags and structured data for better search engine visibility.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vanilla Stack:&lt;/strong&gt; Built with pure HTML, CSS, and JavaScript. No frameworks, no libraries (except for &lt;code&gt;html2canvas&lt;/code&gt; for image generation).&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;To get a local copy up and running, follow these simple steps.&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Prerequisites
&lt;/h3&gt;

&lt;p&gt;You need a simple local server to run this project, as PWAs require a secure context (&lt;code&gt;https&lt;/code&gt; or &lt;code&gt;localhost&lt;/code&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  🔌 Installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Clone the repo&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mamedul/love-calculator.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Navigate to the project directory&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;love-calculator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Start a local server&lt;/strong&gt;
If you have Python 3 installed, you can run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; http.server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you have Node.js, you can use &lt;code&gt;http-server&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx http-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open in your browser&lt;/strong&gt;
Open &lt;code&gt;http://localhost:8000&lt;/code&gt; (or the port specified by your server) in your browser.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🛠️ Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTML5&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS3&lt;/strong&gt; (with Custom Properties)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vanilla JavaScript&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;html2canvas.js&lt;/strong&gt; - For downloading the result as an image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service Worker API&lt;/strong&gt; - For PWA offline capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 SEO &amp;amp; Discoverability Keywords
&lt;/h2&gt;

&lt;p&gt;This project is optimized for search engines and GitHub search using the following keywords:&lt;br&gt;
love-calculator, love-test, compatibility-test, pwa, progressive-web-app, vanilla-js, html-css-js, web-app, fun-project, javascript-game, relationship-calculator, couple-compatibility, seo-friendly, mobile-first.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Contributing
&lt;/h2&gt;

&lt;p&gt;Contributions, issues, and feature requests are welcome! Feel free to check the &lt;a href="https://www.google.com/search?q=https://github.com/mamedul/love-calculator/issues" rel="noopener noreferrer"&gt;issues page&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  👨‍💻 Author &amp;amp; Hire
&lt;/h3&gt;

&lt;p&gt;Hi! I'm &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;Mamedul Islam&lt;/a&gt;, a passionate Web Developer who builds modern web applications, E-commerce, PWAs, and fast, static, dynamic, responsive websites. Specializing in WooCommerce, Wordpress, PHP, MySQL, and modern web development. Creating exceptional digital experiences since 2017.&lt;/p&gt;

&lt;h4&gt;
  
  
  📬 Connect With Me:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;📱 WhatsApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;💼 Fiverr Profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mamedul/" rel="noopener noreferrer"&gt;👔 LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mamedul" rel="noopener noreferrer"&gt;💻 GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.x.com/mamedul" rel="noopener noreferrer"&gt;🐦 X (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm open for &lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;freelance work&lt;/a&gt;, Woocommerce, E-commerce, Wordpress, PWA development, speed test apps, Firebase projects, websocket, PHP, MySQL and more. &lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;Hire me&lt;/a&gt; to bring your ideas to life with clean, modern code!&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 License:
&lt;/h3&gt;

&lt;p&gt;This project is licensed under the &lt;a href="https://mit-license.org/" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt; — feel free to use, modify, and distribute it freely.&lt;br&gt;
⭐ Don't forget to star this repo if you like it!&lt;/p&gt;




&lt;h3&gt;
  
  
  ⭐ Show Your Support
&lt;/h3&gt;

&lt;p&gt;If you find this extension useful, please consider giving it a star on GitHub! Your support helps motivate further development and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mamedul/unit-converter/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmamedul%2Funit-converter%3Fstyle%3Dfor-the-badge" alt="GitHub stars" width="95" height="28"&gt;&lt;/a&gt;   If you found this project helpful, give it a ⭐ on GitHub!&lt;/p&gt;

</description>
      <category>calculator</category>
      <category>pwa</category>
      <category>lovecalculator</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌐 Internet SpeedTest - Internet Speed Test PWA</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Sat, 23 Aug 2025 15:15:45 +0000</pubDate>
      <link>https://forem.com/mamedul/internet-speedtest-internet-speed-test-pwa-2i1n</link>
      <guid>https://forem.com/mamedul/internet-speedtest-internet-speed-test-pwa-2i1n</guid>
      <description>&lt;p&gt;&lt;a href="https://mamedul.github.io/ispeedtest" rel="noopener noreferrer"&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%2F8en7k0bomytc7i6olwmz.png" alt="Internet Speed Test" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internet SpeedTest&lt;/strong&gt; is a blazing-fast Progressive Web App (PWA) that lets users test their internet speed directly from their browser — without downloading anything!&lt;/p&gt;

&lt;p&gt;Measure &lt;strong&gt;Download&lt;/strong&gt;, &lt;strong&gt;Upload&lt;/strong&gt;, &lt;strong&gt;Ping&lt;/strong&gt;, and &lt;strong&gt;Jitter&lt;/strong&gt; accurately using a lightweight, mobile-first app built with modern web technologies.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Accurate &lt;strong&gt;Download/Upload&lt;/strong&gt; speed measurement&lt;/li&gt;
&lt;li&gt;✅ Real-time &lt;strong&gt;Ping&lt;/strong&gt; and &lt;strong&gt;Jitter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ No app install needed — works in the browser!&lt;/li&gt;
&lt;li&gt;✅ Fully &lt;strong&gt;offline-capable&lt;/strong&gt; PWA&lt;/li&gt;
&lt;li&gt;✅ Optimized for &lt;strong&gt;mobile and desktop&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Add to home screen like a native app&lt;/li&gt;
&lt;li&gt;✅ Clean UI and responsive layout&lt;/li&gt;
&lt;li&gt;✅ Works with all networks: Wi-Fi, 4G/5G, broadband, fiber&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🖼️ App Preview
&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%2F1cj2vpe5prmhid9mh73e.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%2F1cj2vpe5prmhid9mh73e.png" alt="SpeedTest Web App" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo - &lt;a href="https://mamedul.github.io/ispeedtest" rel="noopener noreferrer"&gt;https://mamedul.github.io/ispeedtest&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📲 How to Use
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the website in any modern browser.&lt;/li&gt;
&lt;li&gt;Click "Start Test" to begin speed measurement.&lt;/li&gt;
&lt;li&gt;View your download, upload, ping, and jitter results in seconds.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔧 Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML5, CSS3, Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;Service Worker + Cache API (for offline PWA)&lt;/li&gt;
&lt;li&gt;Custom-built speed test logic (third-party dependencies)&lt;/li&gt;
&lt;li&gt;Optimized for performance and low network overhead&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Installation (for developers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mamedul/ispeedtest.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ispeedtest
&lt;span class="c"&gt;# Just open index.html in your browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or download&lt;br&gt;
&lt;a href="https://github.com/mamedul/ispeedtest/archive/refs/heads/main.zip" rel="noopener noreferrer"&gt;https://github.com/mamedul/ispeedtest/archive/refs/heads/main.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also deploy it to GitHub Pages, Netlify, Vercel, Firebase Hosting, etc.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 Author &amp;amp; Hire Me
&lt;/h2&gt;

&lt;p&gt;Hi! I'm &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;Mamedul Islam&lt;/a&gt;, a passionate Web Developer who builds modern web applications, E-commerce, PWAs, and fast, static, dynamic, responsive websites. Specializing in WooCommerce, Wordpress, PHP, MySQL, and modern web development. Creating exceptional digital experiences since 2017.&lt;/p&gt;

&lt;h4&gt;
  
  
  📬 Connect With Me:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;📱 WhatsApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;💼 Fiverr Profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mamedul/" rel="noopener noreferrer"&gt;👔 LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mamedul" rel="noopener noreferrer"&gt;💻 GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.x.com/mamedul" rel="noopener noreferrer"&gt;🐦 X (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm open for &lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;freelance work&lt;/a&gt;, Woocommerce, E-commerce, Wordpress, PWA development, speed test apps, Firebase projects, websocket, PHP, MySQL and more. &lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;Hire me&lt;/a&gt; to bring your ideas to life with clean, modern code!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 SEO Tags Summary
&lt;/h2&gt;

&lt;p&gt;Keywords: internet speed test, broadband speed test, fast.com alternative, okla alternative, wifi speed, mobile data speed, PWA speed test&lt;/p&gt;

&lt;p&gt;Meta Description: Test your internet speed including download, upload, ping, and jitter. Lightweight PWA with offline support. Built by &lt;a href="https://mamedul2.github.io/" rel="noopener noreferrer"&gt;Mamedul&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ License
&lt;/h3&gt;

&lt;p&gt;This project is open-source and available under the &lt;a href="https://mit-license.org/" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;⭐ Don't forget to star this repo if you like it!&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ Show Your Support
&lt;/h2&gt;

&lt;p&gt;If you find this extension useful, please consider giving it a star on GitHub! Your support helps motivate further development and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mamedul/ispeedtest/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmamedul%2Fispeedtest%3Fstyle%3Dfor-the-badge" alt="GitHub stars" width="95" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>speedtest</category>
      <category>webdev</category>
      <category>broadband</category>
      <category>wifi</category>
    </item>
    <item>
      <title>🌐 Broadband SpeedTest - Internet Speed Test PWA</title>
      <dc:creator>Mamedul Islam</dc:creator>
      <pubDate>Tue, 01 Jul 2025 02:20:25 +0000</pubDate>
      <link>https://forem.com/mamedul/broadband-speedtest-internet-speed-test-pwa-13k</link>
      <guid>https://forem.com/mamedul/broadband-speedtest-internet-speed-test-pwa-13k</guid>
      <description>&lt;h1&gt;
  
  
  🌐 Broadband SpeedTest - Internet Speed Test PWA
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Broadband SpeedTest&lt;/strong&gt; is a blazing-fast Progressive Web App (PWA) that lets users test their internet speed directly from their browser — without downloading anything!&lt;/p&gt;

&lt;p&gt;Measure &lt;strong&gt;Download&lt;/strong&gt;, &lt;strong&gt;Upload&lt;/strong&gt;, &lt;strong&gt;Ping&lt;/strong&gt;, and &lt;strong&gt;Jitter&lt;/strong&gt; accurately using a lightweight, mobile-first app built with modern web technologies.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Accurate &lt;strong&gt;Download/Upload&lt;/strong&gt; speed measurement&lt;/li&gt;
&lt;li&gt;✅ Real-time &lt;strong&gt;Ping&lt;/strong&gt; and &lt;strong&gt;Jitter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ No app install needed — works in the browser!&lt;/li&gt;
&lt;li&gt;✅ Fully &lt;strong&gt;offline-capable&lt;/strong&gt; PWA&lt;/li&gt;
&lt;li&gt;✅ Optimized for &lt;strong&gt;mobile and desktop&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Add to home screen like a native app&lt;/li&gt;
&lt;li&gt;✅ Clean UI and responsive layout&lt;/li&gt;
&lt;li&gt;✅ Works with all networks: Wi-Fi, 4G/5G, broadband, fiber&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🖼️ App Preview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/wide-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="/wide-screenshot.png" alt="SpeedTest Web App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo - &lt;a href="https://broadband-speedtest.github.io/" rel="noopener noreferrer"&gt;https://broadband-speedtest.github.io&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📲 How to Use
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the website in any modern browser.&lt;/li&gt;
&lt;li&gt;Click "Start Test" to begin speed measurement.&lt;/li&gt;
&lt;li&gt;View your download, upload, ping, and jitter results in seconds.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔧 Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML5, CSS3, Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;Service Worker + Cache API (for offline PWA)&lt;/li&gt;
&lt;li&gt;Custom-built speed test logic (third-party dependencies)&lt;/li&gt;
&lt;li&gt;Optimized for performance and low network overhead&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Installation (for developers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/broadband-speedtest/broadband-speedtest.github.io.git
&lt;span class="nb"&gt;cd &lt;/span&gt;broadband-speedtest.github.io
&lt;span class="c"&gt;# Just open index.html in your browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or download&lt;br&gt;
&lt;a href="https://github.com/broadband-speedtest/broadband-speedtest.github.io/archive/refs/heads/main.zip" rel="noopener noreferrer"&gt;https://github.com/broadband-speedtest/broadband-speedtest.github.io/archive/refs/heads/main.zip&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You can also deploy it to GitHub Pages, Netlify, Vercel, Firebase Hosting, etc.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  👨‍💻 Author &amp;amp; Hire Me
&lt;/h2&gt;

&lt;p&gt;Hi! I'm &lt;a href="https://mamedul.github.io/" rel="noopener noreferrer"&gt;Mamedul Islam&lt;/a&gt;, a passionate Web Developer who builds modern web applications, E-commerce, PWAs, and fast, static, dynamic, responsive websites. Specializing in WooCommerce, Wordpress, PHP, MySQL, and modern web development. Creating exceptional digital experiences since 2017.&lt;/p&gt;

&lt;h3&gt;
  
  
  📬 Connect With Me:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;📱 WhatsApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;💼 Fiverr Profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mamedul/" rel="noopener noreferrer"&gt;👔 LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mamedul" rel="noopener noreferrer"&gt;💻 GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.x.com/mamedul" rel="noopener noreferrer"&gt;🐦 X (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm open for &lt;a href="https://www.fiverr.com/mamedul" rel="noopener noreferrer"&gt;freelance work&lt;/a&gt;, Woocommerce, E-commerce, Wordpress, PWA development, speed test apps, Firebase projects, websocket, PHP, MySQL and more. &lt;a href="https://wa.me/8801847406830" rel="noopener noreferrer"&gt;Hire me&lt;/a&gt; to bring your ideas to life with clean, modern code!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 SEO Tags Summary
&lt;/h2&gt;

&lt;p&gt;Keywords: internet speed test, broadband speed test, fast.com alternative, okla alternative, wifi speed, mobile data speed, PWA speed test&lt;/p&gt;

&lt;p&gt;Meta Description: Test your internet speed including download, upload, ping, and jitter. Lightweight PWA with offline support. Built by &lt;a href="https://mamedul2.github.io/" rel="noopener noreferrer"&gt;Mamedul&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ License
&lt;/h3&gt;

&lt;p&gt;This project is open-source and available under the &lt;a href="https://chatgpt.com/LICENSE" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;⭐ Don't forget to star this repo if you like it!&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ More Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add this to your GitHub repo’s root as &lt;code&gt;README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://github.com/topics" rel="noopener noreferrer"&gt;GitHub Topics&lt;/a&gt; like &lt;code&gt;internet-speed&lt;/code&gt;, &lt;code&gt;speedtest&lt;/code&gt;, &lt;code&gt;pwa&lt;/code&gt;, &lt;code&gt;offline-first&lt;/code&gt;, &lt;code&gt;javascript&lt;/code&gt;, &lt;code&gt;webapp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Submit to product directories like &lt;a href="https://www.producthunt.com/" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; or &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Deploy live (Netlify, Vercel, Firebase Hosting) and link it in the README.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Let me know if you'd like a &lt;strong&gt;GitHub Pages deployment URL&lt;/strong&gt;, or a &lt;strong&gt;badge layout&lt;/strong&gt; for downloads, build status, etc.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
