<?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: GOWTHAM</title>
    <description>The latest articles on DEV Community by GOWTHAM (@gowtham-balashanmugam).</description>
    <link>https://dev.to/gowtham-balashanmugam</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%2F14387%2F6638f552-2f09-4680-9b44-f33b3fc8c643.jpg</url>
      <title>DEV Community: GOWTHAM</title>
      <link>https://dev.to/gowtham-balashanmugam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gowtham-balashanmugam"/>
    <language>en</language>
    <item>
      <title>I Built an APM for Angular That Runs Entirely in Your Browser</title>
      <dc:creator>GOWTHAM</dc:creator>
      <pubDate>Wed, 05 Aug 2026 12:43:46 +0000</pubDate>
      <link>https://dev.to/gowtham-balashanmugam/i-built-an-apm-for-angular-that-runs-entirely-in-your-browser-5c3b</link>
      <guid>https://dev.to/gowtham-balashanmugam/i-built-an-apm-for-angular-that-runs-entirely-in-your-browser-5c3b</guid>
      <description>&lt;h2&gt;
  
  
  Every Angular Developer Asks This
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foz7ibxbgjoe1wmm8g6df.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foz7ibxbgjoe1wmm8g6df.png" alt="Every Angular developer asks..." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Why is my page taking 8 seconds to load?"&lt;br&gt;
"Which component is re-rendering 30 times?"&lt;br&gt;
"Is this API call redundant?"&lt;br&gt;
"Why did this click freeze the UI?"&lt;/p&gt;

&lt;p&gt;Angular DevTools shows you components. &lt;strong&gt;ngLens shows you the WHY.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What is ngLens?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lf4pa62trw201mhdfx9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lf4pa62trw201mhdfx9.png" alt="ngLens — See what Angular doesn't show you" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ngLens is a Chrome DevTools extension that acts as an &lt;strong&gt;Execution Intelligence Platform&lt;/strong&gt; for Angular. Think APM — but it runs entirely in your browser, requires zero configuration, and never sends data anywhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works with &lt;strong&gt;Angular 14–22&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Performance overhead: &lt;strong&gt;&amp;lt; 3% CPU&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Setup: &lt;strong&gt;Install → Open DevTools → Done&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  How It's Different
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0siee5r7jcmdj6n9hmbq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0siee5r7jcmdj6n9hmbq.png" alt="ngLens vs Angular DevTools" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Angular DevTools gives you a component tree. ngLens gives you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Angular DevTools&lt;/th&gt;
&lt;th&gt;ngLens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component tree&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WHY it rendered&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Waterfall timeline&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API → Store → Component chain&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory leak detection&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact scoring&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Targeted fix per component&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal tracking (computed, input)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate API detection&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jank detection (frame drops)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Your App's Health at a Glance
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzvn552ui2uwmkh2ibls5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzvn552ui2uwmkh2ibls5.png" alt="Overview Tab — health at a glance" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open ngLens, and in seconds you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Risk score&lt;/strong&gt; (0–100) per component&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top issue&lt;/strong&gt; with root cause&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggested fix&lt;/strong&gt; with expected gain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory risks&lt;/strong&gt; flagged immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment detection&lt;/strong&gt; (production/dev mode)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No digging through flame graphs. No guessing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Execution Explorer — See WHEN Things Happened
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8gn1m84nqb6817h7x4j0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8gn1m84nqb6817h7x4j0.png" alt="Execution Explorer waterfall timeline" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A horizontal waterfall timeline — like Chrome's Network tab, but for your Angular app's internal execution flow.&lt;/p&gt;

&lt;p&gt;See exactly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When each component rendered relative to others&lt;/li&gt;
&lt;li&gt;Which API call is the bottleneck (highlighted automatically)&lt;/li&gt;
&lt;li&gt;How long each operation actually took&lt;/li&gt;
&lt;li&gt;The critical path through your app's execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the example above, &lt;code&gt;POST /api/orders/search&lt;/code&gt; takes 4.67s — that's 55% of total time. You'd know exactly where to optimize.&lt;/p&gt;


&lt;h2&gt;
  
  
  Render Inspector — Component Cascade + Data Flow
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft6n49wql4vwwhoeyxt10.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft6n49wql4vwwhoeyxt10.png" alt="Render Inspector — Component Cascade" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See which components rendered, how many times, and trace the data flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Component Cascade&lt;/strong&gt; — Ranked by render count and time cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Flow&lt;/strong&gt; — Which API/store action triggered each render&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hotspot indicator&lt;/strong&gt; — The worst offender highlighted immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action-level breakdown&lt;/strong&gt; — Click, Change, Input events separated&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Causal Chains — Which API Affected Which Component
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynkxdxcardqubd72czlq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynkxdxcardqubd72czlq.png" alt="Causal chains — API to component mapping" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the feature that saves hours of debugging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/users → 200 → [AUTH] SET_USER → 3 components
POST /api/orders/search → 200 → [ORDERS] SET_LIST → 5 components
GET /api/notifications → 200 → [NOTIFY] UPDATE → (duplicate flagged!)
[FILTERS] SET_ACTIVE → [FILTERS] SET_RESULTS +2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ngLens automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links API calls to store actions to component renders&lt;/li&gt;
&lt;li&gt;Flags duplicate APIs&lt;/li&gt;
&lt;li&gt;Counts impacted components per action&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Detect Leaks. Get Actionable Fixes.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqou22cbz6b94460srnl6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqou22cbz6b94460srnl6.png" alt="Memory leaks and recommendations" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Leaks detected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;UserService.notifications$&lt;/code&gt; — Subscribed in DashboardComponent, never unsubscribed after destroy → Fix: &lt;code&gt;takeUntilDestroyed()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setInterval in PollingService&lt;/code&gt; — Created every 5s, never cleared → Fix: &lt;code&gt;clearInterval in ngOnDestroy()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommendations prioritized by impact:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 HIGH — Add OnPush to DataGridComponent (saves ~300ms per interaction)&lt;/li&gt;
&lt;li&gt;🟡 MED — Add trackBy to OrderListComponent (50 items re-created every update)&lt;/li&gt;
&lt;li&gt;🟢 LOW — Zone pollution: WebSocket in ChatService → Move to &lt;code&gt;runOutsideAngular()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Full Signal Reactivity Tracking
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ra0fapvqr8z8eh1uy56.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ra0fapvqr8z8eh1uy56.png" alt="Signal tracking — Angular 17-22" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ngLens captures the full signal chain across Angular versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular ≤ 16&lt;/strong&gt; — RxJS subjects, HTTP, timers, Router&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular 17+&lt;/strong&gt; — &lt;code&gt;computed()&lt;/code&gt; recomputation, &lt;code&gt;input()&lt;/code&gt; signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular 19+&lt;/strong&gt; — &lt;code&gt;linkedSignal()&lt;/code&gt;, &lt;code&gt;resource()&lt;/code&gt;, &lt;code&gt;httpResource()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular 22&lt;/strong&gt; — Signal Forms, &lt;code&gt;@Service()&lt;/code&gt;, all stable signal APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example traced chain:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;DashboardComponent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greeting &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;DashboardComponent&lt;/span&gt; &lt;span class="nx"&gt;rendered&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hotspots + Compare Runs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hjimzqomnm37iq306k9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hjimzqomnm37iq306k9.png" alt="Hotspots and Compare Runs" width="799" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save a baseline → Make your fix → Capture again → &lt;strong&gt;See the improvement instantly.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Render count&lt;/td&gt;
&lt;td&gt;156&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-73%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg render cost&lt;/td&gt;
&lt;td&gt;4.2ms&lt;/td&gt;
&lt;td&gt;1.8ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-57%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Render frequency&lt;/td&gt;
&lt;td&gt;4.2x&lt;/td&gt;
&lt;td&gt;1.1x&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-74%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory risks&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Privacy &amp;amp; Security
&lt;/h2&gt;

&lt;p&gt;This was non-negotiable from day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ All analysis runs &lt;strong&gt;locally in your browser&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Source code and results &lt;strong&gt;never leave your machine&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Minimal permissions&lt;/strong&gt; — only &lt;code&gt;activeTab&lt;/code&gt;, &lt;code&gt;scripting&lt;/code&gt;, &lt;code&gt;tabs&lt;/code&gt;, &lt;code&gt;storage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Strict Content Security Policy&lt;/li&gt;
&lt;li&gt;✅ Optional analytics require &lt;strong&gt;explicit opt-in&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ MIT License — fully open source and auditable&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;&lt;strong&gt;Install from Chrome Web Store:&lt;/strong&gt;&lt;br&gt;
🔗 &lt;a href="https://chromewebstore.google.com/detail/nglens/jnbjmoficlaclcpgdoajofbhmcjjhgin" rel="noopener noreferrer"&gt;Install ngLens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or build from source:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/patch-work-book/nglens.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nglens
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;span class="c"&gt;# Load dist/ as unpacked extension in chrome://extensions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/patch-work-book" rel="noopener noreferrer"&gt;
        patch-work-book
      &lt;/a&gt; / &lt;a href="https://github.com/patch-work-book/nglens" rel="noopener noreferrer"&gt;
        nglens
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ngLens&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Find Angular performance problems and learn how to fix them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ngLens is a Chrome Extension that analyzes Angular applications at runtime, identifies performance issues, and teaches you how to fix them — whether you're a junior developer learning Angular or a senior architect optimizing at scale.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features (V1)&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular Compatibility&lt;/strong&gt; — Runtime tracking supports Angular 17-21; Angular 21 has a dedicated smoke check&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular Detection&lt;/strong&gt; — Automatically detects Angular apps in both development and production mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Detection Analysis&lt;/strong&gt; — Flags Default change detection, missing &lt;code&gt;OnPush&lt;/code&gt;, and &lt;code&gt;*ngFor&lt;/code&gt; without &lt;code&gt;trackBy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unnecessary Re-render Detection&lt;/strong&gt; — Identifies excessive DOM mutation frequency, render bottlenecks, and template anti-patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Cleanup Risk Detection&lt;/strong&gt; — Flags possible surviving subscriptions, unmanaged timers, and DOM listeners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RxJS Subscription Cleanup Detector&lt;/strong&gt; — Detects subscriptions without observed cleanup and recommends &lt;code&gt;takeUntil&lt;/code&gt;, &lt;code&gt;takeUntilDestroyed&lt;/code&gt;, or &lt;code&gt;async&lt;/code&gt; pipe usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle/Lazy-loading Guidance&lt;/strong&gt; — Highlights initial load risk areas and lazy…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/patch-work-book/nglens" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V2&lt;/strong&gt;: CD profiler, Zone.js profiler, FPS monitor, interaction latency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V3&lt;/strong&gt;: Architecture smells, regression detection, Signals migration assistant&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Angular DevTools shows you components. ngLens shows you the &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Give it 30 seconds. That's all it needs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found a bug or have feedback? &lt;a href="https://github.com/patch-work-book/nglens/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt; — I read every one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>performance</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
