<?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: OzmaKa</title>
    <description>The latest articles on DEV Community by OzmaKa (@ozma).</description>
    <link>https://dev.to/ozma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1439915%2Fa4f05559-c02c-4497-82e0-07e20f5193a5.jpg</url>
      <title>DEV Community: OzmaKa</title>
      <link>https://dev.to/ozma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ozma"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>OzmaKa</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:53:06 +0000</pubDate>
      <link>https://dev.to/ozma/-4gf1</link>
      <guid>https://dev.to/ozma/-4gf1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63" class="crayons-story__hidden-navigation-link"&gt;Static Analysis Told Me My React App Had a Problem. Runtime Profiling Told Me Which One&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="/ozma" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1439915%2Fa4f05559-c02c-4497-82e0-07e20f5193a5.jpg" alt="ozma profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ozma" class="crayons-story__secondary fw-medium m:hidden"&gt;
              OzmaKa
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                OzmaKa
                
                
              
              &lt;div id="story-author-preview-content-4385643" 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="/ozma" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1439915%2Fa4f05559-c02c-4497-82e0-07e20f5193a5.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;OzmaKa&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/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 13&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/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63" id="article-link-4385643"&gt;
          Static Analysis Told Me My React App Had a Problem. Runtime Profiling Told Me Which One
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&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/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&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/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63" 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/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&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;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Static Analysis Told Me My React App Had a Problem. Runtime Profiling Told Me Which One</title>
      <dc:creator>OzmaKa</dc:creator>
      <pubDate>Thu, 13 Aug 2026 07:45:27 +0000</pubDate>
      <link>https://dev.to/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63</link>
      <guid>https://dev.to/ozma/static-analysis-told-me-my-react-app-had-a-problem-runtime-profiling-told-me-which-one-4k63</guid>
      <description>&lt;p&gt;You open Lighthouse. Score isn't great! &lt;/p&gt;

&lt;p&gt;You open React DevTools. Components are re-rendering, a lot.&lt;/p&gt;

&lt;p&gt;You open the code. Inline functions, effects, prop chains, oversized components — any of them &lt;em&gt;could&lt;/em&gt; be the problem.&lt;/p&gt;

&lt;p&gt;So you guess. &lt;code&gt;React.memo()&lt;/code&gt; here. &lt;code&gt;useCallback()&lt;/code&gt; there. Move something into &lt;code&gt;useMemo()&lt;/code&gt;. Run it again.&lt;/p&gt;

&lt;p&gt;Did that fix anything? You genuinely don't know. You just made a change and hoped.&lt;/p&gt;

&lt;p&gt;That loop is what pushed me to build &lt;strong&gt;React Doctor&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual gap
&lt;/h2&gt;

&lt;p&gt;Lighthouse, React DevTools, and static analyzers are all good at their jobs. The problem is they don't talk to each other.&lt;/p&gt;

&lt;p&gt;A static analyzer sees this and flags it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProductList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;products&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="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="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;products&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;product&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProductCard&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;product&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onSelect&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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="nf"&gt;selectProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;gt;&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;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;"Inline function in render." Fine — but that's true of thousands of components that never cause a problem. The linter has no idea if this component renders twice a session or two hundred times while someone types in a search box. It's a pattern match, not a diagnosis.&lt;/p&gt;

&lt;h2&gt;
  
  
  What React Doctor does differently
&lt;/h2&gt;

&lt;p&gt;Two passes, correlated:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static pass&lt;/strong&gt; — Babel AST analysis over your JSX/TSX. Inline functions, missing memo opportunities, prop drilling, effect issues, missing keys, dead code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime pass&lt;/strong&gt; — launches your app in a real browser via Puppeteer and profiles it. LCP, FCP, CLS, INP, TTFB, plus React commit durations and actual render counts per component.&lt;/p&gt;

&lt;p&gt;A rule engine then cross-references the two. A flagged pattern that never fires at runtime gets deprioritized. A flagged pattern sitting in a component that re-rendered dozens of times during a short session gets surfaced first.&lt;/p&gt;

&lt;p&gt;Here's what that looks like on a real flagged component — condensed output from a repo with a search input wired directly to a filtered list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠ HIGH PRIORITY — src/components/ProductList.jsx:8

  Static finding:
    Inline arrow function passed as onSelect prop (line 12)

  Runtime evidence:
    Component subtree re-rendered 47 times during 12s session
    Avg commit duration: 4.2ms | Total: 197ms
    Re-renders correlate with parent state updates (searchQuery)

  Diagnosis:
    The inline callback creates a new function reference on every
    parent render. ProductCard is not memoized, so it re-renders
    on every keystroke in the search input regardless of whether
    its own props changed.

  Suggested fix:
    Wrap the callback in useCallback, and wrap ProductCard in
    React.memo. Given the render count, this should meaningfully
    reduce work during typing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the difference. Not "this pattern looks bad," but "this pattern looks bad &lt;em&gt;and here's the runtime proof it's costing you something.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;The same logic holds for &lt;code&gt;React.memo()&lt;/code&gt; calls, oversized-component warnings, and most other static suggestions — a 300-line component that renders once on mount costs nothing; a 40-line component re-rendering 60 times a second is the actual fire. React Doctor prioritizes based on what a component actually did while your app was running, not its line count.&lt;/p&gt;

&lt;h2&gt;
  
  
  It also answers the question Lighthouse can't
&lt;/h2&gt;

&lt;p&gt;Lighthouse gives you &lt;code&gt;INP: 280ms&lt;/code&gt; and stops there. It can't tell you if that's from an oversized component, a runaway effect, excessive re-renders, or bloated DOM. You're still guessing which part of your &lt;em&gt;React&lt;/em&gt; code to open first. React Doctor's job is that next step — pointing at the actual component and the actual reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; react-doctor-cli-dev
react-doctor full ./my-app &lt;span class="nt"&gt;--upload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/softar-dev/React_Doctor" rel="noopener noreferrer"&gt;https://github.com/softar-dev/React_Doctor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/react-doctor-cli-dev" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/react-doctor-cli-dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://react-doctor-cli.web.app" rel="noopener noreferrer"&gt;https://react-doctor-cli.web.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's early and open source — issues, stars, and "this broke on my codebase" reports all genuinely help, don't hesitate to give a feedback 💻☕&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Curious how others handle this&lt;/strong&gt;: when Lighthouse or DevTools flags something, how do you decide if it's &lt;em&gt;actually&lt;/em&gt; worth fixing versus noise? Combination of tools, gut feeling, something else?&lt;/p&gt;

</description>
      <category>react</category>
      <category>opensource</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a React Performance Analyzer Because Lighthouse Wasn't Telling Me Why</title>
      <dc:creator>OzmaKa</dc:creator>
      <pubDate>Sun, 09 Aug 2026 16:23:46 +0000</pubDate>
      <link>https://dev.to/ozma/i-built-a-react-performance-analyzer-because-lighthouse-wasnt-telling-me-why-3pal</link>
      <guid>https://dev.to/ozma/i-built-a-react-performance-analyzer-because-lighthouse-wasnt-telling-me-why-3pal</guid>
      <description>&lt;p&gt;I was working on a React project when I ran into a performance problem.&lt;/p&gt;

&lt;p&gt;The application worked.&lt;/p&gt;

&lt;p&gt;The Lighthouse score wasn't terrible.&lt;/p&gt;

&lt;p&gt;But something still felt wrong.&lt;/p&gt;

&lt;p&gt;Some interactions felt sluggish. Components were rendering more than I expected. And whenever I found a performance problem, I had the same question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this happening?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lighthouse is great at telling us about the performance of a web page — Core Web Vitals, network requests, resource sizes, loading performance, and more.&lt;/p&gt;

&lt;p&gt;But when you're debugging a React application, sometimes you need to go deeper.&lt;/p&gt;

&lt;p&gt;You need to know what is happening &lt;strong&gt;inside React&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's what led me to build &lt;strong&gt;React Doctor&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;I wanted a tool that could combine two different perspectives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the code look like?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happens when the application runs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built React Doctor as a CLI-based React performance analysis tool that combines &lt;strong&gt;static code analysis&lt;/strong&gt; with &lt;strong&gt;runtime profiling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace Lighthouse.&lt;/p&gt;

&lt;p&gt;It's to answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What in my React application is contributing to the performance problem?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How React Doctor Works
&lt;/h2&gt;

&lt;p&gt;The analysis pipeline combines several stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React project
     ↓
File Scanner
     ↓
Static Analyzer
     ↓
Runtime Profiler
     ↓
Rule Engine
     ↓
Report Compiler
     ↓
Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Static Analysis
&lt;/h3&gt;

&lt;p&gt;React Doctor analyzes JSX/TSX code using AST-based analysis.&lt;/p&gt;

&lt;p&gt;It can identify patterns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unnecessary console logs&lt;/li&gt;
&lt;li&gt;potentially expensive component structures&lt;/li&gt;
&lt;li&gt;inline functions and other patterns that can contribute to unnecessary work&lt;/li&gt;
&lt;li&gt;oversized components&lt;/li&gt;
&lt;li&gt;other React-related code smells&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This happens without needing to wait for the application to run.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Runtime Profiling
&lt;/h3&gt;

&lt;p&gt;Static analysis isn't enough.&lt;/p&gt;

&lt;p&gt;A pattern in the source code doesn't automatically mean that it causes a real performance problem.&lt;/p&gt;

&lt;p&gt;So React Doctor also launches the application in a real browser environment and collects runtime information.&lt;/p&gt;

&lt;p&gt;It can capture metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LCP&lt;/li&gt;
&lt;li&gt;FCP&lt;/li&gt;
&lt;li&gt;CLS&lt;/li&gt;
&lt;li&gt;INP&lt;/li&gt;
&lt;li&gt;TTFB&lt;/li&gt;
&lt;li&gt;render/commit timing&lt;/li&gt;
&lt;li&gt;component re-render information&lt;/li&gt;
&lt;li&gt;screenshots at important moments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The profiler can also test under different device and network conditions to make performance problems easier to reproduce.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Combining the Two
&lt;/h3&gt;

&lt;p&gt;This is the part I found most interesting.&lt;/p&gt;

&lt;p&gt;A static warning by itself doesn't always mean much.&lt;/p&gt;

&lt;p&gt;A runtime problem by itself doesn't always tell you where to look.&lt;/p&gt;

&lt;p&gt;But combining them can provide much more useful context.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Static analysis:
A component contains a potentially expensive render pattern.

Runtime:
The component is rendering repeatedly during interaction.

Result:
This pattern may be contributing to unnecessary work.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of simply saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Your application is slow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the goal is to help answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What is happening, where is it happening, and what should I investigate?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The CLI
&lt;/h2&gt;

&lt;p&gt;React Doctor is available on npm under:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;react-doctor-cli-dev&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can run it with &lt;code&gt;npx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx react-doctor-cli-dev full ./my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install it globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; react-doctor-cli-dev

react-doctor full ./my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI currently provides commands for different types of analysis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;react-doctor full ./my-app
react-doctor analyze ./my-app
react-doctor profile ./my-app
react-doctor dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;full&lt;/code&gt; command runs the complete analysis pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Report Looks Like
&lt;/h2&gt;

&lt;p&gt;The output is designed to be more useful than a list of warnings.&lt;/p&gt;

&lt;p&gt;For each detected issue, the report can provide information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the affected file&lt;/li&gt;
&lt;li&gt;the relevant component&lt;/li&gt;
&lt;li&gt;what was detected&lt;/li&gt;
&lt;li&gt;why it may matter&lt;/li&gt;
&lt;li&gt;supporting runtime information&lt;/li&gt;
&lt;li&gt;suggestions for investigation or improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also generates structured report data that can be consumed by the dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not Just Use Lighthouse?
&lt;/h2&gt;

&lt;p&gt;Because I don't think this is an either/or situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lighthouse is extremely useful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It tells you a lot about how your page performs from the browser and web-platform perspective.&lt;/p&gt;

&lt;p&gt;React Doctor is focused on a different layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Web Performance
                       │
        ┌──────────────┴──────────────┐
        │                             │
   Browser/Web                   React/Application
   perspective                    perspective
        │                             │
    Lighthouse                  React Doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lighthouse can tell you that your LCP is slow.&lt;/p&gt;

&lt;p&gt;React Doctor is intended to help you investigate what is happening in the React application that may be contributing to that experience.&lt;/p&gt;

&lt;p&gt;They're complementary tools, not competitors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building It as a Graduation Project
&lt;/h2&gt;

&lt;p&gt;React Doctor started from a real performance problem I encountered while working on another project.&lt;/p&gt;

&lt;p&gt;I began developing the idea around &lt;strong&gt;October 2025&lt;/strong&gt;, and eventually turned it into my final-year Software Engineering graduation project.&lt;/p&gt;

&lt;p&gt;I built it with my teammate as a full project rather than just a proof of concept.&lt;/p&gt;

&lt;p&gt;The stack ended up including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Babel AST&lt;/li&gt;
&lt;li&gt;Puppeteer&lt;/li&gt;
&lt;li&gt;web-vitals&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is structured as a monorepo and contains the CLI, analysis pipeline, profiling system, backend, and dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  And Then I Published It
&lt;/h2&gt;

&lt;p&gt;After finishing the project, I decided not to leave it sitting in a university repository.&lt;/p&gt;

&lt;p&gt;I published the CLI to npm under the name:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;react-doctor-cli-dev&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since publishing it, the package has passed &lt;strong&gt;3,600+ npm downloads in about two months&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a project that started as a performance problem I encountered while building something else, seeing people actually install it has been one of the most rewarding parts of the project.&lt;/p&gt;

&lt;p&gt;It has also given me a lot of feedback about what developers actually want from a tool like this.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. Performance Problems Aren't Always Obvious
&lt;/h3&gt;

&lt;p&gt;A page can have a respectable Lighthouse score and still feel bad during interaction.&lt;/p&gt;

&lt;p&gt;Performance isn't just one number.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Static Analysis and Runtime Analysis Complement Each Other
&lt;/h3&gt;

&lt;p&gt;Static analysis can tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This pattern exists."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Runtime profiling can tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is what actually happened."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neither tells the complete story by itself.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Developer Tools Need Context
&lt;/h3&gt;

&lt;p&gt;A warning isn't very useful if the developer doesn't know what to do with it.&lt;/p&gt;

&lt;p&gt;One of the things I focused on was making the results understandable instead of simply dumping raw metrics and AST findings.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Building Something People Can Actually Install Is Different
&lt;/h3&gt;

&lt;p&gt;Publishing the project to npm changed the way I think about software projects.&lt;/p&gt;

&lt;p&gt;A graduation project can end when you submit it.&lt;/p&gt;

&lt;p&gt;An open-source tool doesn't.&lt;/p&gt;

&lt;p&gt;Once other developers start installing it, you suddenly have to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installation&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;compatibility&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;package size&lt;/li&gt;
&lt;li&gt;CLI UX&lt;/li&gt;
&lt;li&gt;releases&lt;/li&gt;
&lt;li&gt;feedback&lt;/li&gt;
&lt;li&gt;actual developer workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That has probably been one of the most valuable parts of the experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;There are several things I want to explore next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions / CI integration&lt;/li&gt;
&lt;li&gt;performance budgets&lt;/li&gt;
&lt;li&gt;regression detection&lt;/li&gt;
&lt;li&gt;better reporting&lt;/li&gt;
&lt;li&gt;custom rules&lt;/li&gt;
&lt;li&gt;improved runtime analysis&lt;/li&gt;
&lt;li&gt;better developer workflows around performance debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is still evolving, and I'm especially interested in hearing from developers who have dealt with difficult React performance problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  I'd Love Your Feedback
&lt;/h2&gt;

&lt;p&gt;If you work with React:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What performance problems do you usually struggle to diagnose?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unnecessary re-renders?&lt;/li&gt;
&lt;li&gt;slow interactions?&lt;/li&gt;
&lt;li&gt;large components?&lt;/li&gt;
&lt;li&gt;state management?&lt;/li&gt;
&lt;li&gt;expensive computations?&lt;/li&gt;
&lt;li&gt;bundle size?&lt;/li&gt;
&lt;li&gt;something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more importantly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you want a React performance tool to tell you that your current tools don't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd genuinely like to hear about real problems you've encountered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try React Doctor
&lt;/h2&gt;

&lt;p&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/softar-dev/React_Doctor" rel="noopener noreferrer"&gt;https://github.com/softar-dev/React_Doctor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;npm:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-doctor-cli-dev" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/react-doctor-cli-dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://react-doctor-cli.web.app" rel="noopener noreferrer"&gt;https://react-doctor-cli.web.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👨‍💻 My Portfolio:&lt;br&gt;
&lt;a href="https://oussamah-kabalan.netlify.app" rel="noopener noreferrer"&gt;https://oussamah-kabalan.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, I'd love to hear what you find — especially if the analysis catches something you weren't expecting.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;React Doctor is an open-source React performance analysis project built as my Software Engineering graduation project.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>performance</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
