<?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: Jehadur Rahman (Emran)</title>
    <description>The latest articles on DEV Community by Jehadur Rahman (Emran) (@jehadurre).</description>
    <link>https://dev.to/jehadurre</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F726879%2Fa07ae71a-dbf3-4aaf-a8c9-21ec894aece9.jpeg</url>
      <title>DEV Community: Jehadur Rahman (Emran)</title>
      <link>https://dev.to/jehadurre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jehadurre"/>
    <language>en</language>
    <item>
      <title>Building NLP Tools for Languages That Big Tech Ignores</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Wed, 24 Jun 2026 06:10:34 +0000</pubDate>
      <link>https://dev.to/jehadurre/building-nlp-tools-for-languages-that-big-tech-ignores-2api</link>
      <guid>https://dev.to/jehadurre/building-nlp-tools-for-languages-that-big-tech-ignores-2api</guid>
      <description>&lt;p&gt;In an era where massive Large Language Models (LLMs) dominate headlines, millions of speakers of underrepresented languages remain excluded from the AI revolution. Building NLP tools for these "low-resource" languages isn't just a technical challenge; it is a necessity for democratizing technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Fundamentals
&lt;/h2&gt;

&lt;p&gt;To build effective tools, we must first understand the building blocks of Natural Language Processing (NLP). NLP is the field of artificial intelligence where computers analyze and derive meaning from human language. Key concepts include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stemming and Lemmatization: Stemming reduces words to their root format (e.g., "branching" becomes "branch"), while Lemmatization uses dictionaries to normalize words (e.g., "was" becomes "be").&lt;/li&gt;
&lt;li&gt;Parts of Speech (POS) Tagging: The task of labeling each word with its appropriate grammatical part of speech.&lt;/li&gt;
&lt;li&gt;Named Entity Recognition (NER): Identifying and classifying entities like names, organizations, or locations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When dealing with languages ignored by big tech, standardized models often fail because they lack the necessary training data or linguistic nuance. This is where custom development becomes crucial.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Python Toolkit
&lt;/h2&gt;

&lt;p&gt;Python remains the language of choice for the data science community due to its versatility and mature ecosystem. When starting your project, you will likely rely on powerful packages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gensim: Excellent for analyzing large textual collections and implementing algorithms like word2vec to transform text into vector features.&lt;/li&gt;
&lt;li&gt;Scikit-learn: A library essential for tasks like classification, regression, and clustering.&lt;/li&gt;
&lt;li&gt;NumPy: For high-level mathematical functions and matrix computations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started: A Simple Workflow
&lt;/h2&gt;

&lt;p&gt;Before diving into complex neural networks, focus on the basics of text preprocessing. Vectorization, the process of converting text into numerical representation, is a vital first step. You can implement a simple stemming process to normalize your data using NLTK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.stem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PorterStemmer&lt;/span&gt;

&lt;span class="n"&gt;stemmer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PorterStemmer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;branched&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;branching&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;branches&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stemmer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Thinking Like a Designer
&lt;/h2&gt;

&lt;p&gt;Writing the "right" software requires more than just code; it requires understanding the human interface. Designers of ML systems must anticipate how users will interact with the system. When building for underrepresented languages, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data Scarcity: You may not have access to massive datasets. Use techniques like transfer learning or unsupervised learning for topic modeling to extract insights from smaller document collections.&lt;/li&gt;
&lt;li&gt;Technical Debt: Avoid poor system design that accumulates interest over time. Focus on refactoring code to ensure it remains maintainable and scalable as your project grows.&lt;/li&gt;
&lt;li&gt;Community Engagement: Leverage open-source knowledge bases and participate in the community to gather authentic, domain-specific data.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Building tools for ignored languages empowers creators and developers to bridge the digital divide. By utilizing Python's robust libraries and adhering to solid software engineering principles—like test-driven development and refactoring—you can create systems that truly serve diverse linguistic populations. Start small, focus on the essentials, and build a system that reflects the unique nuances of your target language.&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>python</category>
      <category>ai</category>
      <category>a11y</category>
    </item>
    <item>
      <title>The Invisible 99%: Why Low-Resource Languages Need More AI Research</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Wed, 24 Jun 2026 06:10:13 +0000</pubDate>
      <link>https://dev.to/jehadurre/the-invisible-99-why-low-resource-languages-need-more-ai-research-31i6</link>
      <guid>https://dev.to/jehadurre/the-invisible-99-why-low-resource-languages-need-more-ai-research-31i6</guid>
      <description>&lt;p&gt;In the current landscape of rapid AI development, large language models (LLMs) like GPT-4 and LLaMA have become standard tools for productivity and information access. However, this technological revolution is built on a foundation of "high-resource" languages—those with abundant digital data, standardized writing systems, and significant online presence. As these models become deeply integrated into societal functions, we face an urgent, often overlooked crisis: the marginalization of low-resource languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Language Divide
&lt;/h2&gt;

&lt;p&gt;Of the world's over 7,000 living languages, only a tiny fraction are classified as "high-resource". Low-resource languages are those that suffer from a lack of labeled training data, poor data quality, or the absence of standardized orthography. This data scarcity creates a "long-tail distribution" in machine learning, where the majority of global languages remain underserved by modern AI technology.&lt;/p&gt;

&lt;p&gt;The technical disparity is exacerbated by the way current AI pipelines are constructed. Most models rely on massive, internet-scraped datasets that favor dominant languages. When developers build for "scale," they often ignore the nuanced, cultural, and linguistic specificities of smaller language communities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The consequences of this digital gap extend far beyond mere convenience. We are witnessing several critical impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Socio-Economic Exclusion: Language barriers impede access to essential services like quality education, healthcare, and financial tools. If AI-driven government or commercial interfaces do not function in a user's native language, they effectively cut those populations off from participating in the modern economy.&lt;/li&gt;
&lt;li&gt;Safety and Bias Risks: Studies have shown that models like GPT-4 are significantly more likely to produce harmful or unsafe content when prompted in low-resource languages compared to high-resource ones. This occurs because safety fine-tuning and guardrails are overwhelmingly optimized for English, failing to generalize to other linguistic contexts.&lt;/li&gt;
&lt;li&gt;Cultural and Intellectual Loss: Language is a repository of human history and cultural identity. When these languages are excluded from AI advancements, the incentive for younger generations to maintain or use them diminishes, threatening their long-term survival.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Path Forward: Rethinking Development
&lt;/h2&gt;

&lt;p&gt;To bridge this gap, the AI research community must move away from the "bigger is always better" mentality. Addressing the language gap requires dedicated, interdisciplinary collaboration rather than just brute-force data collection.&lt;/p&gt;

&lt;p&gt;One promising avenue is the development of specialized, smaller-scale models trained on curated, high-quality datasets rather than massive, noisy web scrapes. Additionally, adopting participatory design approaches—where native speakers are involved in every stage of the AI development cycle—ensures that models are culturally representative and accurate.&lt;/p&gt;

&lt;p&gt;For developers interested in exploring this space, evaluating model performance across diverse linguistic tiers is a critical first step. Below is a simplified conceptual example of how researchers might implement a check for data distribution parity in a training pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate_language_parity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_metrics&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Calculate representation scores for each language
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset_metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;THRESHOLD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;flag_for_augmentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Priority Alert: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is underrepresented.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Optimization required for long-tail languages.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The inclusion of all languages is essential for the future of global AI. As we continue to advance LLM capabilities, it is our collective responsibility to ensure that this progress does not come at the cost of linguistic diversity. By subsidizing research, supporting data stewardship, and designing methods that "do more with less," we can build a future where AI empowers, rather than excludes, communities around the world.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>ethics</category>
      <category>research</category>
    </item>
    <item>
      <title>Conquering Complexity: Building a Robust Bangla Proofreading API</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Wed, 24 Jun 2026 05:57:34 +0000</pubDate>
      <link>https://dev.to/jehadurre/conquering-complexity-building-a-robust-bangla-proofreading-api-15p4</link>
      <guid>https://dev.to/jehadurre/conquering-complexity-building-a-robust-bangla-proofreading-api-15p4</guid>
      <description>&lt;h1&gt;
  
  
  Unlocking Linguistic Precision: The Technical Challenges of Building a Bangla Proofreading API
&lt;/h1&gt;

&lt;p&gt;Creating an automated proofreading tool for the Bangla language is a task that sits at the intersection of complex morphology and computational linguistics. Unlike English, Bangla presents distinct challenges that require custom engineering solutions to ensure accuracy and user satisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Morphological Hurdle
&lt;/h2&gt;

&lt;p&gt;Bangla is an agglutinative language, where prefixes and suffixes are frequently combined with roots to alter meaning. A simple dictionary lookup will inevitably fail to catch errors in conjugated verbs or complex compound words. Developers must focus on morphological analyzers and stemming algorithms to understand the root structure of words, rather than relying on static word lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Unicode Normalization
&lt;/h2&gt;

&lt;p&gt;One of the most persistent issues in Bangla NLP is the inconsistency in Unicode character representation, particularly regarding the 'hasant' (্) and various vowel signs. Different keyboards and operating systems may produce visually identical text that is encoded differently, leading to massive indexing errors. A robust API must implement a rigorous normalization layer before any processing occurs.&lt;/p&gt;

&lt;p&gt;Consider this simple example of a normalization pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;normalize_bangla_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Convert input to normalized Unicode form (NFC)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;NFC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Data Scarcity and Quality
&lt;/h2&gt;

&lt;p&gt;While languages like English enjoy vast, curated corpora, Bangla lacks the sheer scale of high-quality, annotated datasets for training grammar checkers. Building a deep learning model often requires vast amounts of labeled 'correct vs. incorrect' text. Developers often have to rely on synthetic data generation or limited open-source resources available on platforms like &lt;a href="https://dev.to[link%20removed]"&gt;Hugging Face&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Contextual Nuance and Ambiguity
&lt;/h2&gt;

&lt;p&gt;Bangla possesses a rich vocabulary where spelling variations—such as 'ওঠো' vs 'উঠো'—can depend heavily on regional dialects or formal versus informal usage. Building an API requires an N-gram or Transformer-based model capable of analyzing sentence structure to flag context-specific errors accurately. The model must be trained not just to spot spelling mistakes, but to understand the semantic intent of the sentence.&lt;/p&gt;

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

&lt;p&gt;Building a Bangla proofreading API is more than just coding; it is about respecting the linguistic architecture of the language. By focusing on morphological analysis and high-quality Unicode normalization, we can bridge the digital divide for Bangla speakers and provide a tool that is both functional and culturally aware.&lt;/p&gt;

</description>
      <category>bangla</category>
      <category>nlp</category>
      <category>programming</category>
      <category>api</category>
    </item>
    <item>
      <title>Algorithmic Logo Design: Building Numerical Integration into the CyArm SVG</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 07:15:52 +0000</pubDate>
      <link>https://dev.to/jehadurre/algorithmic-logo-design-building-numerical-integration-into-the-cyarm-svg-4ehj</link>
      <guid>https://dev.to/jehadurre/algorithmic-logo-design-building-numerical-integration-into-the-cyarm-svg-4ehj</guid>
      <description>&lt;p&gt;When we approach logo design as a form of systemizing, we move beyond the limitations of manual vector tools and embrace the beauty of repeatable, algorithmic truths. Creating the CyArm SVG requires us to bridge the gap between abstract mathematical functions and concrete visual output—a practice reminiscent of Feynman's approach to physics, where internalizing the problem geometry leads to the most elegant solutions.&lt;/p&gt;

&lt;p&gt;At its core, building this logo relies on numerical integration. By calculating the path segments of our design through iterative summation, we generate complex, organic shapes that are inherently structured. This process mirrors the emergence of complex patterns from simple feedback loops, where the system dictates the form through self-stabilization.&lt;/p&gt;

&lt;p&gt;To implement this, we can use a JavaScript function that iterates through a defined range, calculating coordinates based on a function f(x) and appending them to an SVG path string.&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;function&lt;/span&gt; &lt;span class="nf"&gt;generateLogoPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;steps&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;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;M&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)};&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt;  &lt;span class="nx"&gt;L&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;y&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;d&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;This technique allows for infinite variation. By simply tweaking the underlying mathematical function, we generate a logo that is not only visually striking but also mathematically consistent. It transforms the act of design from a subjective endeavor into a precise, exploratory process of defining systems.&lt;/p&gt;

</description>
      <category>svg</category>
      <category>generative</category>
      <category>mathematics</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Art of CSS: Rendering a Chrysanthemum using only HTML and CSS</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 06:27:25 +0000</pubDate>
      <link>https://dev.to/jehadurre/the-art-of-css-rendering-a-chrysanthemum-using-only-html-and-css-3j6d</link>
      <guid>https://dev.to/jehadurre/the-art-of-css-rendering-a-chrysanthemum-using-only-html-and-css-3j6d</guid>
      <description>&lt;p&gt;The Art of CSS: Rendering a Chrysanthemum using only HTML and CSS&lt;/p&gt;

&lt;p&gt;CSS art is a fascinating intersection of design and technical precision. By leveraging powerful properties like border-radius, linear-gradient, box-shadow, and transform, you can create intricate illustrations without loading a single external image file. Today, we are exploring the process of rendering a Chrysanthemum—a flower defined by its dense, rhythmic petals—using nothing but pure HTML and CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy of CSS Art
&lt;/h2&gt;

&lt;p&gt;When we build with CSS, we are essentially drawing shapes. A flower is simply a collection of layered div elements and pseudo-elements. The secret to rendering a complex, organic shape like a chrysanthemum is breaking it down into basic geometric components: petals, layers, and a central core.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constructing the Petals
&lt;/h2&gt;

&lt;p&gt;The signature 'rounded teardrop' shape of a chrysanthemum petal can be achieved using border-radius combined with transform: rotate(). By carefully rotating these shapes around a central point, we can mimic the bloom pattern. Check out this snippet for a single petal:&lt;/p&gt;

&lt;p&gt;css&lt;br&gt;
.petal {&lt;br&gt;
  width: 50px;&lt;br&gt;
  height: 100px;&lt;br&gt;
  background: linear-gradient(to bottom, #ff0, #f90);&lt;br&gt;
  border-radius: 50% 50% 0 0;&lt;br&gt;
  position: absolute;&lt;br&gt;
  transform: rotate(45deg);&lt;br&gt;
  transform-origin: bottom center;&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Stacking and Layering
&lt;/h2&gt;

&lt;p&gt;To achieve depth, you will want to use z-index and varied opacities. A chrysanthemum has hundreds of petals. To optimize this without cluttering your HTML, use CSS pseudo-elements (::before and ::after) as much as possible. This keeps your DOM tree clean while allowing for complex layering.&lt;/p&gt;

&lt;p&gt;For more inspiration on CSS Art, check out the community work at &lt;a href="https://dev.to[link%20removed]"&gt;CodePen&lt;/a&gt; or &lt;a href="https://dev.to[link%20removed]"&gt;CSS-Tricks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Create CSS Art?
&lt;/h2&gt;

&lt;p&gt;Beyond the aesthetic challenge, CSS art is an excellent way to improve your understanding of the CSS box model, positioning, and animations. It forces you to think spatially and creatively about browser rendering.&lt;/p&gt;

&lt;p&gt;Go ahead, open your favorite code editor and see if you can manifest a floral masterpiece today!&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>art</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Implementing Premium Tech Typography in CSS: A shutdownX Case Study</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 06:10:57 +0000</pubDate>
      <link>https://dev.to/jehadurre/implementing-premium-tech-typography-in-css-a-shutdownx-case-studynewline-1hbg</link>
      <guid>https://dev.to/jehadurre/implementing-premium-tech-typography-in-css-a-shutdownx-case-studynewline-1hbg</guid>
      <description>&lt;p&gt;Typography is the backbone of user experience in modern SaaS applications. When we set out to build the interface for &lt;a href="https://shutdownx.com" rel="noopener noreferrer"&gt;https://shutdownx.com&lt;/a&gt;, we knew that legibility and a premium "tech-first" aesthetic were non-negotiable. While managing our infrastructure via Supabase and tracking user behavior through Microsoft Clarity, we realized that typography directly influences how users interact with our data-heavy dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge of Modern Readability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a world of high-DPI displays, "premium" doesn't just mean a nice font family—it means responsive, fluid scale. We needed a system that looked as sharp on a mobile device as it did on a wide-screen monitor. Additionally, given that we have been actively monitoring our site performance and indexing status in Google Search Console, we understood that lean CSS was critical for reducing layout shifts and improving core web vitals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementing Fluid Typography&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of relying on rigid media queries for font sizing, we implemented fluid typography using the CSS clamp() function. This allows the font size to scale smoothly between a defined minimum and maximum range without triggering layout breakpoints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;css&lt;/span&gt;
&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--fluid-min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;320px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--fluid-max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1440px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--fluid-min-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--fluid-max-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Inter'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;-apple-system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlinkMacSystemFont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Roboto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-min-size&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-min-size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-max-size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-min-size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="m"&gt;100vw&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-min-width&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-max-width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-min-width&lt;/span&gt;&lt;span class="p"&gt;)))),&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--fluid-max-size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Optimizing for the "Tech" Aesthetic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A premium tech feel often relies on hierarchy and contrast. For our headers, we utilized tabular figures (font-variant-numeric: tabular-nums) to ensure that data displayed in our Supabase-backed tables remained perfectly aligned. This is crucial for financial or metrics-heavy dashboards where visual consistency equals trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Considerations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As noted in our recent Search Console reports, indexing issues such as "Page indexed without content" or "Duplicate, Google chose different canonical than user" can be exacerbated by poor site structure. By leveraging modern CSS variables and a system-font-first approach, we reduced our external font requests, contributing to faster FCP (First Contentful Paint) times. This keeps our site lightweight and ensures search engines can parse our content hierarchy efficiently.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Use clamp() for fluid typography to eliminate excessive media queries.&lt;/li&gt;
&lt;li&gt;Leverage system font stacks to minimize network requests and improve performance.&lt;/li&gt;
&lt;li&gt;Use tabular-nums for data-heavy components to maintain professional alignment.&lt;/li&gt;
&lt;li&gt;Monitor your CSS impact on site performance using tools like Microsoft Clarity to ensure that your design choices aren't negatively impacting your SEO.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Building for the web requires balancing aesthetics with technical performance. By standardizing our typography, we have not only improved the look of &lt;a href="https://shutdownx.com" rel="noopener noreferrer"&gt;https://shutdownx.com&lt;/a&gt; but also laid a stronger, more maintainable foundation for our frontend.&lt;/p&gt;

&lt;p&gt;Have you implemented fluid typography in your projects? Let me know your favorite techniques in the comments!&lt;/p&gt;

</description>
      <category>newlinecss</category>
      <category>webdesign</category>
      <category>frontend</category>
      <category>performancenewline</category>
    </item>
    <item>
      <title>Stop Nesting: How to Optimize Your Data Mapping Performance</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 05:31:45 +0000</pubDate>
      <link>https://dev.to/jehadurre/stop-nesting-how-to-optimize-your-data-mapping-performance-4p1j</link>
      <guid>https://dev.to/jehadurre/stop-nesting-how-to-optimize-your-data-mapping-performance-4p1j</guid>
      <description>&lt;p&gt;Why You Should Stop Using Nested Loops for Data Mapping&lt;br&gt;
Nested loops are a common pitfall in software development. They appear frequently when merging datasets, filtering lists, or finding relationships between two arrays. While they might seem intuitive at first, they often lead to performance bottlenecks as your data grows.&lt;/p&gt;

&lt;p&gt;The Problem with Nested Loops&lt;br&gt;
When you nest a loop inside another, you create quadratic time complexity, represented as O(n * m) in &lt;a href="https://dev.to[link%20removed]"&gt;Big O Notation&lt;/a&gt;. For example, if you have two lists of 1,000 items each, a nested loop will perform 1,000,000 operations.&lt;/p&gt;

&lt;p&gt;// The Slow Approach&lt;br&gt;
const users = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];&lt;br&gt;
const orders = [{ userId: 1, item: 'Book' }, { userId: 2, item: 'Pen' }];&lt;/p&gt;

&lt;p&gt;const result = users.map(user =&amp;gt; {&lt;br&gt;
  const userOrder = orders.find(order =&amp;gt; order.userId === user.id);&lt;br&gt;
  return { ...user, order: userOrder };&lt;br&gt;
});&lt;br&gt;
In this example, for every user, the code scans the entire orders array. If the orders list contains thousands of records, your application will slow down significantly.&lt;/p&gt;

&lt;p&gt;The Solution: Lookups and Maps&lt;br&gt;
The most efficient way to solve this is to reduce the time complexity from O(n * m) to O(n). You can achieve this by transforming one of the datasets into a dictionary or a Map structure for constant-time lookup.&lt;/p&gt;

&lt;p&gt;// The Fast Approach&lt;br&gt;
const orderMap = new Map(orders.map(order =&amp;gt; [order.userId, order]));&lt;/p&gt;

&lt;p&gt;const result = users.map(user =&amp;gt; ({&lt;br&gt;
  ...user,&lt;br&gt;
  order: orderMap.get(user.id)&lt;br&gt;
}));&lt;br&gt;
By creating the orderMap first, we traverse the orders array exactly once. When we map through the users array, looking up the associated order becomes an O(1) operation.&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: Your application remains responsive even with large datasets.&lt;/li&gt;
&lt;li&gt;Scalability: As your product grows, your code is less likely to become a performance bottleneck.&lt;/li&gt;
&lt;li&gt;Maintainability: Cleaner, more efficient code is easier to debug and read.
By avoiding nested loops in favor of hash maps or specialized lookup structures, you ensure your software scales gracefully. Optimize your data mapping early to build robust and performant applications.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>performance</category>
      <category>optimization</category>
    </item>
    <item>
      <title>Building an Apple Mail Channel Plugin for OpenClaw</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 03:12:42 +0000</pubDate>
      <link>https://dev.to/jehadurre/building-an-apple-mail-channel-plugin-for-openclaw-4cgk</link>
      <guid>https://dev.to/jehadurre/building-an-apple-mail-channel-plugin-for-openclaw-4cgk</guid>
      <description>&lt;h1&gt;
  
  
  Building an Apple Mail Channel Plugin for OpenClaw
&lt;/h1&gt;

&lt;p&gt;I recently built and published a plugin that integrates Apple Mail with OpenClaw (an AI automation platform), allowing AI agents to monitor and respond to emails with per-thread session isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 The Problem
&lt;/h2&gt;

&lt;p&gt;OpenClaw and Hermes are powerful AI automation platforms, but they lacked native Apple Mail integration on macOS. Users wanted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor multiple email accounts&lt;/li&gt;
&lt;li&gt;Have AI agents automatically respond to emails&lt;/li&gt;
&lt;li&gt;Maintain conversation context across email threads&lt;/li&gt;
&lt;li&gt;Keep different email conversations isolated&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;code&gt;@jehadurre/openclaw-apple-mail&lt;/code&gt; - a channel plugin that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connects to Apple Mail via AppleScript&lt;/li&gt;
&lt;li&gt;Creates isolated sessions per email thread&lt;/li&gt;
&lt;li&gt;Processes HTML emails intelligently&lt;/li&gt;
&lt;li&gt;Supports multi-account configuration&lt;/li&gt;
&lt;li&gt;Includes security features like sender allowlists&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; - Type-safe development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppleScript&lt;/strong&gt; - Native macOS Mail.app integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML Processing&lt;/strong&gt; - DOMPurify, jsdom, sanitize-html, marked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema Validation&lt;/strong&gt; - Zod for configuration validation&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  1. Per-Thread Session Isolation
&lt;/h3&gt;

&lt;p&gt;Each email conversation gets its own isolated session, preventing context mixing:&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;// Each thread gets unique session ID&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sessionId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`apple-mail:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;threadId&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Multi-Account Support
&lt;/h3&gt;

&lt;p&gt;Configure multiple email accounts with independent settings:&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;"channels"&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;"apple-mail"&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;"accounts"&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;"work"&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;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work@company.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"pollIntervalMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"archiveOnReply"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;"personal"&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;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"personal@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"pollIntervalMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60000&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;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;
  
  
  3. Security Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sender allowlist per account&lt;/li&gt;
&lt;li&gt;HTML sanitization&lt;/li&gt;
&lt;li&gt;AppleScript sandboxing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Smart HTML Processing
&lt;/h3&gt;

&lt;p&gt;Automatically converts HTML emails to clean markdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Table extraction and conversion&lt;/li&gt;
&lt;li&gt;Removes tracking pixels&lt;/li&gt;
&lt;li&gt;Sanitizes malicious content&lt;/li&gt;
&lt;li&gt;Preserves formatting for AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Publishing Journey
&lt;/h2&gt;

&lt;p&gt;I published this plugin to multiple platforms:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. npm Registry
&lt;/h3&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; @jehadurre/openclaw-apple-mail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Full source code&lt;/li&gt;
&lt;li&gt;Issue tracking&lt;/li&gt;
&lt;li&gt;Contribution guidelines&lt;/li&gt;
&lt;li&gt;MIT License&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @jehadurre/openclaw-apple-mail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. OpenClaw Skill
&lt;/h3&gt;

&lt;p&gt;Created a comprehensive setup skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawhub &lt;span class="nb"&gt;install &lt;/span&gt;apple-mail-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installation guide&lt;/li&gt;
&lt;li&gt;5 configuration templates&lt;/li&gt;
&lt;li&gt;Troubleshooting solutions&lt;/li&gt;
&lt;li&gt;Best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎓 Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Compiled Output Matters
&lt;/h3&gt;

&lt;p&gt;ClawHub requires compiled JavaScript, not just TypeScript source. I had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get compiled output from production deployment&lt;/li&gt;
&lt;li&gt;Include &lt;code&gt;index.js&lt;/code&gt; in the package&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;package.json&lt;/code&gt; to reference the compiled file&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Skills Enhance Adoption
&lt;/h3&gt;

&lt;p&gt;Creating a separate "skill" package that teaches users how to set up and use the plugin significantly improves the user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Multi-Platform Publishing
&lt;/h3&gt;

&lt;p&gt;Publishing to npm, GitHub, ClawHub, and creating documentation on GitHub Pages maximizes discoverability.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Usage Example
&lt;/h2&gt;

&lt;p&gt;Here's how users set it up:&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @jehadurre/openclaw-apple-mail
clawhub &lt;span class="nb"&gt;install &lt;/span&gt;apple-mail-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure
&lt;/h3&gt;

&lt;p&gt;Add to &lt;code&gt;openclaw.json&lt;/code&gt;:&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;"channels"&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;"apple-mail"&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;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accounts"&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;"personal"&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;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mailboxAccount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iCloud"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"allowFrom"&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="s2"&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;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;h3&gt;
  
  
  Step 3: Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! OpenClaw now monitors your email and can respond automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Email → Apple Mail.app
              ↓ (AppleScript)
           Plugin Monitor
              ↓
        Session Manager (per-thread isolation)
              ↓
         HTML Processor
              ↓
        OpenClaw/Hermes AI Agent
              ↓
          Response
              ↓ (AppleScript)
        Apple Mail.app → Send Reply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔐 Security Considerations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sender Allowlist&lt;/strong&gt;: Only process emails from trusted senders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML Sanitization&lt;/strong&gt;: Remove malicious content from HTML emails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppleScript Sandboxing&lt;/strong&gt;: Limited access to Mail.app APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Credential Storage&lt;/strong&gt;: Uses existing Apple Mail accounts&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🌟 Future Enhancements
&lt;/h2&gt;

&lt;p&gt;Planned features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Smart reply suggestions&lt;/li&gt;
&lt;li&gt;[ ] Attachment handling&lt;/li&gt;
&lt;li&gt;[ ] Email categorization&lt;/li&gt;
&lt;li&gt;[ ] Custom email templates&lt;/li&gt;
&lt;li&gt;[ ] Integration with other channels&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📖 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/JehadurRE/openclaw-apple-mail" rel="noopener noreferrer"&gt;https://github.com/JehadurRE/openclaw-apple-mail&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/@jehadurre/openclaw-apple-mail" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@jehadurre/openclaw-apple-mail&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://openclaw-apple-mail.jehadurre.me" rel="noopener noreferrer"&gt;https://openclaw-apple-mail.jehadurre.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill&lt;/strong&gt;: &lt;code&gt;clawhub install apple-mail-setup&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Contributions welcome! Check out the &lt;a href="https://github.com/JehadurRE/openclaw-apple-mail/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Feedback
&lt;/h2&gt;

&lt;p&gt;Have you used AI automation with email? What features would you like to see? Let me know in the comments!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About Me&lt;/strong&gt;: I'm Md. Jehadur Rahman (Emran), a developer passionate about AI automation and productivity tools. Find me on &lt;a href="https://github.com/JehadurRE" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and &lt;a href="https://jehadurre.me" rel="noopener noreferrer"&gt;my website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License&lt;/strong&gt;: MIT - Free to use, modify, and redistribute!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>macos</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Built a Native Apple Mail Plugin for OpenClaw</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Mon, 22 Jun 2026 02:45:58 +0000</pubDate>
      <link>https://dev.to/jehadurre/i-built-a-native-apple-mail-plugin-for-openclaw-2kf4</link>
      <guid>https://dev.to/jehadurre/i-built-a-native-apple-mail-plugin-for-openclaw-2kf4</guid>
      <description>&lt;p&gt;If you are running an OpenClaw agent on a Mac, you probably already know the headache of trying to get your agent to read your Apple Mail inbox. &lt;/p&gt;

&lt;p&gt;Because Apple intentionally makes iCloud Mail access difficult for third-party clients, the standard advice is usually a messy workaround: set up auto-forwarding to a Gmail account, and then use the Gmail webhook integrations to let OpenClaw read it. &lt;/p&gt;

&lt;p&gt;I got tired of the webhook bridge, so today I built and published a native solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing the OpenClaw Apple Mail Plugin
&lt;/h3&gt;

&lt;p&gt;Instead of routing your personal emails through third-party servers, this plugin runs strictly local. It gives your OpenClaw agent the ability to directly read from your local Apple Mail database right on your Mac. &lt;/p&gt;

&lt;p&gt;You can find the official plugin on the Clawhub registry here:&lt;br&gt;
🔗 &lt;a href="https://clawhub.ai/plugins/@jehadurre/openclaw-apple-mail" rel="noopener noreferrer"&gt;openclaw-apple-mail Plugin on Clawhub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to get it running
&lt;/h3&gt;

&lt;p&gt;Because this interacts directly with Apple's local ecosystem, there are a few permissions you need to grant macOS first (specifically Automation and full disk access for the Mail directory). &lt;/p&gt;

&lt;p&gt;I wrote up a quick step-by-step guide to get past Apple's security prompts without pulling your hair out:&lt;br&gt;
📖 &lt;a href="https://clawhub.ai/jehadurre/apple-mail-setup" rel="noopener noreferrer"&gt;Apple Mail Setup Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are running OpenClaw locally and want your agent to finally clear out your Apple Mail inbox without relying on external webhooks, give it a try. Let me know if you hit any weird edge cases with specific Mail configurations!&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>macos</category>
      <category>ai</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>sample2</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Sat, 16 Oct 2021 00:35:00 +0000</pubDate>
      <link>https://dev.to/jehadurre/sample2-536f</link>
      <guid>https://dev.to/jehadurre/sample2-536f</guid>
      <description>&lt;p&gt;test 2 data&lt;/p&gt;

</description>
      <category>2ndsample</category>
    </item>
    <item>
      <title>sample</title>
      <dc:creator>Jehadur Rahman (Emran)</dc:creator>
      <pubDate>Sat, 16 Oct 2021 00:28:12 +0000</pubDate>
      <link>https://dev.to/jehadurre/sample-3a63</link>
      <guid>https://dev.to/jehadurre/sample-3a63</guid>
      <description>&lt;p&gt;test one&lt;/p&gt;

</description>
      <category>sample</category>
    </item>
  </channel>
</rss>
