Library / SDK
rx-angular/rx-angular avatar
rx-angular/rx-angular

RxAngular for Reactive Angular State and Rendering

Reactive Extensions for Angular.

1,963 stars209 forksTypeScriptMIT

At a glance

What is it?
RxAngular provides packages for reactive Angular state, observable template rendering, zone-less application patterns, and incremental static regeneration. It suits Angular teams that prefer explicit data flows and can adopt the relevant package independently.
Who is it for?
Application teams already using Angular and seeking explicit reactive state or observable-driven rendering should evaluate individual RxAngular packages against their current Angular and RxJS patterns. Small applications that do not need a dedicated reactive layer should avoid adopting the collection by default.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Choosing a RxAngular Package for an Angular Team

RxAngular addresses Angular applications whose state, rendering, and side effects need to remain connected to observable data flows. The repository presents it as a collection of packages rather than a replacement for Angular components, dependency injection, or RxJS. Its intended users are Angular teams working on large applications, performance-sensitive interfaces, or applications intended to run fully or partly without Angular zones.

The packages cover separate problems and can work independently or together. `@rx-angular/state` provides reactive state management for components and services. `@rx-angular/template` contains directives and pipes for observable values and rendering. `@rx-angular/cdk` targets Angular UI libraries and large applications. `@rx-angular/isr` generates static pages at runtime and updates them incrementally on demand or on a schedule. `@rx-angular/eslint-plugin` checks source code for reactive, performant, and zone-less Angular patterns.

That division matters during adoption. RxAngular is not one feature with one configuration surface. A component team needing an Observable-to-template binding has a different decision from a platform team introducing incremental static regeneration. The package documentation linked by the README should therefore be checked independently for each use case.

How rxState Connects Actions, State, and Effects

The README's counter example exposes RxAngular's reactive mechanism through four connected pieces. `rxActions` defines typed action streams for `increment` and `decrement`. `rxState` holds the `count` field and connects each action stream to a state transition. A selector exposes the field as `count$`, and `RxPush` connects that Observable to the component template.

Side effects remain separate. The component registers `rxEffects` against `count$`, so a logging operation runs when the selected count emits. The full path is explicit: a button invokes an action, the action stream triggers an immutable state update, `rxState` emits the selected value, and the template receives it through `RxPush`. This arrangement gives application logic explicit names and boundaries.

The example also exposes a design cost. A basic counter now involves actions, connections, selectors, an effect registration, and a specialized template pipe. That architecture is reasonable when reactive state is shared across several components or when consistency matters. It may be excessive for an isolated widget with one value. The README does not document when RxAngular recommends reaching for this package instead of conventional Angular services.

Binding an Observable with rxLet

The `*rxLet` example binds an Observable named `time$` directly to an Angular template. `timer(0, 1000)` produces emissions every second, `map` converts each emission into a time string, and `*rxLet` exposes the current value to `ng-container`. The component uses a standalone configuration and imports `RxLet` rather than subscribing manually to the stream and assigning a plain field.

The README presents this pattern as a basic use of `@rx-angular/template`. It supports RxAngular's stated focus on template rendering and non-blocking rendering, but it does not provide comparative timing results for this component. The example demonstrates the binding mechanism, not measured performance improvement.

The documentation excerpt also remains silent about render scheduling, subscription cleanup, accessibility behavior, and compatibility with other asynchronous template primitives. Those details should be checked in the package documentation before using `rxLet` for large emission rates or interfaces that combine multiple rendering strategies. The repository links to `https://rx-angular.io/docs/template` for the package's wider capabilities.

Installing RxAngular and Running the First rxLet Example

The README does not provide consumer installation commands for `@rx-angular/template` or the other published packages. It links to their documentation and npm pages instead. This article therefore does not invent a package-manager command or an application version constraint. The package selected for a new application should be installed according to its own documentation.

For repository development, the root `package.json` declares a private Yarn workspace. It requires Node `^20.19.0 || ^22.12.0 || ^24.0.0` and Yarn `4.4.1`. These are workspace engine declarations, not a complete guide for consumers. The repository also exposes build and test scripts through Nx.

The first documented use is a standalone component that renders `time$` with `*rxLet`. The README shows the RxAngular import and component definition below. It omits the imports for `Component`, `timer`, and `map`, so those symbols must already be imported in a working Angular file.

ts
import { RxLet } from '@rx-angular/template/let';

@Component({
  selector: 'app-time',
  standalone: true,
  imports: [RxLet],
  template: `
    <ng-container *rxLet="time$; let value">
      {{ value }}
    </ng-container>
  `,
})
export class TimeComponent {
  time$ = timer(0, 1000).pipe(map(() => new Date().toTimeString()));
}

After the Angular imports and `rxLet` directive are configured, the reader should see the current time update once per second inside the `ng-container`.

Building the Documented Reactive Counter

The state example shows how two RxAngular packages cooperate. The template imports `RxPush` from `@rx-angular/template/push`, while the component imports state management APIs from `@rx-angular/state`, `/effects`, and `/actions`. The exact entry points shown by the README are:

ts
import { rxState } from '@rx-angular/state';
import { rxEffects } from '@rx-angular/state/effects';
import { rxActions } from '@rx-angular/state/actions';
import { RxPush } from '@rx-angular/template/push';

The component defines typed `increment` and `decrement` actions. It initializes `count` to zero, connects both action streams to updates, selects `count` as `count$`, and registers an effect that logs each selected value. Its template renders `count$` with `push`, and its buttons invoke the matching action methods. A complete reader should see the displayed count rise or fall with each click and find the corresponding message in the browser console.

This example is useful as a wiring demonstration, but it is not an exhaustive state-management guide. The README does not discuss persistence, error channels, selector composition, serialization, or migration from existing Angular state services. Teams with those requirements must inspect the `@rx-angular/state` documentation rather than infer their support from the counter.

Package Versions, Maintenance, and Upgrade Scope

RxAngular packages are versioned separately. The release information lists `[email protected]`, `[email protected]`, and `[email protected]`, all published on 2026-07-21. An application using several packages can therefore have multiple package versions, and adding one RxAngular package does not imply that every package in the repository has been upgraded. An upgrade review should inspect each dependency that the application actually consumes.

The repository's last push was on 2026-10-14. It is not archived. That supports recent repository activity, but it does not establish compatibility for every Angular release. The root `package.json` lists Angular packages at `21.0.6` and `@angular/cdk` at `21.0.5`. Those versions describe the repository workspace, not a complete consumer compatibility matrix.

The README does not state a long-term support policy, a migration policy, or a policy for aligning package versions. The `CONTRIBUTING.md` file is named as the contribution entry point, but the README excerpt does not document contributor prerequisites. Maintainers and adopters should check the individual package release notes and dependency declarations when planning an upgrade.

RxAngular is identified as MIT licensed in both the README and the root `package.json`, and the repository includes a `LICENSE` file. That classification is not legal advice about a particular distribution. Notice obligations, bundled dependency licenses, and compliance work still need to be checked for the application.

RxAngular Versus Conventional Angular Service Patterns

The clearest alternative is to remain with Angular's built-in services and template bindings, using RxJS directly at asynchronous boundaries and adding a specialized reactive library only for a demonstrated need. A conventional counter could expose state through dependency injection, update it from component event handlers, and bind a plain property in the template. This approach uses fewer package-specific abstractions, although the repository does not state that Angular's native patterns fail to meet an application's performance requirements.

RxAngular becomes more relevant when a team wants observable state selection, structured actions, dedicated effects, and package-provided rendering as an agreed application convention. The state and template examples suggest that the collection is intended for consistent reactive behavior across components. Zone-less operation is another stated goal, supported by the eslint-plugin package and the repository's repository-level tooling.

`@rx-angular/isr` serves a different problem. It is for Angular Universal applications that generate static pages at runtime and then update pages incrementally on demand or on a schedule. It is not a general replacement for `rxState`, and a component team should not adopt it merely because its application uses RxAngular state management. The relevant package, hosting environment, and update mechanism must be evaluated separately.

Editorial conclusion

Application teams already using Angular and seeking explicit reactive state or observable-driven rendering should evaluate individual RxAngular packages against their current Angular and RxJS patterns. Small applications that do not need a dedicated reactive layer should avoid adopting the collection by default. Verify package compatibility, the required entry point, and standalone integration first, then begin with one narrowly scoped package rather than every RxAngular feature.

Frequently asked questions

Which RxAngular package should an Angular application evaluate first?

Choose the package tied to the current problem: `@rx-angular/state` for reactive state, `@rx-angular/template` for observable rendering, or another listed package for its documented purpose. The README says the packages can work together or independently.

Does RxAngular show how to bind an Observable to an Angular template?

Yes. The README uses `*rxLet` with a `time$` stream in a standalone component. It also shows `RxPush` for the counter example.

Which Node and Yarn versions does the RxAngular workspace declare?

The root `package.json` declares Node `^20.19.0 || ^22.12.0 || ^24.0.0` and Yarn `4.4.1`. The root workspace package is marked as private.

What license applies to RxAngular?

The README, root `package.json`, and repository `LICENSE` file identify the project as MIT licensed.

When was the last listed RxAngular repository push?

The repository's last push was on 2026-10-14.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. rx-angular/rx-angular on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/rx-angular-rx-angular.svg)](https://hysenlabs.com/projects/rx-angular-rx-angular)

Was this useful?