<?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>Forem: Mayuri Jha</title>
    <description>The latest articles on Forem by Mayuri Jha (@mayuri_jha_bc0b497f737276).</description>
    <link>https://forem.com/mayuri_jha_bc0b497f737276</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%2F2431938%2F21b83fe0-b49a-409e-94df-7beefd40882e.jpeg</url>
      <title>Forem: Mayuri Jha</title>
      <link>https://forem.com/mayuri_jha_bc0b497f737276</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mayuri_jha_bc0b497f737276"/>
    <language>en</language>
    <item>
      <title>The Frontend works.. until it doesn't</title>
      <dc:creator>Mayuri Jha</dc:creator>
      <pubDate>Mon, 23 Mar 2026 06:12:08 +0000</pubDate>
      <link>https://forem.com/mayuri_jha_bc0b497f737276/the-frontend-works-until-it-doesnt-42j9</link>
      <guid>https://forem.com/mayuri_jha_bc0b497f737276/the-frontend-works-until-it-doesnt-42j9</guid>
      <description>&lt;h2&gt;
  
  
  Your UI looks Perfect… Until it meets real users
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Real-World Data Taught Me About Building Resilient Frontends
&lt;/h3&gt;

&lt;p&gt;Design files are clean.&lt;br&gt;
Components are reusable.&lt;br&gt;
Everything aligns perfectly.&lt;/p&gt;

&lt;p&gt;And still — things break.&lt;/p&gt;

&lt;p&gt;Not because the code is bad.&lt;br&gt;
Not because the implementation is careless.&lt;/p&gt;

&lt;p&gt;But because the system was built around &lt;strong&gt;assumptions that don’t hold in production&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Quick Context
&lt;/h2&gt;

&lt;p&gt;These scenarios come from issues I’ve &lt;strong&gt;recently encountered while building UI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The implementations were solid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;components were well-structured&lt;/li&gt;
&lt;li&gt;states were handled&lt;/li&gt;
&lt;li&gt;layouts matched design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything worked — &lt;strong&gt;for the expected data and expected environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But production doesn’t operate on expectations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It operates on variability.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  A Pattern I Keep Noticing
&lt;/h2&gt;

&lt;p&gt;Across multiple UI issues, one pattern kept repeating:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Happy Path Bias&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We design and build for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expected data&lt;/li&gt;
&lt;li&gt;expected layouts&lt;/li&gt;
&lt;li&gt;expected timing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But real systems behave differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data is incomplete or malformed&lt;/li&gt;
&lt;li&gt;layouts are stressed beyond design assumptions&lt;/li&gt;
&lt;li&gt;rendering is asynchronous and unpredictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most frontend bugs don’t come from logic errors.&lt;/p&gt;

&lt;p&gt;They come from the &lt;strong&gt;gap between ideal conditions and real-world variability&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Scenario 1: Product Title Overflow
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Titles will fit within design constraints&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Content expands beyond expected bounds and starts influencing layout.&lt;/p&gt;
&lt;h3&gt;
  
  
  Failure Mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Layout shifts&lt;/li&gt;
&lt;li&gt;Adjacent components lose alignment&lt;/li&gt;
&lt;li&gt;Vertical rhythm breaks&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.product-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;-webkit-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-line-clamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-box-orient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vertical&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&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;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;This isn’t just about truncation.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;containing variability so it doesn’t propagate through the layout&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Scenario 2: “+X More” — A Simple Pattern That Isn’t
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Show first 3 items, collapse the rest&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Items vary in length&lt;/li&gt;
&lt;li&gt;Layout wraps inconsistently&lt;/li&gt;
&lt;li&gt;Edge cases emerge at boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Failure Mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visual inconsistency&lt;/li&gt;
&lt;li&gt;Logic tied to layout behavior&lt;/li&gt;
&lt;li&gt;Unpredictable rendering&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;maxVisible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;visibleItems&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isExpanded&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxVisible&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;hiddenCount&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="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxVisible&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;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;This shifts the system from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;layout-driven behavior&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;deterministic state-driven behavior&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Scenario 3: Skeleton Loaders That Break UX
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Any loading shimmer improves UX&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;If skeletons don’t match structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;layout shifts when content loads&lt;/li&gt;
&lt;li&gt;perceived performance degrades&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.skeleton-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.skeleton-chip&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;Skeletons are not placeholders.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;contracts for layout stability&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Scenario 4: ExpressionChangedAfterItHasBeenCheckedError
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;UI updates naturally when data arrives&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Angular enforces a strict rendering contract.&lt;/p&gt;

&lt;p&gt;When violated, it exposes instability.&lt;/p&gt;


&lt;h3&gt;
  
  
  Failure Mode
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExpressionChangedAfterItHasBeenCheckedError
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"product"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{ product.name }}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{{ product$ | async }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;This is not just an Angular quirk.&lt;/p&gt;

&lt;p&gt;It highlights a deeper principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rendering must be predictable within a given cycle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Scenario 5: Resize Logic That Lies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Screen size determines layout&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Viewport ≠ device size&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browser not maximized&lt;/li&gt;
&lt;li&gt;dev tools open&lt;/li&gt;
&lt;li&gt;split-screen usage&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HostListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;window:resize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;onResize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isCompact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerWidth&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1280&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;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;Responsive systems should react to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;available space, not theoretical capacity&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Scenario 6: Missing or Null Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;API contracts are reliable&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Data is often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incomplete&lt;/li&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;li&gt;inconsistent&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{{ product?.name || '—' }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;Frontend is not just a rendering layer.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;resilience layer over imperfect systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scenario 7: Button Alignment Drift
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Buttons will naturally stay aligned regardless of content&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Content is not uniform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some cards have more text&lt;/li&gt;
&lt;li&gt;Some have shorter descriptions&lt;/li&gt;
&lt;li&gt;Heights vary dynamically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly:&lt;/p&gt;

&lt;p&gt;👉 Buttons no longer align across cards&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%2Fyw3chkub4rfaia0f9nhz.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%2Fyw3chkub4rfaia0f9nhz.png" alt="Button misalignment" width="380" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ What breaks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Inconsistent vertical alignment of CTAs&lt;/li&gt;
&lt;li&gt;Poor scannability across items&lt;/li&gt;
&lt;li&gt;Visual hierarchy feels off&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ Fix
&lt;/h3&gt;

&lt;p&gt;The solution is not about the button itself — it’s about the &lt;strong&gt;layout structure&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  HTML
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- dynamic content --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;Add to Cart&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CSS
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.actions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.actions&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;44px&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;h3&gt;
  
  
  💡 Insight
&lt;/h3&gt;

&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content takes natural space&lt;/li&gt;
&lt;li&gt;Actions are always pushed to the bottom&lt;/li&gt;
&lt;li&gt;All buttons align consistently across cards&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 Deeper Principle
&lt;/h3&gt;

&lt;p&gt;This is not just a styling fix.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;decoupling layout stability from content variability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of letting content dictate layout:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We design layouts that remain stable &lt;em&gt;despite&lt;/em&gt; content differences&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Scenario 8: Async + Partial Rendering
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assumption
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Data arrives as a complete unit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reality
&lt;/h3&gt;

&lt;p&gt;Rendering is incremental.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"product; else loading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- content --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;#loading&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- skeleton --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Insight
&lt;/h3&gt;

&lt;p&gt;UI should be designed as a set of states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loading&lt;/li&gt;
&lt;li&gt;partial&lt;/li&gt;
&lt;li&gt;complete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not a single static snapshot.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Really Points To
&lt;/h2&gt;

&lt;p&gt;All of these scenarios are symptoms of the same underlying issue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We design systems around &lt;strong&gt;ideal inputs&lt;/strong&gt;, but run them in &lt;strong&gt;non-ideal environments&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Shift in Thinking
&lt;/h2&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Does this work?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A more useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What happens when assumptions fail?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Principles I Now Default To
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat all external data as unreliable&lt;/li&gt;
&lt;li&gt;Design for extremes, not averages&lt;/li&gt;
&lt;li&gt;Prefer deterministic rendering over implicit behavior&lt;/li&gt;
&lt;li&gt;Build UI as a system of states, not static screens&lt;/li&gt;
&lt;li&gt;Contain variability instead of letting it propagate&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Frontend engineering was never just about building interfaces.&lt;/p&gt;

&lt;p&gt;But that realisation doesn’t come all at once — it builds gradually, through real-world scenarios and edge cases.&lt;/p&gt;

&lt;p&gt;A significant amount of analytical and future-proof thinking goes into frontend systems. When engineered well, they don’t just render data — they absorb inconsistencies, handle unpredictability, and even mask underlying data flaws.&lt;/p&gt;

&lt;p&gt;And this is just the surface.&lt;/p&gt;

&lt;p&gt;There are countless such scenarios, many of which only emerge after long hours of building, debugging, and reflecting on how systems behave under real-world conditions.&lt;/p&gt;

&lt;p&gt;Because in production:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Variability is the only constant.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;These observations come from recent hands-on work where well-built components still failed under real-world conditions — not due to lack of effort, but due to assumptions that didn’t scale beyond the happy path.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>ui</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Are We Over-Engineering Frontend Applications?</title>
      <dc:creator>Mayuri Jha</dc:creator>
      <pubDate>Thu, 12 Mar 2026 11:51:54 +0000</pubDate>
      <link>https://forem.com/mayuri_jha_bc0b497f737276/are-we-over-engineering-frontend-applications-3dmi</link>
      <guid>https://forem.com/mayuri_jha_bc0b497f737276/are-we-over-engineering-frontend-applications-3dmi</guid>
      <description>&lt;p&gt;Frontend development didn’t become complex overnight.&lt;/p&gt;

&lt;p&gt;A decade ago, building a web interface mostly meant writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As applications grew more interactive, frameworks emerged to structure UI logic and improve maintainability.&lt;/p&gt;

&lt;p&gt;Then came build tooling like Webpack to manage modules and optimize assets. Over time, frameworks began bundling these tools into their own ecosystems.&lt;/p&gt;

&lt;p&gt;As applications continued to scale, additional layers followed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;routing libraries&lt;/li&gt;
&lt;li&gt;state management tools&lt;/li&gt;
&lt;li&gt;testing frameworks&lt;/li&gt;
&lt;li&gt;server-side rendering&lt;/li&gt;
&lt;li&gt;CI/CD pipelines and automated deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A visual of Frontend stack evolution below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpm3rtb0xmpvwzhoihrpt.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%2Fpm3rtb0xmpvwzhoihrpt.png" alt="Frontend stack evolution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each addition solved a real problem.&lt;/p&gt;

&lt;p&gt;But together, they also raise an important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have we slowly built a stack that is more complex than most applications actually need?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes all of this is used to build something surprisingly simple.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;dashboard with a few forms and API calls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are we solving real problems, or are we adding complexity because the ecosystem encourages it?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Over-Engineering Looks Like in Modern Frontend
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Complex State Management for Simple State
&lt;/h3&gt;

&lt;p&gt;Consider this example.&lt;/p&gt;

&lt;p&gt;We introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redux / NgRx&lt;/li&gt;
&lt;li&gt;actions&lt;/li&gt;
&lt;li&gt;reducers&lt;/li&gt;
&lt;li&gt;selectors&lt;/li&gt;
&lt;li&gt;middleware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just to manage something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;isSidebarOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern frameworks already provide simpler solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular Signals&lt;/li&gt;
&lt;li&gt;React &lt;code&gt;useState&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;lightweight stores like Zustand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet teams sometimes default to &lt;strong&gt;heavy architectures by habit&lt;/strong&gt;, not necessity.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Micro-Frontends for Apps That Don’t Need Them
&lt;/h3&gt;

&lt;p&gt;Micro-frontends are incredibly powerful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;very large organizations&lt;/li&gt;
&lt;li&gt;multiple independent teams&lt;/li&gt;
&lt;li&gt;separate deployment pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they sometimes appear in projects with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4–5 developers&lt;/li&gt;
&lt;li&gt;a single product&lt;/li&gt;
&lt;li&gt;a handful of pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicated dependencies
&lt;/li&gt;
&lt;li&gt;complicated builds
&lt;/li&gt;
&lt;li&gt;deployment headaches
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All for a problem that never existed.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Abstraction Layers Everywhere
&lt;/h3&gt;

&lt;p&gt;Many frontend architectures end up looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Component
↓
Container
↓
Facade
↓
Service
↓
Adapter
↓
API Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of that… for a simple API request.&lt;/p&gt;

&lt;p&gt;Abstractions are useful when they &lt;strong&gt;hide complexity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But when they &lt;strong&gt;create complexity&lt;/strong&gt;, they become a burden.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Framework Churn
&lt;/h3&gt;

&lt;p&gt;Frontend development evolves incredibly fast.&lt;/p&gt;

&lt;p&gt;Just look at the past decade and this is not all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;→ jQuery
→ AngularJS
→ React
→ Redux
→ Hooks
→ Server Components
→ Signals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every few years, developers reconsider how applications should be structured.&lt;/p&gt;

&lt;p&gt;Sometimes these changes genuinely improve developer experience.&lt;/p&gt;

&lt;p&gt;Other times, they introduce &lt;strong&gt;new patterns that solve problems many apps never had&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;Over-engineering isn’t usually intentional.&lt;br&gt;&lt;br&gt;
It often emerges from good intentions.&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Designing for Problems That Might Never Exist
&lt;/h3&gt;

&lt;p&gt;Teams sometimes build systems designed for future scale:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What if we have 20 teams working on this later?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the project starts with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;micro-frontends&lt;/li&gt;
&lt;li&gt;distributed architectures&lt;/li&gt;
&lt;li&gt;complex state systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But many applications never reach that scale.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Copying Big Tech Architectures
&lt;/h3&gt;

&lt;p&gt;Many articles describe how companies like Netflix or Google structure their frontend systems.&lt;/p&gt;

&lt;p&gt;But these companies operate at &lt;strong&gt;massive scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Their architecture solves problems that most teams will &lt;strong&gt;never encounter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Adopting those patterns prematurely can create unnecessary complexity.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. The Tooling Ecosystem
&lt;/h3&gt;

&lt;p&gt;Frontend development has an enormous ecosystem.&lt;/p&gt;

&lt;p&gt;New tools appear constantly, each solving a specific problem.&lt;/p&gt;

&lt;p&gt;But combining many of them can lead to something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;framework
+ state library
+ router
+ data fetching library
+ meta framework
+ build tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suddenly the stack becomes harder to understand than the application itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Complexity Is Actually Necessary
&lt;/h2&gt;

&lt;p&gt;Not all complexity is bad.&lt;/p&gt;

&lt;p&gt;Large applications genuinely benefit from structured architecture.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enterprise SaaS platforms&lt;/li&gt;
&lt;li&gt;banking systems&lt;/li&gt;
&lt;li&gt;large admin dashboards&lt;/li&gt;
&lt;li&gt;multi-team platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strong architecture&lt;/li&gt;
&lt;li&gt;predictable patterns&lt;/li&gt;
&lt;li&gt;structured state management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can make systems easier to maintain over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Better Approach: Progressive Complexity
&lt;/h2&gt;

&lt;p&gt;Instead of starting complex, many teams now adopt &lt;strong&gt;progressive architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Components
↓
Local state
↓
Simple services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the application grows, evolve gradually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;State management
↓
Shared architecture
↓
Advanced patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids &lt;strong&gt;premature optimization&lt;/strong&gt; while still allowing systems to scale when necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Cost of Over-Engineering
&lt;/h2&gt;

&lt;p&gt;Over-engineering affects more than just code.&lt;/p&gt;

&lt;p&gt;It can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slower development&lt;/li&gt;
&lt;li&gt;harder onboarding&lt;/li&gt;
&lt;li&gt;steeper learning curves&lt;/li&gt;
&lt;li&gt;increased maintenance cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many cases, &lt;strong&gt;simplicity improves long-term maintainability&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Useful Rule of Thumb
&lt;/h2&gt;

&lt;p&gt;Before adding a new tool or architectural pattern, ask three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What problem does this solve &lt;strong&gt;today&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Could the framework already handle this?&lt;/li&gt;
&lt;li&gt;Would the system break if we stayed simpler?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answers aren’t clear, the added complexity may not be justified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Modern frontend development is incredibly powerful.&lt;/p&gt;

&lt;p&gt;But sometimes the most valuable engineering skill is &lt;strong&gt;restraint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not every application needs a complex architecture.&lt;/p&gt;

&lt;p&gt;Sometimes the best solution is simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build the simplest thing that works — and evolve it when reality demands it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Let’s Talk
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Have you ever worked on a frontend project that felt over-engineered?
&lt;/li&gt;
&lt;li&gt;What architectural decision caused the most unnecessary complexity?
&lt;/li&gt;
&lt;li&gt;Where do you think the balance between simplicity and scalability lies?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>RxJS Subjects in the Angular Signals Era: Obsolete or Still Powerful?</title>
      <dc:creator>Mayuri Jha</dc:creator>
      <pubDate>Tue, 10 Mar 2026 15:48:14 +0000</pubDate>
      <link>https://forem.com/mayuri_jha_bc0b497f737276/rxjs-subjects-in-the-angular-signals-era-obsolete-or-still-powerful-2dh</link>
      <guid>https://forem.com/mayuri_jha_bc0b497f737276/rxjs-subjects-in-the-angular-signals-era-obsolete-or-still-powerful-2dh</guid>
      <description>&lt;p&gt;For years, Angular developers lived in a world powered by &lt;strong&gt;RxJS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Streams, subscriptions, operators, Subjects — if you wanted reactive behavior in Angular, RxJS was the way.&lt;/p&gt;

&lt;p&gt;Then Angular introduced &lt;strong&gt;Signals&lt;/strong&gt;, a new reactivity model that promised something developers had been craving:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Simpler state management with less boilerplate.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suddenly, many Angular developers began asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do we still need RxJS Subjects?&lt;/li&gt;
&lt;li&gt;Are Signals replacing RxJS?&lt;/li&gt;
&lt;li&gt;Should we rewrite everything?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before we panic-delete our &lt;code&gt;Subject&lt;/code&gt; imports, let's understand &lt;strong&gt;what actually changed&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals are like a spreadsheet cell.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a value changes, everything depending on it updates automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RxJS is like a pipeline of events.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data flows through operators, transformations, and async processes.&lt;/p&gt;

&lt;p&gt;Both are reactive — but they solve &lt;strong&gt;different problems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Old Angular Pattern: RxJS Everywhere
&lt;/h2&gt;

&lt;p&gt;Before Signals, developers often used &lt;code&gt;BehaviorSubject&lt;/code&gt; even for simple component state.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;countSubject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countSubject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asObservable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countSubject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countSubject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{{ count$ | async }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For beginners, this raised questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why do I need &lt;code&gt;BehaviorSubject&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why &lt;code&gt;asObservable()&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why the async pipe?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of code… for something as simple as a &lt;strong&gt;counter&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Signals Way
&lt;/h2&gt;

&lt;p&gt;Now the same example becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&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="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{{ count() }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No subscriptions.&lt;/li&gt;
&lt;li&gt;No async pipe.&lt;/li&gt;
&lt;li&gt;No Subject.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Signals &lt;strong&gt;shine&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Signals Truly Replace RxJS Subjects
&lt;/h2&gt;

&lt;p&gt;Signals are fantastic for &lt;strong&gt;application state&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Component State
&lt;/h3&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loading$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can simply write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Derived State
&lt;/h3&gt;

&lt;p&gt;Previously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;total$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineLatest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;price$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantity$&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;pipe&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;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;q&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;q&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;With Signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&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;price&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reads almost like plain English.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. UI Reactivity
&lt;/h3&gt;

&lt;p&gt;Signals integrate directly with Angular change detection.&lt;/p&gt;

&lt;p&gt;Update the signal → UI updates automatically.&lt;/p&gt;

&lt;p&gt;No subscriptions needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Signals Don't Replace Everything
&lt;/h2&gt;

&lt;p&gt;Here's where beginners often misunderstand.&lt;/p&gt;

&lt;p&gt;Signals manage &lt;strong&gt;state&lt;/strong&gt;.&lt;br&gt;
RxJS manages &lt;strong&gt;streams&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those are different things.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where RxJS Subjects Are Still the Better Choice
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Event Streams
&lt;/h3&gt;

&lt;p&gt;Imagine a chat application receiving messages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;messages$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Message&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;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a stream of events, not a single state value.&lt;/p&gt;

&lt;p&gt;Signals are not designed for this pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Complex Async Workflows
&lt;/h3&gt;

&lt;p&gt;Consider a search box.&lt;/p&gt;

&lt;p&gt;You want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debounce typing&lt;/li&gt;
&lt;li&gt;cancel previous requests&lt;/li&gt;
&lt;li&gt;fetch new results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RxJS handles this beautifully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;search$&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;debounceTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;switchMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Signals do not provide operators like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debounce&lt;/li&gt;
&lt;li&gt;switchMap&lt;/li&gt;
&lt;li&gt;retry&lt;/li&gt;
&lt;li&gt;merge streams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is &lt;strong&gt;RxJS territory&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. WebSockets &amp;amp; Real-Time Data
&lt;/h3&gt;

&lt;p&gt;Live data streams fit RxJS naturally.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stock price feeds&lt;/li&gt;
&lt;li&gt;live chat&lt;/li&gt;
&lt;li&gt;multiplayer game updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signals are &lt;strong&gt;state holders&lt;/strong&gt;, not event streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Best Approach: Use Both
&lt;/h3&gt;

&lt;p&gt;The Angular team never intended Signals to replace RxJS.&lt;/p&gt;

&lt;p&gt;Instead, they built tools to &lt;strong&gt;connect them together&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observable → Signal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your template can simply use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nf"&gt;users&lt;/span&gt;&lt;span class="p"&gt;()?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Signal → Observable
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toObservable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userSignal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful when integrating with RxJS pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Architecture
&lt;/h2&gt;

&lt;p&gt;Modern Angular apps often follow this pattern:&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%2Frzi4hi1c41ermkb70tvw.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%2Frzi4hi1c41ermkb70tvw.png" alt="Signal and Subject in modern Angular" width="800" height="1296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RxJS handles &lt;strong&gt;data flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Signals handle &lt;strong&gt;UI state&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Signals
&lt;/h2&gt;

&lt;p&gt;Use Signals when dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component state&lt;/li&gt;
&lt;li&gt;UI state&lt;/li&gt;
&lt;li&gt;derived values&lt;/li&gt;
&lt;li&gt;reactive templates&lt;/li&gt;
&lt;li&gt;replacing &lt;code&gt;BehaviorSubject&lt;/code&gt; in components&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use RxJS Subjects
&lt;/h2&gt;

&lt;p&gt;Use Subjects when dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event streams&lt;/li&gt;
&lt;li&gt;async workflows&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;complex operator chains&lt;/li&gt;
&lt;li&gt;cancellation logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Take
&lt;/h2&gt;

&lt;p&gt;Angular development is evolving toward something simpler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less boilerplate&lt;/li&gt;
&lt;li&gt;Clearer reactivity&lt;/li&gt;
&lt;li&gt;Better separation between &lt;strong&gt;state&lt;/strong&gt; and &lt;strong&gt;streams&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many cases, Signals can replace &lt;code&gt;BehaviorSubject&lt;/code&gt; when managing simple component or service state.&lt;/p&gt;

&lt;p&gt;However, RxJS remains incredibly powerful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;asynchronous streams&lt;/li&gt;
&lt;li&gt;event pipelines&lt;/li&gt;
&lt;li&gt;complex reactive workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signals didn't replace RxJS.&lt;/p&gt;

&lt;p&gt;They just gave Angular developers &lt;strong&gt;the right tool for the right job&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>rxjs</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
