<?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: ReactiveHTML</title>
    <description>The latest articles on DEV Community by ReactiveHTML (@reactivehtml).</description>
    <link>https://dev.to/reactivehtml</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%2Forganization%2Fprofile_image%2F9083%2F60654e77-27a4-4fe5-af49-6cf6913f1a0e.png</url>
      <title>DEV Community: ReactiveHTML</title>
      <link>https://dev.to/reactivehtml</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reactivehtml"/>
    <language>en</language>
    <item>
      <title>Why Angular Isn’t the Observable Framework You Think It Is</title>
      <dc:creator>Dario Mannu</dc:creator>
      <pubDate>Sat, 13 Sep 2025 17:55:23 +0000</pubDate>
      <link>https://dev.to/reactivehtml/why-angular-isnt-the-observable-framework-you-think-it-is-56a3</link>
      <guid>https://dev.to/reactivehtml/why-angular-isnt-the-observable-framework-you-think-it-is-56a3</guid>
      <description>&lt;p&gt;When many developers hear "observables", one framework often jumps to mind: Angular. It’s been closely tied to RxJS for years, marketed as the reactive framework of choice.&lt;/p&gt;

&lt;p&gt;But here’s the catch: Angular doesn’t actually live in the observable world. Instead, it constantly forces you to switch gears — juggling RxJS streams on one side, and its own reactivity model (async pipes, now signals) on the other.&lt;/p&gt;

&lt;p&gt;And that’s where the cracks start to show.&lt;/p&gt;

&lt;p&gt;You’re wiring async pipes everywhere.&lt;/p&gt;

&lt;p&gt;You’re managing BehaviorSubjects by hand.&lt;/p&gt;

&lt;p&gt;You always have to unsubscribe.&lt;/p&gt;

&lt;p&gt;And now, with signals, you’re asked to learn yet another reactive abstraction.&lt;/p&gt;

&lt;p&gt;It’s not seamless. It’s not elegant. And it’s certainly not the pure observable experience RxJS developers dream about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Rimmel.js: Built on Streams from Day One
&lt;/h2&gt;

&lt;p&gt;Imagine a UI library where you don’t need two paradigms. Where event sources and data sinks just bind to streams and your UI is simply a declarative destination for your data. That’s what Rimmel.js was designed to do.&lt;/p&gt;

&lt;p&gt;This isn’t Angular with a bolt-on async pipe. This is [stream-oriented programming] — where observables aren’t guests at the table, they are the table.&lt;/p&gt;

&lt;p&gt;And the difference is dramatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular vs Rimmel in Practice
&lt;/h2&gt;

&lt;p&gt;Counter Example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/~/github.com/zeekrey/stackblitz-angular-simple-counter?file=src/main.ts" rel="noopener noreferrer"&gt;Angular version&lt;/a&gt;&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="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;button (click)="increment()"&amp;gt;+&amp;lt;/button&amp;gt;
    &amp;lt;span&amp;gt;{{ count$ | async }}&amp;lt;/span&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kr"&gt;private&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;new&lt;/span&gt; &lt;span class="nc"&gt;BehaviorSubject&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;count&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;count&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;count&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackblitz.com/edit/click-counter-rimmel" rel="noopener noreferrer"&gt;Rimmel.js version&lt;/a&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&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="mi"&gt;0&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;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;x&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;rml&lt;/span&gt;&lt;span class="s2"&gt;`
    &amp;lt;button onclick="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;
      click me &amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/span&amp;gt;
    &amp;lt;/button&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;No async pipes. No imperative methods. Just streams, neatly and directly connected to the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Signals vs Rimmel Observables
&lt;/h2&gt;

&lt;p&gt;Angular’s recent push for signals looks shiny at first glance. They promise "fine-grained reactivity" and "fewer recalculations". But here’s what actually happens:&lt;/p&gt;

&lt;p&gt;You now have two reactive paradigms: signals and RxJS.&lt;/p&gt;

&lt;p&gt;Data from an observable still has to be bridged into a signal.&lt;/p&gt;

&lt;p&gt;Events from your UI still go through imperative steps.&lt;/p&gt;

&lt;p&gt;Your app ends up with split logic: streams for async work, signals for rendering.&lt;/p&gt;

&lt;p&gt;You learn one reactive model, then constantly translate it into another.&lt;/p&gt;

&lt;p&gt;That’s unnecessary complexity.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://github.com/reactivehtml/rimmel" rel="noopener noreferrer"&gt;Rimmel.js&lt;/a&gt;, you don’t need signals at all. Observables are already expressive, composable, and powerful enough to handle both async data and complex state. By cutting out the extra layer, you stay in one mental model: streams in, streams out.&lt;/p&gt;

&lt;p&gt;The result? Code that feels neat, light, direct, and more predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Developers
&lt;/h2&gt;

&lt;p&gt;Rimmel.js gives you:&lt;/p&gt;

&lt;p&gt;True first-class observables. No pipes, no wrappers.&lt;/p&gt;

&lt;p&gt;Cleaner code. Every part of your app speaks one language: streams.&lt;/p&gt;

&lt;p&gt;Future-proof thinking. Stream-oriented programming scales elegantly with complexity.&lt;/p&gt;

&lt;p&gt;Instant familiarity. If you know RxJS, you already know most of Rimmel.js.&lt;/p&gt;

&lt;p&gt;Instead of wrestling with multiple reactivity systems, you can finally focus on what matters: building features, not boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Angular might be the framework you think of when you think "observables", but the reality is that Angular’s observable support is skin-deep. It keeps you juggling async pipes, signals, and RxJS — a constant context-switching tax.&lt;/p&gt;

&lt;p&gt;Rimmel.js flips that script. By embracing a stream-oriented paradigm, it turns observables into the natural fabric of your application. Your knowledge of RxJS doesn’t just transfer — it thrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Ffvz4rupi0mx6303ghwc2.png" alt="A Web Developer's guide to Stream-Oriented Programming" width="64" height="64"&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://dev.to/dariomannu/a-senior-developers-guide-to-stream-oriented-programming-3j24"&gt;A Web Developer's guide to Stream-Oriented Programming&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Fb6dvvnukpwoz5icojypx.png" alt="Web Components with one Simple Function" width="64" height="64"&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://dev.to/dariomannu/web-components-without-classes-34hb"&gt;Web Components with one Simple Function&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2F91ud88tyrxcjez7vkph4.png" alt="From callbacks to callforwards: reactivity made simple?" width="64" height="64"&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://dev.to/dariomannu/from-callbacks-to-callforwards-a-simple-solution-to-reactivity-3l5e"&gt;From callbacks to callforwards: reactivity made simple?&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
