<?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: Zwel👻</title>
    <description>The latest articles on DEV Community by Zwel👻 (@zwelhtetyan).</description>
    <link>https://dev.to/zwelhtetyan</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%2F893922%2F482e28cf-4555-4954-bd47-8da82deb7eb2.png</url>
      <title>DEV Community: Zwel👻</title>
      <link>https://dev.to/zwelhtetyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zwelhtetyan"/>
    <language>en</language>
    <item>
      <title>Next.js Module Graphs: The Hidden Architecture Behind Server and Client Components</title>
      <dc:creator>Zwel👻</dc:creator>
      <pubDate>Wed, 25 Feb 2026 17:09:09 +0000</pubDate>
      <link>https://dev.to/zwelhtetyan/nextjs-module-graphs-the-hidden-architecture-behind-server-and-client-components-4h</link>
      <guid>https://dev.to/zwelhtetyan/nextjs-module-graphs-the-hidden-architecture-behind-server-and-client-components-4h</guid>
      <description>&lt;p&gt;Most Next.js tutorials tell you: "Server Components run on the server, Client Components run on the client." That's true, but it hides a massive architectural detail that will confuse you the moment you try to share state between them.&lt;/p&gt;

&lt;p&gt;In this article, we'll build a small experiment, observe something that seems impossible, and then peel back the layers of the Next.js rendering pipeline to understand exactly what's happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;Let's create a simple closure-based state module and share it between a Server Component and a Client Component.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shared State Module
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// store/state.ts&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;funcInitializeCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stateCreator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;funcInitializeCount&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stateCreator initialized&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;funcInitializeCount&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;setCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;setCount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&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;const&lt;/span&gt; &lt;span class="nx"&gt;decrease&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&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="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;increase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrease&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;stateCreator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When this module loads, &lt;code&gt;stateCreator()&lt;/code&gt; runs immediately and creates a closure with &lt;code&gt;count = 0&lt;/code&gt;. The &lt;code&gt;funcInitializeCount&lt;/code&gt; variable tracks how many times the factory runs — we'll use this to detect re-initialization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page A — A Server Component That Mutates State
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/a/page.tsx&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;myState&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;@/store/state&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;ClientComp&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;../_components/client-comp&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="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PageA&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;setCount&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Page A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;count&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-4 flex flex-col gap-4 items-start"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Page A, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientComp&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Page A"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;Page A imports &lt;code&gt;myState&lt;/code&gt;, calls &lt;code&gt;setCount(1)&lt;/code&gt; to mutate &lt;code&gt;count&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;, then renders both the count and a &lt;code&gt;&amp;lt;ClientComp /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page B — A Server Component That Reads State
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/b/page.tsx&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;myState&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;@/store/state&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;ClientComp&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;../_components/client-comp&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="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PageB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Page B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;count&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-4 flex flex-col gap-4 items-start"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Page B, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientComp&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Page B"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;Page B just reads &lt;code&gt;count()&lt;/code&gt; — no mutation. We'll use this to verify shared state behavior within the same world.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Client Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/_components/client-comp.tsx&lt;/span&gt;

&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&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;Button&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;@/components/ui/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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;myState&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;@/store/state&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ClientComp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;increase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrease&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Client component from&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;count&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"space-y-2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Client component, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; from &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;increase&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Increase&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;decrease&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Decrease&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;code&gt;ClientComp&lt;/code&gt; also imports &lt;code&gt;myState&lt;/code&gt; and reads &lt;code&gt;count()&lt;/code&gt;. It has the &lt;code&gt;"use client"&lt;/code&gt; directive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Puzzle
&lt;/h2&gt;

&lt;p&gt;Visit &lt;code&gt;/a&lt;/code&gt;. You see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Page A, 1
Client component, 0 from Page A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait. Both &lt;code&gt;PageA&lt;/code&gt; and &lt;code&gt;ClientComp&lt;/code&gt; import the same &lt;code&gt;myState&lt;/code&gt; from the same &lt;code&gt;store/state.ts&lt;/code&gt; file. &lt;code&gt;PageA&lt;/code&gt; calls &lt;code&gt;setCount(1)&lt;/code&gt;, so &lt;code&gt;count&lt;/code&gt; is now &lt;code&gt;1&lt;/code&gt;. Then &lt;code&gt;ClientComp&lt;/code&gt; reads &lt;code&gt;count()&lt;/code&gt; — &lt;strong&gt;so why does it show &lt;code&gt;0&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three possible explanations come to mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next.js re-initializes &lt;code&gt;stateCreator&lt;/code&gt; before rendering &lt;code&gt;ClientComp&lt;/code&gt;&lt;/strong&gt; — But then &lt;code&gt;funcInitializeCount&lt;/code&gt; would be &lt;code&gt;2&lt;/code&gt;, and we'd see a second &lt;code&gt;"stateCreator initialized 2"&lt;/code&gt; log. We don't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next.js uses the existing (mutated) state for &lt;code&gt;ClientComp&lt;/code&gt;'s HTML&lt;/strong&gt; — Then the server HTML would say &lt;code&gt;1&lt;/code&gt;, but the browser's fresh state would say &lt;code&gt;0&lt;/code&gt;. That's a hydration mismatch. We don't get one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Something else entirely is going on.&lt;/strong&gt; ✅&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The answer is &lt;strong&gt;option 3&lt;/strong&gt;, and it requires understanding the Next.js module graph architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Module Graphs
&lt;/h2&gt;

&lt;p&gt;When you build a Next.js App Router application, the bundler doesn't create one bundle. It creates &lt;strong&gt;separate module graphs&lt;/strong&gt; for different environments:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The RSC Module Graph (Server Bundle)
&lt;/h3&gt;

&lt;p&gt;This graph contains your &lt;strong&gt;Server Components&lt;/strong&gt; and every module they import — up to (but &lt;strong&gt;not crossing&lt;/strong&gt;) the &lt;code&gt;"use client"&lt;/code&gt; boundary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RSC Module Graph
├── app/a/page.tsx        (Server Component)
├── app/b/page.tsx        (Server Component)
└── store/state.ts        ← loaded here, stateCreator() runs, count = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the RSC renderer hits &lt;code&gt;&amp;lt;ClientComp /&amp;gt;&lt;/code&gt;, it does &lt;strong&gt;not&lt;/strong&gt; follow the import into &lt;code&gt;client-comp.tsx&lt;/code&gt;. Instead, it records a &lt;strong&gt;component reference&lt;/strong&gt; with the serialized props (&lt;code&gt;{ name: "Page A" }&lt;/code&gt;) and moves on.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Client Module Graph (Client Bundle)
&lt;/h3&gt;

&lt;p&gt;This graph starts at every &lt;code&gt;"use client"&lt;/code&gt; boundary and includes everything those files import.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client Module Graph
├── app/_components/client-comp.tsx   ("use client" entry point)
└── store/state.ts                    ← loaded AGAIN, separately
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;store/state.ts&lt;/code&gt; appears in &lt;strong&gt;both&lt;/strong&gt; graphs. But these are completely independent module instances — separate &lt;code&gt;funcInitializeCount&lt;/code&gt; variables, separate closures, separate &lt;code&gt;count&lt;/code&gt; values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Two Graphs?
&lt;/h3&gt;

&lt;p&gt;This isn't a quirk — it's a fundamental design choice. Server Components can use Node.js APIs, access the filesystem, query databases directly, and use secrets. That code must &lt;strong&gt;never&lt;/strong&gt; end up in the browser bundle. The &lt;code&gt;"use client"&lt;/code&gt; directive is a fence that tells the bundler: "Everything above this line stays on the server. Everything below ships to the client."&lt;/p&gt;

&lt;p&gt;The cost of this safety is that &lt;strong&gt;module-level state cannot cross the boundary&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Rendering Phases
&lt;/h2&gt;

&lt;p&gt;Now let's trace exactly what happens when you visit &lt;code&gt;/a&lt;/code&gt;, step by step through all four phases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: RSC Rendering (Server)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Server process&lt;br&gt;
&lt;strong&gt;Bundle:&lt;/strong&gt; RSC (Server) module graph&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Generate a serialized component tree (RSC Payload)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Next.js invokes PageA()
2. PageA imports myState from the RSC module graph's state.ts
   → stateCreator() already ran when the module loaded
   → count = 0 in this closure
3. setCount(1) → count is now 1 in the RSC closure
4. count() returns 1 → renders "Page A, 1"
5. Hits &amp;lt;ClientComp name="Page A" /&amp;gt;
   → ClientComp has "use client"
   → RSC does NOT execute ClientComp
   → Instead, emits a reference: { type: ClientComp, props: { name: "Page A" } }
6. Outputs RSC Payload (a serialized tree, not HTML)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; The RSC renderer &lt;strong&gt;never runs&lt;/strong&gt; &lt;code&gt;ClientComp&lt;/code&gt;. It can't — that component may use &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, browser APIs, etc. Instead, it creates a placeholder that says "render this client component here with these props."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server logs from this phase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setCount 1
Page A 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 2: SSR — Server-Side Rendering of Client Components
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Server process (same machine, different context)&lt;br&gt;
&lt;strong&gt;Bundle:&lt;/strong&gt; Client module graph&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Generate the initial HTML so the user sees content before JavaScript loads&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Next.js takes the RSC Payload from Phase 1
2. For each client component reference, it executes the component
   using the CLIENT module graph
3. ClientComp imports myState from the CLIENT graph's state.ts
   → This is a DIFFERENT module instance
   → stateCreator() ran when THIS module loaded
   → count = 0 in THIS closure (setCount(1) never happened here)
4. count() returns 0 → renders "Client component, 0 from Page A"
5. The complete HTML is generated and sent to the browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; The client bundle's &lt;code&gt;state.ts&lt;/code&gt; has &lt;strong&gt;no knowledge&lt;/strong&gt; of the &lt;code&gt;setCount(1)&lt;/code&gt; call. That mutation happened in the RSC module graph's copy. This module's &lt;code&gt;count&lt;/code&gt; has been &lt;code&gt;0&lt;/code&gt; since initialization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server logs from this phase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateCreator initialized 1    (client bundle's initialization)
Client component from Page A =&amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 3: Browser — JavaScript Loading
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; User's browser&lt;br&gt;
&lt;strong&gt;Bundle:&lt;/strong&gt; Client module graph (downloaded JS chunks)&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Load the JavaScript needed for interactivity&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Browser downloads the client JS bundle
2. state.ts module executes in the browser
   → stateCreator() runs → count = 0
   → funcInitializeCount goes from 0 to 1 (fresh variable)
3. All client modules are now loaded and ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser console logs from this phase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateCreator initialized 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 4: Hydration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; User's browser&lt;br&gt;
&lt;strong&gt;Bundle:&lt;/strong&gt; Same client JS from Phase 3&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Attach event listeners and make the page interactive&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. React walks the server-rendered HTML
2. It executes ClientComp with { name: "Page A" }
3. count() returns 0 (from the browser's closure)
4. React compares: server HTML says "0", client render says "0" → ✅ MATCH
5. Hydration succeeds — no errors
6. Event listeners attached — buttons now work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser console logs from this phase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client component from Page A =&amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why &lt;code&gt;funcInitializeCount&lt;/code&gt; Is Always 1
&lt;/h2&gt;

&lt;p&gt;This is the most telling proof that we have separate module worlds. If it were a single shared module, we'd see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stateCreator initialized 1    (first load)
stateCreator initialized 2    (second load?? — this NEVER happens)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, we see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;th&gt;&lt;code&gt;funcInitializeCount&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RSC Rendering&lt;/td&gt;
&lt;td&gt;Server (RSC bundle)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSR&lt;/td&gt;
&lt;td&gt;Server (Client bundle)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser Load&lt;/td&gt;
&lt;td&gt;Browser (Client bundle)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three separate &lt;code&gt;1&lt;/code&gt;s. Three separate module instances. Three separate counters all starting from &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shared State Within the Same World
&lt;/h2&gt;

&lt;p&gt;While state &lt;strong&gt;cannot&lt;/strong&gt; cross the &lt;code&gt;"use client"&lt;/code&gt; boundary, it &lt;strong&gt;is&lt;/strong&gt; shared within the same module graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Components Share State
&lt;/h3&gt;

&lt;p&gt;If you visit &lt;code&gt;/a&lt;/code&gt; first (which calls &lt;code&gt;setCount(1)&lt;/code&gt;), then visit &lt;code&gt;/b&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Page B, 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Page B sees &lt;code&gt;count = 1&lt;/code&gt; even though it never called &lt;code&gt;setCount&lt;/code&gt;. Why? Because both &lt;code&gt;PageA&lt;/code&gt; and &lt;code&gt;PageB&lt;/code&gt; are Server Components in the &lt;strong&gt;same RSC module graph&lt;/strong&gt;. They share the same &lt;code&gt;state.ts&lt;/code&gt; module instance, so mutations from one are visible to the other.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; This is actually dangerous. Module-level mutable state in Server Components is shared across requests in production (since the server process persists). This can leak data between users. &lt;strong&gt;Never use module-level mutable state for user-specific data in Server Components.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Client Components Also Share State (in the Browser)
&lt;/h3&gt;

&lt;p&gt;In the browser, if you click "Increase" on one page's &lt;code&gt;ClientComp&lt;/code&gt;, then navigate (client-side) to another page, the other &lt;code&gt;ClientComp&lt;/code&gt; will see the updated count. They share the same browser-side module instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rendering Pipeline — Visual Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────────────┐
                    │     Your Source Code          │
                    │     store/state.ts            │
                    │     app/a/page.tsx            │
                    │     app/_components/          │
                    │       client-comp.tsx         │
                    └──────────────┬───────────────┘
                                   │
                         Next.js Build
                                   │
                    ┌──────────────┴───────────────┐
                    │                              │
              ┌─────▼─────┐                 ┌──────▼──────┐
              │  RSC       │                │  Client     │
              │  Bundle    │                │  Bundle     │
              │            │                │             │
              │ state.ts ① │                │ state.ts ②  │
              │ page-a.tsx │                │ client-     │
              │ page-b.tsx │                │  comp.tsx   │
              └─────┬──────┘                └──────┬──────┘
                    │                              │
          Phase 1: RSC                    Phase 2: SSR
          Render Server                   Render Client
          Components                      Components
          (count=0→1)                     (count=0)
                    │                              │
                    └──────────┬───────────────────┘
                               │
                         HTML + RSC Payload
                         sent to browser
                               │
                               ▼
                    ┌──────────────────────┐
                    │   Browser            │
                    │                      │
                    │   Phase 3: Load JS   │
                    │   state.ts ③         │
                    │   (count=0)          │
                    │                      │
                    │   Phase 4: Hydrate   │
                    │   count=0 matches    │
                    │   server HTML → ✅    │
                    └──────────────────────┘

  ①②③ = Three separate instances of the same module
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Golden Rule
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;"use client"&lt;/code&gt; boundary is not a rendering hint — it's a module graph split.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You cannot share runtime state across it. The only way to pass data from a Server Component to a Client Component is through &lt;strong&gt;serializable props&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrong Way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Server Component&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PageA&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;setCount&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="c1"&gt;// ❌ ClientComp will never see count = 1&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientComp&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Page A"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Server Component&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PageA&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getCountFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// or any server-side data&lt;/span&gt;
  &lt;span class="c1"&gt;// ✅ Pass it as a prop — the only bridge across the boundary&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientComp&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Page A"&lt;/span&gt; &lt;span class="na"&gt;initialCount&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Client Component&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ClientComp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialCount&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next.js creates separate module graphs&lt;/strong&gt; for Server Components and Client Components. Even if they import the same file, they get independent module instances with isolated state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;"use client"&lt;/code&gt; is a bundler boundary&lt;/strong&gt;, not just a rendering directive. It splits your dependency tree into two (or three) separate worlds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The RSC renderer never executes Client Components.&lt;/strong&gt; It serializes a reference with props and hands it off to the client bundle for SSR and hydration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSR and hydration use the same code but are separate executions.&lt;/strong&gt; The client bundle runs once on the server (for HTML) and once in the browser (for hydration). Each execution initializes module state fresh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No hydration error doesn't mean correct architecture.&lt;/strong&gt; Both SSR and the browser produce &lt;code&gt;count = 0&lt;/code&gt; independently — they match, so React is happy. But the data from your Server Component (&lt;code&gt;count = 1&lt;/code&gt;) was silently lost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Props are the only bridge&lt;/strong&gt; between Server and Client Components. Anything you compute or fetch on the server must be passed as serializable props to be visible on the client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mutable module-level state in Server Components is dangerous&lt;/strong&gt; — it persists across requests and can leak between users. Use it only for truly global, non-sensitive configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns" rel="noopener noreferrer"&gt;Next.js Docs — Server and Client Composition Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/building-your-application/rendering/client-components" rel="noopener noreferrer"&gt;Next.js Docs — Client Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react.dev/learn/passing-props-to-a-component" rel="noopener noreferrer"&gt;React Docs — Passing Props to a Component&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://overreacted.io/the-two-reacts/" rel="noopener noreferrer"&gt;Dan Abramov — The Two Reacts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I clone dev.to using React, Firebase, ChakraUI and more...</title>
      <dc:creator>Zwel👻</dc:creator>
      <pubDate>Wed, 01 Mar 2023 04:15:07 +0000</pubDate>
      <link>https://dev.to/zwelhtetyan/i-clone-devto-using-react-firebase-chakraui-and-more-1jk3</link>
      <guid>https://dev.to/zwelhtetyan/i-clone-devto-using-react-firebase-chakraui-and-more-1jk3</guid>
      <description>&lt;p&gt;&lt;a href="https://dev-community-clone.vercel.app/" rel="noopener noreferrer"&gt;click to preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/zwelhtetyan/dev-community" rel="noopener noreferrer"&gt;repo here&lt;/a&gt; &lt;code&gt;You could drop a star on my repo if you love it.&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I get an idea to clone dev.to 🤔
&lt;/h3&gt;

&lt;p&gt;At first, I intended to make a &lt;strong&gt;simple comment section&lt;/strong&gt; to practice &lt;strong&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;react&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;firebase&lt;/a&gt;&lt;/strong&gt;. But while searching some inspirations on google, I found dev.to and I decided to clone it. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Although I used &lt;a href="https://styled-components.com/" rel="noopener noreferrer"&gt;styled components&lt;/a&gt; for styling , I was too lazy to make some styles on my own , so I switched to &lt;a href="https://chakra-ui.com/" rel="noopener noreferrer"&gt;ChakraUI&lt;/a&gt; (A React UI component library).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;NOTE: Sorry for using the official logo and copying the random posts on dev.to&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features:
&lt;/h3&gt;

&lt;h3&gt;
  
  
  1. CRUD 🫠
&lt;/h3&gt;

&lt;p&gt;Users can &lt;strong&gt;create&lt;/strong&gt;, &lt;strong&gt;read&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt; and &lt;strong&gt;delete&lt;/strong&gt; an article.&lt;/p&gt;

&lt;p&gt;Even though all users can read all articles , only authenticated users can &lt;strong&gt;create&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt; and &lt;strong&gt;delete&lt;/strong&gt; article.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I prepared some tags with it's logo. So when you try to add tag in the editor it will show you tag suggesstions. The tag that I haven't prepared will start with &lt;code&gt;#&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&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%2F88ew081xj6eampybars4.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%2F88ew081xj6eampybars4.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://www.npmjs.com/package/react-mde" rel="noopener noreferrer"&gt;reactMDE&lt;/a&gt; for markdown editor. And I customized it's default style and added 2 custom commands.&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%2F0j7z52f9theso68039jm.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%2F0j7z52f9theso68039jm.png" alt=" " width="493" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first one inside red border is used for adding &lt;code&gt;code block&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By defaut, image command takes &lt;code&gt;photo url&lt;/code&gt; but I replace my second custom command inside red border to &lt;code&gt;upload local image&lt;/code&gt;. So if you want to add &lt;code&gt;photo url&lt;/code&gt;, you can cancel popup or using the syntax below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![img_description](image_url)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Saved all contents in localStorage when creating or editing article. So, Your contents will not be lost even if you reload the page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Social authentication 🔒
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;You can login with 4 options (&lt;em&gt;github&lt;/em&gt;, &lt;em&gt;twitter&lt;/em&gt;, &lt;em&gt;google&lt;/em&gt; and &lt;em&gt;facebook&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&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%2F1dbcil1ufbpm68mr4eiv.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%2F1dbcil1ufbpm68mr4eiv.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your username will be auto generated after login but you can change it in customize profile page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Giving reactions to articles ❤️‍🔥
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;(&lt;em&gt;heart&lt;/em&gt;, &lt;em&gt;unicorn&lt;/em&gt;, &lt;em&gt;save&lt;/em&gt; and &lt;em&gt;social share buttons&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&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%2Fk8vztf60st0hx0xtx5rg.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%2Fk8vztf60st0hx0xtx5rg.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All users can share the article but only authenticated users can react to the article by giving heart and unicorn. They can also save the article.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. User profile 👻
&lt;/h3&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%2Foifqe2krk30hggoq619z.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%2Foifqe2krk30hggoq619z.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Customize profile 🫣
&lt;/h3&gt;

&lt;p&gt;Customizing a personal profile with your data, website, social links and brand color.&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%2Fhu479hhut63x9dvs72vl.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%2Fhu479hhut63x9dvs72vl.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Dashboard 🫠
&lt;/h3&gt;

&lt;p&gt;You can manage your posts, drafts, following tags, followers and following users.&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%2Fvgun5urgesfdrq500rmb.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%2Fvgun5urgesfdrq500rmb.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can also pin the posts to your profile 📌&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7. Top tags 🏷
&lt;/h3&gt;

&lt;p&gt;It will display most used tags in every article and limit is 30 tags.&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%2F6l0695qe460j8tasswxn.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%2F6l0695qe460j8tasswxn.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can filter posts by tag or search by keyword.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also follow the tags and It will show the article related with the tags that you follow in the home page.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Comments and nested replies 💬
&lt;/h3&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%2Foe8wqeolnihqhmyzj0bg.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%2Foe8wqeolnihqhmyzj0bg.png" alt=" " width="523" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can add comments and also reply to other comments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  9. Edit comment
&lt;/h3&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%2Fbtro2v87t78byjeh27b5.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%2Fbtro2v87t78byjeh27b5.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Delete Comment
&lt;/h3&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%2F4h0e814gmdm254p4uzmc.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%2F4h0e814gmdm254p4uzmc.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Reading List 📚
&lt;/h3&gt;

&lt;p&gt;It will show your saved posts and archives.&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%2Fyo5vhmac9azcoag153q8.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%2Fyo5vhmac9azcoag153q8.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can filter your saved posts with specific tag or search by keyword.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  12. Apperance 🎨
&lt;/h3&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%2Ftkue7cgqkg7sz1o31q3g.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%2Ftkue7cgqkg7sz1o31q3g.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can change light and dark mode &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Tech Stacks:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://chakra-ui.com/" rel="noopener noreferrer"&gt;Chakra UI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://redux-toolkit.js.org/" rel="noopener noreferrer"&gt;Redux toolkit&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;React router&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/react-mde" rel="noopener noreferrer"&gt;React MDE&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I would love to hear your feedbacks and suggestions&lt;/em&gt; 🫡&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Feel free to test it out 🤗&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Thanks for your time 🤩&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Coding&lt;/strong&gt; 👩‍💻👨‍💻&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>firebase</category>
      <category>chakraui</category>
    </item>
  </channel>
</rss>
