<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdulaziz Hamzah</title>
    <description>The latest articles on DEV Community by Abdulaziz Hamzah (@abdulaziz_hamzah_884bb727).</description>
    <link>https://dev.to/abdulaziz_hamzah_884bb727</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%2F2979418%2Fbcef5be3-9240-46cc-bdc4-ead9cf54e4d6.png</url>
      <title>DEV Community: Abdulaziz Hamzah</title>
      <link>https://dev.to/abdulaziz_hamzah_884bb727</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdulaziz_hamzah_884bb727"/>
    <language>en</language>
    <item>
      <title>Project #1: Loadtest</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Mon, 09 Mar 2026 22:06:23 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/project-1-loadtest-5hld</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/project-1-loadtest-5hld</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;A minimal &lt;code&gt;wrk&lt;/code&gt; clone written in Go for learning purposes. This is a simple HTTP load testing tool that demonstrates concurrent programming and performance measurement. The tool sends concurrent HTTP requests to a target URL and provides detailed statistics about latency, throughput, and success rates.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Libraries&lt;/strong&gt;: &lt;code&gt;net/http&lt;/code&gt;, &lt;code&gt;flag&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Command-line interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Learning Goals
&lt;/h2&gt;

&lt;p&gt;What I aimed to learn from this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go goroutines and channels for concurrent programming&lt;/li&gt;
&lt;li&gt;Semaphore pattern for controlling concurrency&lt;/li&gt;
&lt;li&gt;HTTP client configuration and timeout handling&lt;/li&gt;
&lt;li&gt;Performance measurement and statistics collection&lt;/li&gt;
&lt;li&gt;Command-line interface design with flag parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTTP load testing with configurable concurrency&lt;/li&gt;
&lt;li&gt;Configurable request count and timeout&lt;/li&gt;
&lt;li&gt;Real-time statistics (latency, throughput, success/failure rates)&lt;/li&gt;
&lt;li&gt;Simple command-line interface&lt;/li&gt;
&lt;li&gt;Safe concurrency with semaphore pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Managing concurrent requests safely
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Needed to control the number of concurrent HTTP requests to avoid overwhelming the system and the target server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Implemented a semaphore pattern using buffered channels. Created a worker pool that limits concurrent goroutines by passing "tokens" through a channel. This ensures exactly the specified number of requests run concurrently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: Accurate timing measurements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Needed to measure individual request latencies while also calculating overall throughput.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Used &lt;code&gt;time.Now()&lt;/code&gt; before each HTTP request and calculated duration after completion. For overall throughput, measured total time from start to finish and divided by completed requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 3: Proper resource cleanup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: HTTP response bodies needed to be closed to prevent memory leaks, especially with many concurrent requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Used &lt;code&gt;defer resp.Body.Close()&lt;/code&gt; immediately after checking for errors to ensure resources are always cleaned up, even if panics occur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Architecture
&lt;/h2&gt;

&lt;p&gt;The project follows a clean separation of concerns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;main.go&lt;/strong&gt;: Entry point, argument parsing, and result reporting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cli.go&lt;/strong&gt;: Command-line flag definitions and parsing logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;worker.go&lt;/strong&gt;: Core concurrent execution logic using semaphore pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stats.go&lt;/strong&gt;: Statistical calculations and result aggregation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Key design patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semaphore Pattern&lt;/strong&gt;: Buffered channel controls concurrent access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Pool&lt;/strong&gt;: Goroutines execute tasks from a shared channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync.WaitGroup&lt;/strong&gt;: Ensures all goroutines complete before exiting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation &amp;amp; Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and build&lt;/span&gt;
git clone https://github.com/Azizham66/loadtest.git
&lt;span class="nb"&gt;cd &lt;/span&gt;loadtest
go build &lt;span class="nt"&gt;-o&lt;/span&gt; loadtest &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Basic usage&lt;/span&gt;
./loadtest &lt;span class="nt"&gt;-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://example.com &lt;span class="nt"&gt;-requests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100

&lt;span class="c"&gt;# High concurrency test&lt;/span&gt;
./loadtest &lt;span class="nt"&gt;-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.example.com &lt;span class="nt"&gt;-requests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="nt"&gt;-concurrency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50

&lt;span class="c"&gt;# Custom timeout&lt;/span&gt;
./loadtest &lt;span class="nt"&gt;-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://slow-server.com &lt;span class="nt"&gt;-requests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;500 &lt;span class="nt"&gt;-timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-url string&lt;/code&gt;: URL to stress test (required)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-requests int&lt;/code&gt;: Number of requests to send (default: 10)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-concurrency int&lt;/code&gt;: Number of concurrent requests (default: 10)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-timeout int&lt;/code&gt;: Timeout in seconds (default: 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Skills
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go Concurrency&lt;/strong&gt;: Basic understanding of goroutines, channels, and select statements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semaphore Pattern&lt;/strong&gt;: How to implement resource limiting using buffered channels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Client Configuration&lt;/strong&gt;: Custom timeouts and connection management in Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Measurement&lt;/strong&gt;: Accurate timing and statistical calculations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI Development&lt;/strong&gt;: Flag parsing and user-friendly command-line interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Concepts &amp;amp; Patterns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent Programming&lt;/strong&gt;: Safe coordination between multiple goroutines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Management&lt;/strong&gt;: Proper cleanup in concurrent environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Graceful failure handling in distributed systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistics&lt;/strong&gt;: Latency distribution and throughput calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Areas of Improvement
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better Code Organization&lt;/strong&gt;: Implement proper Go package structure with &lt;code&gt;cmd&lt;/code&gt;, &lt;code&gt;internal&lt;/code&gt;, and &lt;code&gt;pkg&lt;/code&gt; directories, plus interface abstractions for testability and configuration management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Error Handling&lt;/strong&gt;: Create custom error types for different failure scenarios, implement error aggregation for better categorization, and add retry logic for transient failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Statistics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: 1 day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines of Code&lt;/strong&gt;: ~200 lines across 4 files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficulty&lt;/strong&gt;: Beginner/Intermediate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technology Area&lt;/strong&gt;: System Programming / Open Source Tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://go.dev/talks/2012/concurrency.slide#1" rel="noopener noreferrer"&gt;Go Concurrency Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wg/wrk" rel="noopener noreferrer"&gt;wrk documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2616" rel="noopener noreferrer"&gt;HTTP Performance Testing Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This is Project #1 of my 100 Projects Challenge. Read more about the challenge &lt;a href="https://dev.to/abdulaziz_hamzah_884bb727/i-started-a-100-projects-challenge-not-exactly-in-100-days-and-heres-why-you-should-too-54a8"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Started a 100 Projects in 100 Days Challenge (Not Exactly in 100 Days) — And Here’s Why You Should Too</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Mon, 09 Mar 2026 16:15:06 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/i-started-a-100-projects-challenge-not-exactly-in-100-days-and-heres-why-you-should-too-54a8</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/i-started-a-100-projects-challenge-not-exactly-in-100-days-and-heres-why-you-should-too-54a8</guid>
      <description>&lt;p&gt;A lot of developers learn new concepts, tools or languages, by following a course, watching tutorials or reading documentation, and then building project, but nobody talks about the hardest parts: &lt;strong&gt;applying what you learned into real projects&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;It usually goes like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You learn a new tool, language or framework&lt;/li&gt;
&lt;li&gt;You want to build something to apply what you learned into a real project&lt;/li&gt;
&lt;li&gt;You don't know what to build and you struggle to find ideas &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After a while you lose motivation and end up building nothing or you start following tutorials and what happens is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You watch someone build something.&lt;/li&gt;
&lt;li&gt;You understand it.&lt;/li&gt;
&lt;li&gt;You feel productive.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or you get stuck in tutorial hell.&lt;br&gt;
And then... you try building something on you own.&lt;br&gt;
Suddenly you brain goes blank.&lt;/p&gt;

&lt;p&gt;I've realized the biggest gap between learning programming and becoming a professional engineer is not knowledge, it's experience. So I decided to fix that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I started a 100 Projects Challenge.&lt;/strong&gt;&lt;br&gt;
The name suggests 100 projects in 100 days, but realistically it might take longer. Some projects may take a day, others up to a week. The important part isn't the calendar, it's the consistent building and showing up.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build 100 meaningful coding projects that force me to explore different technologies, tools, and fields in computer science and engineering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Why I started this challenge
&lt;/h2&gt;

&lt;p&gt;As a junior developer and being a beginner myself, I realized that most beginner projects looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To-Do List&lt;/li&gt;
&lt;li&gt;Calculator&lt;/li&gt;
&lt;li&gt;Weather App&lt;/li&gt;
&lt;li&gt;Blog CRUD&lt;/li&gt;
&lt;li&gt;E-Commerce clone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those projects were useful... in 2018.&lt;br&gt;
While those projects are great starting point to teach you the fundamentals of software development. In an era where LLMs can generate boilerplate CRUD code in seconds, the value of a developer shifts from writing code to understanding systems.&lt;/p&gt;

&lt;p&gt;So I wanted something different...&lt;br&gt;
Something that would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Force me to research, read documentation and know how to learn&lt;/li&gt;
&lt;li&gt;Expose me to new technologies and tools I would have never touched&lt;/li&gt;
&lt;li&gt;Help me gain real skill&lt;/li&gt;
&lt;li&gt;Make actual project worth documenting and showing on my resume&lt;/li&gt;
&lt;li&gt;Learn how things actually work which is something rarely touched in modern courses and tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This challenge is designed to build system-thinking.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Rules of the Challenge
&lt;/h2&gt;

&lt;p&gt;To make the challenge meaningful, I created a few rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Every project must teach something meaningful
&lt;/h3&gt;

&lt;p&gt;Basic beginner projects don’t count.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No todo lists.&lt;/li&gt;
&lt;li&gt;No simple CRUD dashboards.&lt;/li&gt;
&lt;li&gt;No tutorial clones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project must introduce a real concept or skill.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a feature flag engine&lt;/li&gt;
&lt;li&gt;Writing a small network protocol&lt;/li&gt;
&lt;li&gt;Experimenting with computer graphics&lt;/li&gt;
&lt;li&gt;Creating a simple embedded system&lt;/li&gt;
&lt;li&gt;Integrating AI into real tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is learning something valuable each time.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Projects must explore different technologies
&lt;/h3&gt;

&lt;p&gt;This challenge isn’t about mastering one language.&lt;br&gt;
It’s about exploring the ecosystem of computer engineering.&lt;/p&gt;

&lt;p&gt;Projects may involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web development&lt;/li&gt;
&lt;li&gt;System programming&lt;/li&gt;
&lt;li&gt;Embedded systems&lt;/li&gt;
&lt;li&gt;IoT&lt;/li&gt;
&lt;li&gt;AI engineering&lt;/li&gt;
&lt;li&gt;Game development&lt;/li&gt;
&lt;li&gt;Computer graphic&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Open source tooling&lt;/li&gt;
&lt;li&gt;Or anything else you're interesting in and want to learn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different languages and environments are encouraged. You don't have to learn 10 languages, but you should know how to read documentation and research when you need.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Each project must provide real value
&lt;/h3&gt;

&lt;p&gt;Every project should give the challenger something tangible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reusable library&lt;/li&gt;
&lt;li&gt;A useful tool&lt;/li&gt;
&lt;li&gt;A deeper understanding of a field&lt;/li&gt;
&lt;li&gt;Or anything you can show off and be proud that you built it&lt;/li&gt;
&lt;li&gt;experience with real engineering concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t just “finishing projects”.&lt;br&gt;
It’s gaining skills you can carry forward.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Projects must be small but meaningful
&lt;/h3&gt;

&lt;p&gt;Each project should take:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimum&lt;/strong&gt;: 1 day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum&lt;/strong&gt;: 1 week&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge is designed to encourage focused exploration, not multi-month builds.&lt;br&gt;
You also cannot start a new project until the current one is finished.&lt;br&gt;
No half-built graveyards of abandoned repos.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Every project must be documented
&lt;/h3&gt;

&lt;p&gt;Finishing a project is only half the job.&lt;/p&gt;

&lt;p&gt;Every project must be documented as either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A DEV article&lt;/li&gt;
&lt;li&gt;A blog post&lt;/li&gt;
&lt;li&gt;An open-source repository with proper documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Documenting forces you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organize your thoughts&lt;/li&gt;
&lt;li&gt;Explain your decisions&lt;/li&gt;
&lt;li&gt;Share knowledge with others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it builds a public record of your progress.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Kinds of Projects Will Be Included?
&lt;/h2&gt;

&lt;p&gt;The challenge spans multiple areas of computer science and engineering.&lt;/p&gt;

&lt;p&gt;Some examples of topics I plan to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web development tools and libraries&lt;/li&gt;
&lt;li&gt;AI-powered applications&lt;/li&gt;
&lt;li&gt;Embedded systems experiments&lt;/li&gt;
&lt;li&gt;IoT devices&lt;/li&gt;
&lt;li&gt;3D computer graphics (OpenGL / Vulkan etc.)&lt;/li&gt;
&lt;li&gt;Low-level system programming&lt;/li&gt;
&lt;li&gt;Networking tools&lt;/li&gt;
&lt;li&gt;Developer utilities&lt;/li&gt;
&lt;li&gt;Open source contributions&lt;/li&gt;
&lt;li&gt;Game development experiments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project focuses on one meaningful concept.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a feature flag engine&lt;/li&gt;
&lt;li&gt;Implementing a mini task scheduler&lt;/li&gt;
&lt;li&gt;Creating a simple TCP protocol&lt;/li&gt;
&lt;li&gt;Writing a CLI tool that solves a real problem&lt;/li&gt;
&lt;li&gt;Integrating an AI agent into an application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small projects, but real engineering ideas.&lt;br&gt;
You can adjust those to align with your preferences and interests.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Challenge Is Powerful
&lt;/h2&gt;

&lt;p&gt;This approach solves several problems developers face:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tutorial Hell&lt;/strong&gt;: You stop watching tutorials and start building things yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fear of New Technologies&lt;/strong&gt;: Instead of committing months to something new, you try it in a one-week experiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Portfolio Projects&lt;/strong&gt;,
after 100 projects, you’ll have:

&lt;ul&gt;
&lt;li&gt;dozens of repositories&lt;/li&gt;
&lt;li&gt;many documented experiments&lt;/li&gt;
&lt;li&gt;experience across multiple domains&lt;/li&gt;
&lt;li&gt;That’s far more interesting than another CRUD app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Engineering Experience.&lt;/strong&gt; Each project teaches something concrete, in my case:

&lt;ul&gt;
&lt;li&gt;networking fundamentals&lt;/li&gt;
&lt;li&gt;secure coding practices&lt;/li&gt;
&lt;li&gt;graphics pipelines&lt;/li&gt;
&lt;li&gt;embedded development&lt;/li&gt;
&lt;li&gt;AI integration patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Over time, the knowledge compounds.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the challenge works
&lt;/h2&gt;

&lt;p&gt;Coming up with project ideas sucks, and it is the reason many beginners feel overwhelmed or clueless, so you don't have to do it, I wrote this prompt which you can edit according to your preferences and paste it into your AI assistant&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# 100 projects in 100 days challenge.&lt;/span&gt;
The goal of this challenge is to build 100 meaningful coding projects in a short time period (may be more than 100 days in total) where I get to research, learn and experience with different languages, concepts, fields and tools. The project is going to consist of 100 different coding projects that are short and sweet, completable in the minimum of 1 day and the maximum of 1 week, with every project providing a real value I can take out. The rules consist of the following: 
&lt;span class="p"&gt;-&lt;/span&gt; Every project should touch something meaningful I can learn from, basic things like To-Do lists, Crud Apps, ECommerce websites etc. 
&lt;span class="p"&gt;
-&lt;/span&gt; Projects should not be a single language, they should force exploration and working in different languages and environment, while being welcoming if the challenger is new to the language 
&lt;span class="p"&gt;
-&lt;/span&gt; Each project should leverage one tool or topic that would benefit the challenger with a real value 
&lt;span class="p"&gt;
-&lt;/span&gt; Each project can be completed in the minimum of 1 day and the maximum of 1 week, and the challenger can NOT start a new project before confirming they finished the current one. 
&lt;span class="p"&gt;
-&lt;/span&gt; Project topics include to web and application development, embedded systems, IoT software, Low level system programming, AI engineering (integrating AI into real projects using agentic systems or APIs), game development, open source, computer graphics (preferably Vulkan, could go with OpenGL if the entry barrier for Vulkan is not beginner friendly), computer networks etc. The projects should not be too unrelated or teach a skill that is unrelated, the goal is to build something real and get real skills and get into that field. 
&lt;span class="p"&gt;
-&lt;/span&gt; Projects should be welcomed to new comers, and should be doable if the challenger has 0 experience in the field. 
&lt;span class="p"&gt;
-&lt;/span&gt; Every Project should teach the challenger something about the field it's related to, the challenger should finish a project with a related skill they can take home (e.g. a minimal http server, if the project is related to systems and computer networks) 
&lt;span class="p"&gt;
-&lt;/span&gt; Every project idea will be generated by you with a section mentioning prerequisites, key skills, background assumptions and a quick guide to get started with resource and references. The challenger can request a reroll if they feel the project is too hard or too easy. 
&lt;span class="p"&gt;
-&lt;/span&gt; Every project should be documented whether it's a short article on a platform like DEV.to or a personal blog, or an open source repository with well written documentation The project aims to give the challenger a chance to get into the provided fields, by having real skills and meaningful experience to go further and expand in these topics and fields.

&lt;span class="nt"&gt;&amp;lt;You&lt;/span&gt; &lt;span class="na"&gt;can&lt;/span&gt; &lt;span class="na"&gt;add&lt;/span&gt; &lt;span class="na"&gt;any&lt;/span&gt; &lt;span class="na"&gt;other&lt;/span&gt; &lt;span class="na"&gt;custom&lt;/span&gt; &lt;span class="na"&gt;instructions&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this to your AI assistant and update it every time you finish a project.&lt;/p&gt;

&lt;p&gt;For each project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The idea is generated.&lt;/li&gt;
&lt;li&gt;The project includes:

&lt;ul&gt;
&lt;li&gt;prerequisites&lt;/li&gt;
&lt;li&gt;key skills&lt;/li&gt;
&lt;li&gt;a quick guide to get started&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The project is built.&lt;br&gt;
The results are documented publicly.&lt;br&gt;
If a project turns out to be too difficult or too trivial, it can be rerolled.&lt;/p&gt;

&lt;p&gt;The goal isn’t punishment, the goal is learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Goal
&lt;/h2&gt;

&lt;p&gt;The purpose of this challenge isn’t just completing 100 projects.&lt;br&gt;
It’s about becoming comfortable building things in unfamiliar territory.&lt;/p&gt;

&lt;p&gt;By the end of the challenge I hope to have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explored many areas of computer engineering&lt;/li&gt;
&lt;li&gt;developed practical skills in multiple domains&lt;/li&gt;
&lt;li&gt;built a large collection of real projects&lt;/li&gt;
&lt;li&gt;documented the entire journey&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And hopefully helped others start their own challenges too.&lt;/p&gt;




&lt;p&gt;If you’ve ever felt stuck in tutorial hell or unsure how to explore new technologies…&lt;/p&gt;

&lt;p&gt;Try building 100 small, meaningful projects.&lt;/p&gt;

&lt;p&gt;You might be surprised how much you learn.&lt;/p&gt;

</description>
      <category>100daysofcode</category>
      <category>learning</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>StudyAI: Transform PDFs into interactive study materials with AI</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Tue, 03 Mar 2026 14:38:50 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/studyai-transform-pdfs-into-interactive-study-materials-with-ai-173d</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/studyai-transform-pdfs-into-interactive-study-materials-with-ai-173d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&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%2Fj705xisv18n6o4vfm4dw.jpeg" 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%2Fj705xisv18n6o4vfm4dw.jpeg" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;StudyAI&lt;/strong&gt;, an interactive study tool that transforms uploaded PDF files into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart flashcards
&lt;/li&gt;
&lt;li&gt;Auto-generated quizzes
&lt;/li&gt;
&lt;li&gt;Structured study notes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which happens using your own API key, which never leaves the browser, making sure your data stays secure.&lt;/p&gt;

&lt;p&gt;The goal was simple: reduce the friction between reading and actually retaining information. Instead of passively scrolling for hours through PDFs, students can actively engage with their material in seconds.&lt;/p&gt;

&lt;p&gt;The application is powered by &lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; by &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;, which handles the content generation pipeline via API integration.&lt;/p&gt;

&lt;p&gt;Google Gemini played a major role throughout the entire lifecycle of this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing the UI/UX of the application
&lt;/li&gt;
&lt;li&gt;Implementing the core components and functionality
&lt;/li&gt;
&lt;li&gt;Building the initial prototype and MVP skeleton
&lt;/li&gt;
&lt;li&gt;Powering the study generation features through its API
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This wasn't just an AI feature added at the end, Gemini was part of both the development and runtime layers of the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can try the project yourself here:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://studyai-alpha.vercel.app/" rel="noopener noreferrer"&gt;https://studyai-alpha.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is also fully open source:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Azizham66/StudyAI" rel="noopener noreferrer"&gt;https://github.com/Azizham66/StudyAI&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Feel free to explore the codebase, open issues, or contribute.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;I had been wanting to seriously build something with Next.js for a while, but never had the right idea. This project gave me the push I needed.&lt;/p&gt;

&lt;p&gt;While building StudyAI, I gained hands-on experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static Site Generation (SSG), Server-Side Rendering (SSR), and Client-Side Rendering (CSR)&lt;/li&gt;
&lt;li&gt;The difference between Server and Client Components&lt;/li&gt;
&lt;li&gt;Building API routes using the App Router&lt;/li&gt;
&lt;li&gt;Handling file uploads securely and processing them server-side&lt;/li&gt;
&lt;li&gt;Clean routing without relying on external routing libraries&lt;/li&gt;
&lt;li&gt;Structuring scalable full-stack applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beyond Next.js, I learned how to design a production-ready AI-powered application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structuring prompts for predictable AI output&lt;/li&gt;
&lt;li&gt;Managing AI response formatting&lt;/li&gt;
&lt;li&gt;Handling token limits and latency trade-offs&lt;/li&gt;
&lt;li&gt;Integrating AI into real-world workflows instead of treating it as a novelty feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project shifted my mindset from “adding AI” to “designing with AI.”&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;Using Google Gemini to build a full application was an insightful experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Gemini Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Strong UI/UX design suggestions
&lt;/li&gt;
&lt;li&gt;Rapid scaffolding of components
&lt;/li&gt;
&lt;li&gt;Generating structured content like quizzes and flashcards
&lt;/li&gt;
&lt;li&gt;Helping prototype ideas extremely quickly
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where Gemini Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type safety issues:&lt;/strong&gt; It frequently defaulted to using explicit &lt;code&gt;any&lt;/code&gt;, which required manual refactoring to maintain TypeScript standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window drift:&lt;/strong&gt; After extended prompting sessions, it sometimes lost context and generated irrelevant or conflicting code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unoptimized React components:&lt;/strong&gt; In several cases, it produced components that caused unnecessary re-renders or inefficient patterns, leading to performance issues that required manual optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These friction points weren't blockers, but they highlighted the importance of reviewing and refining AI-generated code rather than blindly accepting it.&lt;/p&gt;

&lt;p&gt;Overall, Gemini significantly accelerated development, but real human intervention remained critical. Reviewing architecture decisions, enforcing type safety, optimizing performance, and validating logic highlighted the importance of never taking AI-generated code at face value.&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>ai</category>
    </item>
    <item>
      <title>Qur'an Search MCP Server</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Mon, 02 Mar 2026 00:04:47 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/quran-search-mcp-server-54hh</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/quran-search-mcp-server-54hh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;This project was built to help the Muslim dev community build faster and more efficient AI powered applications&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;When I was browsing, I found an open source project that caught my eye, it was a Qur'an search engine built with TypeScript and published as an NPM package, so I thought to myself to use this to solve a very common problem.&lt;/p&gt;

&lt;p&gt;😵‍💫 Problem: whenever AI agents are asked religious questions or questions related to the Qur'an (the holy book of Islam) it would either give out misinformation, which is problematic especially when the question is related to the person's religion and religious practices, or in the better case, it would have to search the web, which spends more tokens and is slower, so I thought I will take the exiting engine and build an MCP adaptation layer on top of it. &lt;/p&gt;

&lt;p&gt;✅ Result: When prompted, the AI agent will use the search tool to search locally using Arabic optimized search engine, which will give more accurate information as well as removing the need for online searches and optimize token usage and response speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1ZgLW1SKEo4bF4xy640papgH0FDCO5I4T/view?usp=sharing" rel="noopener noreferrer"&gt;Video Demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Azizham66/quran-search-MCP" rel="noopener noreferrer"&gt;Github Repo Link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Building the Quran Search MCP was an exercise in transforming a high-performance TypeScript library into a standardized AI tool. Here is the concise breakdown of the development process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Architectural Foundation:&lt;br&gt;
I adopted a pnpm Monorepo structure to decouple the core search logic from the MCP communication layer. This ensured that the quran-search-engine remained a pure dependency, while the mcp-server acted as the specialized interface for LLMs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High-Performance Data Bootstrapping:&lt;br&gt;
To eliminate search latency, I implemented a Singleton Data Cache. Using Promise.all(), the server concurrently loads the Quranic text, morphological maps, and word indexes into memory during the initial handshake. This ensures sub-millisecond response times for the AI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Protocol Integration:&lt;br&gt;
Using the official MCP SDK, I mapped the engine’s search capabilities to a structured toolset. I utilized Zod schemas to strictly define search parameters (fuzzy, exact, prefix), ensuring the AI assistant provides valid, typed inputs that the engine can process without errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dual-Purpose Distribution:&lt;br&gt;
I configured the package for Dual-Mode Usage:&lt;br&gt;
CLI: Optimized for immediate use via npx for AI Desktop clients.&lt;br&gt;
Library: Used Subpath Exports in package.json so developers can import the engine or the server independently into their own TypeScript projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validation &amp;amp; Stress Testing:&lt;br&gt;
I bypassed the GUI and tested the integration using JSON-RPC piping. By feeding raw JSON strings directly into the server via the terminal, I verified protocol compliance and error handling before the first deployment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building a Quran Search MCP Server: From Monorepo to npm Package</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Sat, 28 Feb 2026 19:23:55 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/building-a-quran-search-mcp-server-from-monorepo-to-npm-package-2o8c</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/building-a-quran-search-mcp-server-from-monorepo-to-npm-package-2o8c</guid>
      <description>&lt;p&gt;Today I want to share the journey of building a complete Quran Search MCP (Model Context Protocol) server that bridges AI assistants with powerful Quran search capabilities. This project showcases how to transform an existing search engine into an MCP-compatible server while maintaining clean architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;The goal was to create an MCP server that exposes the excellent &lt;a href="https://github.com/adelpro/quran-search-engine" rel="noopener noreferrer"&gt;quran-search-engine&lt;/a&gt; by &lt;a href="https://github.com/adelpro" rel="noopener noreferrer"&gt;Adel Benyahia&lt;/a&gt; to AI assistants through the Model Context Protocol. The original engine is a powerful TypeScript library for searching Quranic text with morphological analysis, fuzzy matching, and advanced features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Monorepo Structure
&lt;/h3&gt;

&lt;p&gt;I chose a monorepo approach to separate concerns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quran-search-MCP/
├── packages/
│   └── quran-search-engine/     # Original search engine 
├── mcp-server/                  # MCP server adaptation
│   ├── src/                     # Server source code
│   │   ├── data/                # Data caching module
│   │   ├── handlers/            # Search handlers
│   │   ├── tools/               # MCP tools
│   │   ├── types/               # Type definitions
│   │   └── index.ts             # Server entry point
│   ├── dist/                    # Built server files
│   ├── package.json              # Server package config
│   └── tsconfig.json           # TypeScript config
├── README.md                    # This documentation
├── CHANGELOG.md                 # Version history
└── package.json                 # Workspace configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this structure?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear separation&lt;/strong&gt;: Engine and server concerns are isolated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Engine can be used independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Each package has its own lifecycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Engine tests run separately from server logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Loading Strategy
&lt;/h3&gt;

&lt;p&gt;The MCP server needed to load three key datasets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Data caching implementation&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loadDataCache&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DataCache&lt;/span&gt;&lt;span class="o"&gt;&amp;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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;quranData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;morphologyMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wordMap&lt;/span&gt;&lt;span class="p"&gt;]&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;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nf"&gt;loadQuranData&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;loadMorphology&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;loadWordMap&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="nx"&gt;dataCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;quranData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// Complete Quranic verses&lt;/span&gt;
    &lt;span class="nx"&gt;morphologyMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Morphological analysis per verse&lt;/span&gt;
    &lt;span class="nx"&gt;wordMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// Word-to-verse mappings&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;dataCache&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;&lt;strong&gt;Performance benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single load&lt;/strong&gt;: All data loaded once during server bootstrap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory efficiency&lt;/strong&gt;: Data cached for fast access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel loading&lt;/strong&gt;: All three datasets loaded concurrently&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MCP Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Server Setup
&lt;/h3&gt;

&lt;p&gt;The MCP server uses the official MCP SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/mcp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&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="nf"&gt;loadDataCache&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;server&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;McpServer&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;quran-search-engine-mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;registerSearchTools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&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;transport&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;StdioServerTransport&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;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&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;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tool Registration
&lt;/h3&gt;

&lt;p&gt;The search tool is registered with Zod schema validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search&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;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Search Quran&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;matchType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;exact&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;fuzzy&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;prefix&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;includeMorphology&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;optional&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="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&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="c1"&gt;// Search implementation&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;
  
  
  Dual Export Strategy
&lt;/h2&gt;

&lt;p&gt;The package supports both CLI and library usage:&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quran-search-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Library Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quran-search-mcp&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Subpath Exports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./mcp-server/dist/index.d.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./mcp-server/dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./mcp-server/dist/index.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"./engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./packages/quran-search-engine/dist/index.d.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./packages/quran-search-engine/dist/index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./packages/quran-search-engine/dist/index.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Build Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TypeScript Compilation
&lt;/h3&gt;

&lt;p&gt;Both packages use TypeScript but with different build tools:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engine&lt;/strong&gt;: Uses &lt;code&gt;tsup&lt;/code&gt; for bundling with multiple outputs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsup"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MCP Server&lt;/strong&gt;: Uses &lt;code&gt;tsc&lt;/code&gt; for direct compilation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Workspace Scripts
&lt;/h3&gt;

&lt;p&gt;The root package orchestrates both builds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pnpm -C packages/quran-search-engine build &amp;amp;&amp;amp; pnpm -C mcp-server build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build:engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pnpm -C packages/quran-search-engine build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build:mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pnpm -C mcp-server build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prepublishOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pnpm run build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Features Implemented
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search Capabilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact Search&lt;/strong&gt;: Find exact Arabic text matches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuzzy Search&lt;/strong&gt;: Find similar words and phrases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix Search&lt;/strong&gt;: Find words starting with specific prefixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Morphological Analysis&lt;/strong&gt;: Search by lemma and root words&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination&lt;/strong&gt;: Control result sets with limit and offset&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Optimizations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Caching&lt;/strong&gt;: Quran data loaded once at startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficient&lt;/strong&gt;: Optimized data structures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Full TypeScript support with Zod validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Comprehensive error handling and logging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  npm Package Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Package Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quran-search-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Quran Search Engine MCP Server - Complete package with engine and server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./mcp-server/dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quran-search-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./mcp-server/dist/index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mcp-server/dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"packages/quran-search-engine/dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CHANGELOG.md"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Repository Structure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Azizham66/quran-search-MCP" rel="noopener noreferrer"&gt;https://github.com/Azizham66/quran-search-MCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribution&lt;/strong&gt;: Proper credit to original quran-search-engine project&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing &amp;amp; Validation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual MCP Testing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test tools list&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}'&lt;/span&gt; | npx quran-search-mcp

&lt;span class="c"&gt;# Test search functionality&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "search", "arguments": {"query": "الرحمن"}}, "id": 2}'&lt;/span&gt; | npx quran-search-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build Verification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Both packages build successfully&lt;/span&gt;
pnpm build

&lt;span class="c"&gt;# Engine tests pass&lt;/span&gt;
pnpm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Workspace Dependencies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: MCP server needed to import engine package&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Used &lt;code&gt;workspace:*&lt;/code&gt; dependency and proper pnpm workspace configuration&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge 2: Data Loading
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Large Quran datasets could slow startup&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Implemented singleton cache with Promise.all() for parallel loading&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge 3: Dual Usage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Support both CLI and library usage&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Added direct execution check and proper exports&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge 4: Type Safety
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: MCP protocol requires strict schema validation&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Used Zod for runtime validation and TypeScript for compile-time safety&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo Benefits&lt;/strong&gt;: Clear separation of concerns while maintaining unified development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Protocol&lt;/strong&gt;: Standardized way to expose tools to AI assistants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Matters&lt;/strong&gt;: Data caching strategies significantly impact user experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export Strategy&lt;/strong&gt;: Dual exports (main package + subpaths) provide flexibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Tools&lt;/strong&gt;: Different tools serve different purposes (tsup vs tsc)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Accurate, up-to-date docs are crucial for adoption&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Potential Enhancements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming Results&lt;/strong&gt;: For large search result sets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching Layer&lt;/strong&gt;: Redis or similar for distributed deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin System&lt;/strong&gt;: Allow custom search algorithms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Transports&lt;/strong&gt;: Support HTTP, WebSocket beyond stdio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Search&lt;/strong&gt;: Boolean queries, phrase search, proximity search&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building the quran-search-mcp package was a rewarding experience in combining existing powerful libraries with modern protocols. The monorepo structure provides maintainability while the MCP integration makes it accessible to AI assistants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special thanks to &lt;a href="https://github.com/adelpro" rel="noopener noreferrer"&gt;Adel Benyahia&lt;/a&gt;&lt;/strong&gt; for creating the excellent &lt;a href="https://github.com/adelpro/quran-search-engine" rel="noopener noreferrer"&gt;quran-search-engine&lt;/a&gt; library that made this MCP adaptation possible. His work on Arabic text processing, morphological analysis, and search algorithms provided the solid foundation needed for this project.&lt;/p&gt;

&lt;p&gt;The key was respecting the original quran-search-engine's excellence while building a clean, standards-compliant adaptation layer that adds value without reinventing the wheel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it out:&lt;/strong&gt;&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;quran-search-mcp
npx quran-search-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project is ready for production use and welcomes contributions from the community!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for the Muslim community and AI developers worldwide&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://github.com/adelpro" rel="noopener noreferrer"&gt;Adel Benyahia&lt;/a&gt; for the foundational quran-search-engine library&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>mcp</category>
      <category>node</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 WATele-Bridge: A Telegram ↔ WhatsApp Bridge</title>
      <dc:creator>Abdulaziz Hamzah</dc:creator>
      <pubDate>Wed, 17 Sep 2025 09:28:27 +0000</pubDate>
      <link>https://dev.to/abdulaziz_hamzah_884bb727/watele-bridge-a-telegram-whatsapp-bridge-2jj8</link>
      <guid>https://dev.to/abdulaziz_hamzah_884bb727/watele-bridge-a-telegram-whatsapp-bridge-2jj8</guid>
      <description>&lt;p&gt;I recently worked on a project that let me explore some exciting areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building Telegram bots&lt;/li&gt;
&lt;li&gt;Using WhatsApp APIs&lt;/li&gt;
&lt;li&gt;Playing with asynchronous programming&lt;/li&gt;
&lt;li&gt;Developing and consuming APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? 👉 &lt;a href="https://github.com/Azizham66/WATele-Bridge" rel="noopener noreferrer"&gt;WATele-Bridge&lt;/a&gt; – a simple, self-hosted bridge between Telegram and WhatsApp.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 How It Works
&lt;/h2&gt;

&lt;p&gt;The project has two main parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Telegram Bot (Python, Telethon)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Listens for new messages from a user-specified chat, group, or channel.&lt;/li&gt;
&lt;li&gt;Whenever a new message arrives, it triggers an event handler. &lt;/li&gt;
&lt;li&gt;That event makes an HTTP request to an API endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;WhatsApp API (Node.js, '@whiskeysockets/Baileys')&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Exposes a send-message endpoint.&lt;/li&gt;
&lt;li&gt;Receives the incoming request from the Telegram bot.&lt;/li&gt;
&lt;li&gt;Forwards the message directly to WhatsApp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This essentially creates a Telegram → WhatsApp relay.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Why I Built This
&lt;/h2&gt;

&lt;p&gt;I wanted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn Telethon for Telegram bot development.&lt;/li&gt;
&lt;li&gt;Explore Baileys (a popular WhatsApp Web API library).&lt;/li&gt;
&lt;li&gt;Understand how to design async message handling.&lt;/li&gt;
&lt;li&gt;Practice building and integrating a small microservice API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a great project if you’re curious about combining different chat platforms or experimenting with real-time communication apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Try It Yourself
&lt;/h2&gt;

&lt;p&gt;You can self-host the project with the instructions in the repo:&lt;br&gt;
👉 github.com/Azizham66/WATele-Bridge&lt;br&gt;
Feel free to fork it, tweak it, or use it as a foundation for your own automation ideas!&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Contribute
&lt;/h2&gt;

&lt;p&gt;This is still a work in progress, and contributions are very welcome. Some possible improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding support for two-way sync (WhatsApp → Telegram)&lt;/li&gt;
&lt;li&gt;Deployment scripts (Docker, PM2)&lt;/li&gt;
&lt;li&gt;Better logging and error handling&lt;/li&gt;
&lt;li&gt;Adding the ability to listen from multiple Telegram chats&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This was a fun experiment that combined multiple APIs and asynchronous programming. If you’ve ever wanted to link two messaging platforms, this project might give you a head start.&lt;/p&gt;

</description>
      <category>api</category>
      <category>express</category>
      <category>backend</category>
      <category>node</category>
    </item>
  </channel>
</rss>
