<?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: Muzaffar Hossain</title>
    <description>The latest articles on DEV Community by Muzaffar Hossain (@muzaffar640).</description>
    <link>https://dev.to/muzaffar640</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%2F958874%2F81741468-4f81-4ad9-9b30-93bdbac2f863.jpeg</url>
      <title>DEV Community: Muzaffar Hossain</title>
      <link>https://dev.to/muzaffar640</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muzaffar640"/>
    <language>en</language>
    <item>
      <title>I Built CommitPress Because I Was Tired of Complex Blog SystemsStop fighting complex blog systems CommitPress = Git + MDX + AI formatting Perfect for: 🎯 Startups needing quick content 🎯 Developers who love simplicity 🎯 Teams tired of CMS overhead</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Tue, 08 Jul 2025 06:10:25 +0000</pubDate>
      <link>https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systemsstop-fighting-complex-blog-hij</link>
      <guid>https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systemsstop-fighting-complex-blog-hij</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if" class="crayons-story__hidden-navigation-link"&gt;I Built CommitPress Because I Was Tired of Complex Blog Systems&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/muzaffar640" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F958874%2F81741468-4f81-4ad9-9b30-93bdbac2f863.jpeg" alt="muzaffar640 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/muzaffar640" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Muzaffar Hossain
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Muzaffar Hossain
                
              
              &lt;div id="story-author-preview-content-2653694" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/muzaffar640" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F958874%2F81741468-4f81-4ad9-9b30-93bdbac2f863.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Muzaffar Hossain&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 4 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if" id="article-link-2653694"&gt;
          I Built CommitPress Because I Was Tired of Complex Blog Systems
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/portfolio"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;portfolio&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>portfolio</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built CommitPress Because I Was Tired of Complex Blog Systems</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Fri, 04 Jul 2025 04:31:24 +0000</pubDate>
      <link>https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if</link>
      <guid>https://dev.to/muzaffar640/i-built-commitpress-because-i-was-tired-of-complex-blog-systems-35if</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://www.transilience.ai" rel="noopener noreferrer"&gt;TransilienceAI&lt;/a&gt;, we needed a blog for our marketing website. Simple requirement, right?&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;Every option we looked at was complicated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a database&lt;/li&gt;
&lt;li&gt;Learn a new CMS&lt;/li&gt;
&lt;li&gt;Manage user accounts&lt;/li&gt;
&lt;li&gt;Pay monthly fees&lt;/li&gt;
&lt;li&gt;Train our team on another system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're a cybersecurity startup. We move fast. This felt like way too much work just to publish blog posts.&lt;/p&gt;

&lt;p&gt;All we wanted was simple: someone writes a post, adds an image, pushes code, and it's live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcr2f30cljqrlzg1val7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcr2f30cljqrlzg1val7.png" alt="transilienceai blog" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Realization
&lt;/h2&gt;

&lt;p&gt;Then it hit me. Why do blogs need databases? We already have Git. We use it every day. It tracks changes, handles collaboration, and stores everything.&lt;/p&gt;

&lt;p&gt;What if blog posts were just files? What if publishing was just a commit?&lt;/p&gt;

&lt;p&gt;There were some &lt;code&gt;.mdx&lt;/code&gt; solutions out there, but they weren't polished. I'd already built a good markdown renderer. And with Cursor AI rules, I could make the whole thing much easier to use.&lt;/p&gt;

&lt;p&gt;So I built CommitPress.&lt;/p&gt;

&lt;h2&gt;
  
  
  How CommitPress Works
&lt;/h2&gt;

&lt;p&gt;It's straightforward:&lt;/p&gt;

&lt;p&gt;✅ Blog posts are &lt;code&gt;.mdx&lt;/code&gt; files in your repo&lt;br&gt;
✅ Writing means creating a file&lt;br&gt;
✅ Publishing means &lt;code&gt;git push&lt;/code&gt;&lt;br&gt;
✅ Version control is built in&lt;br&gt;
✅ Team collaboration works through pull requests&lt;/p&gt;

&lt;p&gt;But here's the part that makes it useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  AI Does the Formatting
&lt;/h2&gt;

&lt;p&gt;Writing isn't the hard part. Formatting is. So I added Cursor AI rules that turn messy content into proper blog posts.&lt;/p&gt;

&lt;p&gt;Here's what you do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;.mdx&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Paste your content from anywhere&lt;/li&gt;
&lt;li&gt;Tell Cursor AI: "Format this as a blog post" tagging &lt;code&gt;blog-content&lt;/code&gt; rule&lt;/li&gt;
&lt;li&gt;Get proper MDX with metadata and structure&lt;/li&gt;
&lt;li&gt;Add banner Image&lt;/li&gt;
&lt;li&gt;Commit and push&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Done.&lt;/p&gt;
&lt;h2&gt;
  
  
  How We Use It at TransilienceAI
&lt;/h2&gt;

&lt;p&gt;We built our marketing blog with CommitPress. Here's what happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more database costs&lt;/li&gt;
&lt;li&gt;Pages load instantly&lt;/li&gt;
&lt;li&gt;Anyone on our team can publish&lt;/li&gt;
&lt;li&gt;No maintenance headaches&lt;/li&gt;
&lt;li&gt;SEO works automatically&lt;/li&gt;
&lt;li&gt;Deploys anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly: we stopped wasting time on blog infrastructure and got back to building our product.&lt;/p&gt;
&lt;h2&gt;
  
  
  It's Not Just for Developers
&lt;/h2&gt;

&lt;p&gt;I made this for our dev team, but it works for everyone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startups that need a professional site without complexity&lt;/li&gt;
&lt;li&gt;Consultants who want to share their expertise&lt;/li&gt;
&lt;li&gt;Freelancers who need portfolio plus blog&lt;/li&gt;
&lt;li&gt;Content creators who want to own their platform&lt;/li&gt;
&lt;li&gt;Anyone who prefers simple over complicated&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What You Actually Get
&lt;/h2&gt;

&lt;p&gt;CommitPress is a complete system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean portfolio pages&lt;/li&gt;
&lt;li&gt;Database-free blog&lt;/li&gt;
&lt;li&gt;AI formatting&lt;/li&gt;
&lt;li&gt;Works on mobile&lt;/li&gt;
&lt;li&gt;Fast loading&lt;/li&gt;
&lt;li&gt;SEO ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database. No CMS. No monthly fees.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I'm Open Sourcing It
&lt;/h2&gt;

&lt;p&gt;Because this should exist. Every team should have access to simple tools.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All the source code&lt;/li&gt;
&lt;li&gt;AI rules for Cursor&lt;/li&gt;
&lt;li&gt;Setup guides&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Real examples from our TransilienceAI site&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Technical Stuff
&lt;/h2&gt;

&lt;p&gt;For developers who want details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 15 with App Router&lt;/li&gt;
&lt;li&gt;MDX for rich content&lt;/li&gt;
&lt;li&gt;TypeScript throughout&lt;/li&gt;
&lt;li&gt;Tailwind CSS + Shadcn/ui&lt;/li&gt;
&lt;li&gt;Cursor AI rules for formatting&lt;/li&gt;
&lt;li&gt;Static generation for speed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Want to see how it works?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/muzaffar640/commitpress.git
&lt;span class="nb"&gt;cd &lt;/span&gt;commitpress
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add your first post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;.mdx&lt;/code&gt; file in &lt;code&gt;src/app/content/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Paste some content and ask Cursor to format it&lt;/li&gt;
&lt;li&gt;Commit and push&lt;/li&gt;
&lt;li&gt;It's live&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Simple tools win. Complex tools create problems.&lt;/p&gt;

&lt;p&gt;CommitPress isn't trying to do everything. It does one thing well: turns Git into a publishing platform.&lt;/p&gt;

&lt;p&gt;And honestly? That's enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/muzaffar640/commitpress" rel="noopener noreferrer"&gt;github.com/muzaffar640/commitpress&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://commitpress.muzaffarhossain.com" rel="noopener noreferrer"&gt;CommitPress&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Issues: Open one if something breaks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Will You Build?
&lt;/h2&gt;

&lt;p&gt;Maybe you're a startup founder. Maybe you're a consultant. Maybe you just want a simple blog.&lt;/p&gt;

&lt;p&gt;CommitPress works for all of that.&lt;/p&gt;

&lt;p&gt;The question isn't whether you need a blog. It's whether you need all the complexity that usually comes with it.&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cursor's New "/Generate Cursor Rules" Feature: A Game-Changer for Development Team</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Fri, 02 May 2025 05:39:18 +0000</pubDate>
      <link>https://dev.to/muzaffar640/cursors-new-generate-cursor-rules-feature-a-game-changer-for-development-team-46na</link>
      <guid>https://dev.to/muzaffar640/cursors-new-generate-cursor-rules-feature-a-game-changer-for-development-team-46na</guid>
      <description>&lt;p&gt;Cursor recently released a powerful new feature with their 0.49 update: the ability to generate Cursor Rules directly from conversation using the /Generate Cursor Rules command. As someone who uses Cursor extensively in daily development, I was eager to test this feature and share my experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cursor Rules Matter
&lt;/h2&gt;

&lt;p&gt;At Transilience AI, where I serve as the only front-end developer, maintaining consistent coding standards is crucial. We're building multiple cybersecurity solutions, and I need to create templates that allow backend engineers to clone repositories and start development without requiring my constant assistance. Cursor Rules play a vital role in establishing this ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Previous Methods vs. The New Approach
&lt;/h2&gt;

&lt;p&gt;Previously, developers had several options for generating Cursor Rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor Rule Maker&lt;/li&gt;
&lt;li&gt;Awesome-cursorrules&lt;/li&gt;
&lt;li&gt;Template repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these tools were helpful, they provided generic rules that required significant customization to match specific coding standards.&lt;/p&gt;

&lt;p&gt;The new /Generate Cursor Rules command eliminates this hassle. Simply use the command in Agent mode, and Cursor will analyze your codebase to generate tailored rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Feature
&lt;/h2&gt;

&lt;p&gt;When testing with the gemini-2.5-pro model, results were somewhat disappointing. However, switching to Claude 3.7's thinking model produced excellent results. In just three prompts, I received customized rules perfectly suited to our Transilience AI marketing website codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-1:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1ybixp149me8p64xtb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1ybixp149me8p64xtb8.png" alt="Promppt-1" width="615" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Article content and this is the summary of result&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9upg4cyajjps7n7jyik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9upg4cyajjps7n7jyik.png" alt="Prompt-1 result" width="615" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was still not perfect, though. But giving some prompts to generate the rest of the rules completed the job. Still, it will miss some custom needs. You add those, and it is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-2:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;this is good can you see if you there is a scope for more rules. I can see for front end development we can set a rule, for icon it should look for iconify package and follow the existing use cases. Please see if there are any additional rules we can include.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;and this is the result&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ukiln1rhrjqwgy0809x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ukiln1rhrjqwgy0809x.png" alt="Prompt-2-result" width="615" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I remove animation-pattern.mdc, form-handling.mdc, seo-practices.mdc, as I didn't need this. &lt;/p&gt;

&lt;p&gt;The rules are very important. There are multiple ways to integrate iconify icons in the NextJs application. After trying all of them, I chose one to go with. These rules set the standard for future contributors. Here is the icon-usage.mdc&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxw4fr57jh3tjxqi5rid2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxw4fr57jh3tjxqi5rid2.png" alt="icon-usage.mdc" width="800" height="1308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last, I figured that it missed the Shadcn implementation while creating a new reusable low-level component, so I passed one last prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-3:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;In the coding-standards.mdc, specify that if a new reusable component needs to be created, shadcn should be used.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And result&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqjbqvxkg1vajch6d84b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqjbqvxkg1vajch6d84b.png" alt="prompt-3-result" width="615" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Custom Rules
&lt;/h2&gt;

&lt;p&gt;These custom rules provide significant benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They help new contributors follow established standards&lt;/li&gt;
&lt;li&gt;They enable non-front-end developers to add features while maintaining consistency&lt;/li&gt;
&lt;li&gt;They reduce the need for constant oversight and feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just remember to update your rules as your codebase evolves.&lt;/p&gt;

&lt;p&gt;This is our Transilience AI marketing website codebase, which is kind of simple, nothing complicated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr6zmd384f7s0mqqxo0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr6zmd384f7s0mqqxo0k.png" alt="codebase" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Cursor's &lt;code&gt;/Generate Cursor Rules&lt;/code&gt; feature is a remarkable addition that simplifies maintaining coding standards across development teams. By generating contextually relevant rules through conversation, it significantly reduces the effort required to establish and enforce coding guidelines. For teams like ours at Transilience AI, where different specialists need to collaborate seamlessly, this feature is invaluable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>development</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Evolution of Frontend Development: A Shift from Component Libraries to AI-Driven Custom Solutions</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Fri, 27 Dec 2024 17:39:46 +0000</pubDate>
      <link>https://dev.to/muzaffar640/the-evolution-of-frontend-development-a-shift-from-component-libraries-to-ai-driven-custom-34me</link>
      <guid>https://dev.to/muzaffar640/the-evolution-of-frontend-development-a-shift-from-component-libraries-to-ai-driven-custom-34me</guid>
      <description>&lt;p&gt;Frontend development is experiencing a fascinating transformation, much like a chef evolving from pre-made ingredients to crafting dishes from scratch with better tools. As a frontend engineer, I've watched our development practices shift from relying heavily on traditional UI component libraries – those convenient but often inflexible solutions – toward something more refined: AI-assisted, custom-tailored approaches that combine the efficiency we need with the flexibility we've always wanted. This shift represents more than just a change in tools; it's a deeper understanding of how to build web applications that are both performant and maintainable.&lt;/p&gt;

&lt;p&gt;With the help of AI tools, we are able to create complex custom UI components based on Figma designs and deliver them fast. Speed is the most significant factor here. Because modifying a component from a traditional library to match a Figma design was a time-consuming process. But with the help of AI, this becomes very fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Traditional Approach: The Hidden Cost of Convenience
&lt;/h2&gt;

&lt;p&gt;When I started my career, installing Material UI or Bootstrap was almost a reflex action when setting up a new project. These comprehensive UI libraries promised rapid development and consistent design. However, after years of building and maintaining large-scale applications, I've come to recognize the significant drawbacks of this approach.&lt;/p&gt;

&lt;p&gt;Let's look at some numbers that might surprise you:&lt;/p&gt;

&lt;p&gt;A typical Material UI installation adds approximately 300KB to your bundle size (after minification and gzipping). While this might seem negligible, consider that Google's research shows a 1-second delay in mobile load times can impact conversion rates by up to 20%.&lt;/p&gt;

&lt;p&gt;In one of my recent projects, we analyzed our dependency usage and found that we were only utilizing about 15% of the components from our UI library, yet carrying 100% of the bundle weight. This inefficiency becomes even more apparent when you consider that modern web applications often integrate multiple specialized libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rise of Utility-First CSS and Atomic Design
&lt;/h2&gt;

&lt;p&gt;The growing popularity of Tailwind CSS marked the beginning of a paradigm shift. Instead of importing pre-built components, developers started embracing utility-first CSS. This approach provided granular control while maintaining consistency through design tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter shadcn/ui: A Game-Changing Approach
&lt;/h2&gt;

&lt;p&gt;What makes shadcn/ui different? Instead of installing a library, you copy the components you need directly into your project. This approach offers several advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bundle Size Optimization&lt;/strong&gt;: You only include what you use, resulting in significantly smaller bundle sizes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Customization Control&lt;/strong&gt;: Since components live in your codebase, you can modify them without fighting against library constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Full TypeScript support without dependency version conflicts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The AI Revolution in Component Development
&lt;/h2&gt;

&lt;p&gt;Here's where things get really interesting. The integration of AI in frontend development is transforming how we create custom components. Let me share a recent experience where I needed to create a button component with a sophisticated shiny effect.&lt;/p&gt;

&lt;p&gt;Instead of reaching for a UI library that would bloat our bundle size, I used AI to help craft a custom button component that perfectly matched our needs. Here's the elegant solution we implemented:&lt;/p&gt;

&lt;p&gt;First, we defined our button variants and animations in our Tailwind configuration:&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;// tailwind.config.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;keyframes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;shine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;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="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;translateX(-100%)&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="s2"&gt;100%&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;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;translateX(100%)&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="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;shine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shine 2s ease-in-out infinite&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="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tailwindcss-animate&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="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we created our button component with multiple variants and a beautiful shine effect:&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;// Custom Button Component with AI-enhanced styling&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&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;Slot&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="s2"&gt;@radix-ui/react-slot&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;cva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;VariantProps&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="s2"&gt;class-variance-authority&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;cn&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="s2"&gt;@/lib/utils&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;buttonVariants&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cva&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50&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;variants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-gradient-to-r from-[#6941C6] to-[#4C318A] text-white border-transparent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;destructive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-destructive text-destructive-foreground hover:bg-destructive/90&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;border-2 border-[#6941C6] bg-transparent text-[#6941C6] hover:bg-[#6941C6]/10 transition-all duration-300&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-secondary text-secondary-foreground hover:bg-secondary/80&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ghost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hover:bg-accent hover:text-accent-foreground&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-primary underline-offset-4 hover:underline&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;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h-10 px-4 py-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h-9 rounded-md px-3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h-11 rounded-md px-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h-10 w-10&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="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;defaultVariants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ButtonProps&lt;/span&gt;
  &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ButtonHTMLAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;VariantProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;buttonVariants&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;asChild&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ButtonProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;asChild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Comp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;asChild&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Slot&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Comp&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;cn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;buttonVariants&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="p"&gt;}))}&lt;/span&gt;
        &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;displayName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buttonVariants&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach demonstrates the power of AI-assisted component development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Bundle Size&lt;/strong&gt;: Our entire button implementation, including animations and variants, weighs just 3.8KB compared to approximately 45KB from a typical UI component library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Design Control&lt;/strong&gt;: The component seamlessly integrates with our design system, offering multiple variants (default, outline, destructive, etc.) and sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-Safe&lt;/strong&gt;: Full TypeScript support with proper type inference for variants and props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimized Performance&lt;/strong&gt;: Custom animations using Tailwind's built-in animation system avoid heavy animation libraries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainable Code&lt;/strong&gt;: Clean, well-structured code that's easy to modify and extend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shine animation effect is achieved purely through CSS animations and Tailwind's utility classes, making it incredibly performant and customizable. This is a perfect example of how AI can help us craft precise, efficient solutions without the overhead of traditional component libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Frontend Development
&lt;/h2&gt;

&lt;p&gt;This shift represents more than just a trend—it's a fundamental change in how we approach frontend development. By combining utility-first CSS frameworks like Tailwind, component collection approaches like shadcn/ui, and AI-assisted development, we're entering an era of more efficient, maintainable, and performant web applications. And have your own design system inplace.&lt;/p&gt;

&lt;p&gt;The numbers speak for themselves. In a recent project migration from Material UI to this new approach, we saw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial bundle size decreased by 27%&lt;/li&gt;
&lt;li&gt;Time to Interactive improved by 18%&lt;/li&gt;
&lt;li&gt;Build times improved by 15%&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;As we move forward, I expect this trend to accelerate. The future of frontend development lies not in massive, one-size-fits-all libraries, but in customizable, efficient solutions powered by AI and modern development practices.&lt;/p&gt;

&lt;p&gt;Remember, the best tool is often the one you craft yourself, especially when you have AI as your pair programmer. The key is finding the right balance between development speed and application performance.&lt;/p&gt;

&lt;p&gt;What are your thoughts on this shift? Have you experimented with AI-assisted component development? I'd love to hear about your experiences in the comments below.&lt;/p&gt;

&lt;p&gt;See Ya,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.muzaffarhossain.com/" rel="noopener noreferrer"&gt;Muzaffar Hossain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/muzaffarhossain" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://x.com/iammuzaffar640" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/muzaffar640" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://dev.to/muzaffar640"&gt;Dev.to&lt;/a&gt; | &lt;a href="https://medium.com/@muzaffar640" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>react</category>
    </item>
    <item>
      <title>Why I Can't Stop Talking About Arc Browser: A Developer's Story</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Mon, 16 Dec 2024 04:50:06 +0000</pubDate>
      <link>https://dev.to/muzaffar640/why-i-cant-stop-talking-about-arc-browser-a-developers-story-5dl0</link>
      <guid>https://dev.to/muzaffar640/why-i-cant-stop-talking-about-arc-browser-a-developers-story-5dl0</guid>
      <description>&lt;h1&gt;
  
  
  Why I Can't Stop Talking About Arc Browser: A Developer's Story
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Backstory
&lt;/h2&gt;

&lt;p&gt;Last week, I was brainstorming with Garima, our lead designer at &lt;a href="https://www.transilience.ai/" rel="noopener noreferrer"&gt;Transilience AI&lt;/a&gt;. While walking her through some UI components, she noticed my unconventional browser setup. "What do you think about Arc Browser?" she asked, pointing at my neatly organized workspace. She knew about Arc from our team meetings but hadn't given it a try, even though I'd been using it for months.&lt;/p&gt;

&lt;p&gt;As a startup, we keep experimenting with new tech. If we like it, awesome; if we don't, we move on. What followed was a passionate 10-minute monologue about Arc browser that had her completely hooked. This wasn't the first time – I'd had similar conversations when explaining Arc to friends. That's when I realized I should probably write this down. If my friends and colleagues found these insights valuable, perhaps others would too.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Isn't Your Typical Tutorial
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let me be clear: this isn't another "How to Get Started with Arc" guide with flashy images and videos. There are already excellent resources out there for that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arc.net/blog" rel="noopener noreferrer"&gt;Arc's Official Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Browser Company's &lt;a href="https://www.youtube.com/@TheBrowserCompany/videos" rel="noopener noreferrer"&gt;YouTube Channel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/insiderengineering/embracing-efficiency-with-the-arc-browser-part-i-9783def7beb3" rel="noopener noreferrer"&gt;Embracing Efficiency with the Arc Browser — Part I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/insiderengineering/embracing-efficiency-with-the-arc-browser-part-ii-531b4f40601b" rel="noopener noreferrer"&gt;Embracing Efficiency with the Arc Browser — Part II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eshop.macsales.com/blog/86505-arc-changed-the-way-i-use-a-mac-the-ultimate-guide-to-an-ingenious-new-browser/" rel="noopener noreferrer"&gt;Arc Changed the Way I Use a Mac: The Ultimate Guide to an Ingenious New Browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, I want to share why Arc has become an indispensable part of my daily workflow, both as a Software Engineer and as someone obsessed with productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Friction in My Browser Workflow
&lt;/h2&gt;

&lt;p&gt;As a Mac M3 user, I've never faced Chrome's notorious memory issues. Over the years, I've experimented with Firefox, Edge, Tor, and Brave for different use cases, but I always found myself gravitating back to Chrome. Don't get me wrong - Chrome is an excellent browser that runs like a bull, especially on Apple silicon.&lt;/p&gt;

&lt;p&gt;While Chrome reliably gets the job done, it felt more like a tool I tolerated than one I loved. Enter Arc: a browser that reimagines what working online can feel like. It didn’t just meet my needs, it surprised me by solving problems I hadn’t even noticed before.&lt;/p&gt;

&lt;p&gt;Then Arc came along and showed me what I'd been missing. It solved problems I didn't even realize were problems until I experienced a better way. It's like switching from a regular text editor to VS Code - you don't realize how much friction existed in your workflow until it's gone. And the best part? It has all the good things of Chrome and some more good stuff that makes you wonder why nobody thought of this before.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Arc Transformed My Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Command Bar: The Developer's New Best Friend
&lt;/h3&gt;

&lt;p&gt;As a developer, the command bar is like having a senior engineer's brain at your fingertips. &lt;code&gt;⌘+T&lt;/code&gt; isn't just for new tabs anymore – it's your command center. Need that React hooks documentation you had open yesterday? It's there. Looking for that GitHub issue from last week? Just type a few characters. The time saved from not hunting through tabs adds up significantly. It feels like an extension of the &lt;code&gt;Finder&lt;/code&gt; feature in &lt;code&gt;MacOS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But here's the real game-changer: it learns from your habits. After a few days, Arc understands your workflow better than any browser I've used. It's like having a really efficient personal assistant who knows exactly what you're looking for.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Spaces: Context-Switching Without the Mental Overhead
&lt;/h3&gt;

&lt;p&gt;Remember the last time you had to switch between multiple projects? In traditional browsers, this means either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Having multiple windows with dozens of tabs each&lt;/li&gt;
&lt;li&gt;Constantly opening and closing tabs&lt;/li&gt;
&lt;li&gt;Using bookmarks (let's be honest, who maintains those?)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Arc's Spaces changed this completely. Think of Spaces as different rooms in your browser house, each perfectly arranged for its purpose. The game-changer? You can have multiple spaces under one profile, all accessible from the same place. No more logging in and out or switching between browser profiles.&lt;/p&gt;

&lt;p&gt;Here's how I've organized my digital life:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development for Office work under the &lt;code&gt;Work&lt;/code&gt; profile&lt;/li&gt;
&lt;li&gt;My personal study and development under the &lt;code&gt;Personal&lt;/code&gt; profile&lt;/li&gt;
&lt;li&gt;Personal regular stuff different household utility portals, shopping, etc under the &lt;code&gt;Personal&lt;/code&gt; profile.&lt;/li&gt;
&lt;li&gt;Side project that I am working on under &lt;code&gt;Hustle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switching projects in Arc feels less like juggling tabs and more like stepping into a different workspace, tailored to the task at hand. Each space is its own ecosystem, waiting for you exactly as you left it – no tab chaos or reorganizing necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Split View &amp;amp; Little Arc: Your New Pair Programming Partner
&lt;/h3&gt;

&lt;p&gt;Every developer knows the dance: documentation on one monitor, code on another, and Stack Overflow somewhere in between. Arc's split view is like having an extra monitor within your browser. I regularly have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The articles that I added to the reading list&lt;/li&gt;
&lt;li&gt;Documentation paired with my code sandbox&lt;/li&gt;
&lt;li&gt;Developing screens alongside my Figma design&lt;/li&gt;
&lt;li&gt;API responses next to my test cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's what makes it truly powerful: these splits persist within your spaces. When I return to a project, my setup is exactly how I left it – no more recreating my workspace every morning.&lt;/p&gt;

&lt;p&gt;Since I have an ultra-wide monitor, I sometimes open four split screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Little Arcs: Your Digital Scratch Pad
&lt;/h3&gt;

&lt;p&gt;Think of Little Arcs as disposable browsers for quick tasks. Need to check something quickly without cluttering your workspace? Little Arc. Want to test how your site looks in a fresh session? Little Arc. They're like sticky notes for your browsing – use them and lose them.&lt;/p&gt;

&lt;p&gt;The real magic happens when you're deep in development. Instead of opening a new tab and losing focus on your main work, Little Arcs lets you jump in, solve a problem, and &lt;strong&gt;jump right back out without losing the context of what you were working on&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Little Arcs keeps your main workspace pristine while you handle those essential side quests.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Mobile Sync: Take Your Workflow Anywhere
&lt;/h3&gt;

&lt;p&gt;One of the biggest surprises of Arc came when I installed it on my phone. Unlike traditional browsers where mobile sync means just bookmarks and passwords, Arc takes your entire workspace on the go. Each space, with its specific arrangement of pinned tabs and organization, syncs seamlessly to your mobile device.&lt;/p&gt;

&lt;p&gt;What makes this particularly powerful is how it maintains context. When I'm coding at my desk and need to step away, I can pick up my phone and continue reading that crucial documentation or checking those API responses right where I left off. My workspace stays separate from my personal browsing, just like on my desktop.&lt;/p&gt;

&lt;p&gt;The other day, I had to run to meet someone in the middle of work. After reaching there, I had to wait for almost half an hour. I just opened the computer version of the Arc browser and continued reading.&lt;/p&gt;

&lt;p&gt;The mobile experience doesn't feel like a watered-down version of the desktop app - it's thoughtfully designed to complement it. You can access all your spaces, your pinned tabs, and even your recent browsing history, making the transition between devices feel natural and productive.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Boosts: Custom JavaScript and UI for Power Users
&lt;/h3&gt;

&lt;p&gt;As a developer, this feature is pure gold. Imagine having custom JavaScript snippets ready to enhance any website. I've created boosts to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert light-themed websites that I frequently visit to dark mode when they don't offer it natively. You can do this in about 30 seconds. I've already transformed EdX, LinkedIn (👆 that bright &lt;code&gt;Banner&lt;/code&gt; image 👆), idratherbewriting.com, and several other sites I spend time on&lt;/li&gt;
&lt;li&gt;Use community boosts like &lt;code&gt;No YouTube Shorts Plz&lt;/code&gt; that hide all shorts from YouTube - something I've wanted forever&lt;/li&gt;
&lt;li&gt;Add keyboard shortcuts to frequently used web apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real power comes when you encounter a website with a UI that doesn't match your preferences - just change it in 30 seconds. It's that simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Features Worth Mentioning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Built-in ad blocking that actually works&lt;/li&gt;
&lt;li&gt;Focus mode that helps you stay on task&lt;/li&gt;
&lt;li&gt;Easels for visual organization&lt;/li&gt;
&lt;li&gt;Command palette that feels like VS Code&lt;/li&gt;
&lt;li&gt;Theme customization that doesn't feel hacky&lt;/li&gt;
&lt;li&gt;The preview window of a website on hovering over the link.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More Than Just a Browser
&lt;/h2&gt;

&lt;p&gt;Arc isn't just another Chrome alternative – it's a reflection of how modern developers and professionals actually work. It's not about having a prettier browser; it's about having a smarter one. One that understands that your browser is your workspace, your research tool, your communication hub, and your development environment are all rolled into one.&lt;/p&gt;

&lt;p&gt;I love what &lt;a href="https://thebrowser.company/" rel="noopener noreferrer"&gt;The Browser Company&lt;/a&gt; is doing with Arc browser. I loved it when the founder said, it is not just another impressive startup that gonna bought by other big company.&lt;/p&gt;

&lt;p&gt;Want to give it a try? Start with the resources I mentioned above, but don't just follow tutorials. Experiment. Find your own workflow. Because that's what Arc does best – it adapts to you, not the other way around.&lt;/p&gt;

&lt;p&gt;If you're ready to boost your productivity, give &lt;a href="https://arc.net/gift/5cfe4eba" rel="noopener noreferrer"&gt;Arc Browser&lt;/a&gt; a try.&lt;/p&gt;

&lt;p&gt;Happy Building,&lt;/p&gt;

&lt;p&gt;See Ya,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.muzaffarhossain.com" rel="noopener noreferrer"&gt;Muzaffar Hossain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/muzaffarhossain" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://x.com/iammuzaffar640" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/muzaffar640" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/search?q=muzaffar%20hossain"&gt;You may like my other writings&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>TypeScript and ReactMarkdown: A Tale of Types, Tears, and Triumph</title>
      <dc:creator>Muzaffar Hossain</dc:creator>
      <pubDate>Wed, 04 Dec 2024 18:12:42 +0000</pubDate>
      <link>https://dev.to/muzaffar640/typescript-and-reactmarkdown-a-tale-of-types-tears-and-triumph-1h1a</link>
      <guid>https://dev.to/muzaffar640/typescript-and-reactmarkdown-a-tale-of-types-tears-and-triumph-1h1a</guid>
      <description>&lt;p&gt;&lt;em&gt;Quick disclaimer: What you're about to read covers only about 20% of the type errors I encountered. Initially, I hadn't planned to write this blog post - I was just trying to get my markdown renderer working. But after the fifth cup of coffee and the twentieth type error, I thought, "Someone else needs to benefit from this suffering." So here we are.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Good news: At the end of this post, I'm sharing four production-ready template files that you can use as a starting point for your own implementation. These templates have saved my team countless hours, and hopefully, they'll do the same for you.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Implementation Matters: The AI Landscape Context
&lt;/h2&gt;

&lt;p&gt;Let me provide some context about why this implementation became crucial for our team. We're building &lt;a href="https://www.transilience.ai/" rel="noopener noreferrer"&gt;Transilience AI&lt;/a&gt;, an AI applications in cybersecurity solutions, which means handling streaming responses is a fundamental requirement. Our architecture involves custom agents and modal streaming endpoints that stream responses, necessitating a frontend application capable of handling and styling each HTML component according to our specific needs.&lt;/p&gt;

&lt;p&gt;Here's what makes this particularly challenging: the AI landscape is evolving at a breakneck pace. What worked yesterday might need refactoring tomorrow, and documentation often struggles to keep up with this rapid evolution. While building our streaming interface, I found myself navigating through outdated docs and contradicting solutions.&lt;/p&gt;

&lt;p&gt;I want to be transparent here - this blog post represents our current, working solution. Given the pace of change in AI development, some aspects might need adaptation in a few months. However, the core concepts and type-safety patterns we've discovered should remain valuable, even as the ecosystem evolves.&lt;/p&gt;

&lt;p&gt;The solutions presented here were born from real-world requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handling streaming markdown responses from AI models&lt;/li&gt;
&lt;li&gt;Ensuring type safety across our entire application&lt;/li&gt;
&lt;li&gt;Creating maintainable, customizable components that could evolve with our needs&lt;/li&gt;
&lt;li&gt;Building a foundation that could scale as our AI applications grew more complex&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Beginning: Understanding the Type System Maze
&lt;/h2&gt;

&lt;p&gt;When I first started implementing ReactMarkdown with TypeScript, I thought I had a solid grasp of both technologies. The &lt;a href="https://github.com/remarkjs/react-markdown" rel="noopener noreferrer"&gt;ReactMarkdown documentation&lt;/a&gt; made it look straightforward:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ReactMarkdown&lt;/span&gt;
  &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
    &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SomeComponent&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;  &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But TypeScript had other plans. The moment I tried this "simple" approach, I was greeted with the cryptic error: "Property 'inline' does not exist on type '{}'". And thus began my journey through the type system maze.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Evolution of Solutions
&lt;/h3&gt;

&lt;p&gt;Let me walk you through the progression of attempts that led to our final solution. Each one taught me something valuable about TypeScript's type system.&lt;/p&gt;

&lt;p&gt;First, I started with what seemed logical - using React's built-in type definitions:&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="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CodeProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ComponentProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CodeComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;CodeProps&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;// Implementation that was doomed from the start&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach failed because React's native types don't include ReactMarkdown-specific properties. A rookie mistake, but one that taught me to look deeper into library-specific type definitions.&lt;/p&gt;

&lt;p&gt;Next, I tried using ReactMarkdownOptions:&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;ReactMarkdownOptions&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="s2"&gt;react-markdown/lib/react-markdown&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;CodeComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReactMarkdownOptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;components&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="s2"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Getting closer, but still not quite there&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, after much research and experimentation, I found the solution that worked:&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;Components&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="s2"&gt;react-markdown/lib/ast-to-react&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;CodeComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Components&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/language-&lt;/span&gt;&lt;span class="se"&gt;(\w&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CodeBlock&lt;/span&gt; &lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;codeChildren&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Display Name and Circular Reference Challenges
&lt;/h2&gt;

&lt;p&gt;Just when I thought I had everything under control, ESLint started complaining about missing display names. Here's how we solved it while maintaining type safety:&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Components&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CodeComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CodeComponent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="c1"&gt;// ... other components&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The circular reference crisis we encountered led to this type-safe solution:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extractTextContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&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;node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&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;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extractTextContent&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isValidElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&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="nf"&gt;extractTextContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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="dl"&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;h2&gt;
  
  
  Best Practices We Learned the Hard Way
&lt;/h2&gt;

&lt;p&gt;Through this journey, we discovered several crucial best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Always use the Components type from &lt;code&gt;react-markdown/lib/ast-to-react&lt;/code&gt; for custom components - it provides the most complete type definitions for all ReactMarkdown component properties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be extremely careful with import paths - using the wrong import path can lead to incomplete type definitions. Always import from &lt;code&gt;react-markdown/lib/ast-to-react&lt;/code&gt; when working with custom components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When using &lt;code&gt;React.memo&lt;/code&gt; with &lt;code&gt;ReactMarkdown&lt;/code&gt; components, apply the type definition before memoization. This ensures proper type inference and prevents hard-to-debug type errors later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Never use &lt;code&gt;@types/react-markdown&lt;/code&gt; directly - let the types come from the &lt;code&gt;react-markdown&lt;/code&gt; package itself. The DefinitelyTyped types can sometimes be outdated or incomplete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Always provide explicit display names for your components, even though it might seem redundant. This becomes crucial for debugging and React DevTools usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When dealing with children props, always implement proper type-safe content extraction. This prevents runtime errors from circular references.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Production-Ready Templates and Implementation
&lt;/h2&gt;

&lt;p&gt;As promised, I'm sharing our battle-tested templates: &lt;a href="https://github.com/muzaffar640/markdown-renderer" rel="noopener noreferrer"&gt;Github: Markdown Renderer&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://raw.githubusercontent.com/muzaffar640/markdown-renderer/refs/heads/main/src/components/MarkdownRenderer.tsx" rel="noopener noreferrer"&gt;MarkdownRenderer.tsx&lt;/a&gt;: The main component that handles markdown rendering&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://raw.githubusercontent.com/muzaffar640/markdown-renderer/refs/heads/main/src/components/component.tsx" rel="noopener noreferrer"&gt;components.tsx&lt;/a&gt;: Custom components with proper typing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://raw.githubusercontent.com/muzaffar640/markdown-renderer/refs/heads/main/src/components/CodeBlock.tsx" rel="noopener noreferrer"&gt;CodeBlock.tsx&lt;/a&gt;: A reusable code block component with syntax highlighting&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://raw.githubusercontent.com/muzaffar640/markdown-renderer/refs/heads/main/src/utils/stream.ts" rel="noopener noreferrer"&gt;codeLanguageSubset.ts&lt;/a&gt;: Supported language configurations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These files have been refined through countless type errors and edge cases. They handle everything from basic markdown to complex mathematical equations and code syntax highlighting. You can add more html attributes to &lt;code&gt;component.tsx&lt;/code&gt; like &lt;code&gt;image&lt;/code&gt; and all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;What started as a "simple task" turned into a deep dive into TypeScript's type system and React's component model. The lessons learned have made me a better developer, and the solutions we discovered have saved countless hours for our team.&lt;/p&gt;

&lt;p&gt;I'm currently working on extending this setup to handle real-time collaborative markdown editing. If you're interested in that or have questions about the implementation details shared here, feel free to reach out.&lt;/p&gt;

&lt;p&gt;Remember: TypeScript errors are like that friend who always points out the spinach in your teeth. Annoying? Yes. But they're looking out for you! 😄&lt;/p&gt;




&lt;p&gt;Found this helpful? Let's continue the conversation! I'm always excited to hear about your experiences and challenges with TypeScript and React.&lt;/p&gt;

&lt;p&gt;See ya,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.muzaffarhossain.com" rel="noopener noreferrer"&gt;Muzaffar Hossain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/muzaffarhossain" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://x.com/iammuzaffar640" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/muzaffar640" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>typescript</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
