Skip to content
CAI
Software that uses CAICheck a score

fable-hub/Fable.Reactive

68.7

Adequate · 3 October 2026

2k

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Fable.Reactive is a functional reactive programming library for the F\# ecosystem, designed to manage asynchronous data streams and concurrency. It provides core reactive primitives such as subjects and query builders, enhanced by an actor-based architecture for supervised stream processing and lifecycle management. The system also includes utilities for converting between observables and async sequences, supporting backpressure and non-blocking operations.

Features

New AsyncSeq conversion extension package

A new \Fable.Reactive.AsyncSeq\ package has been added to the extra directory, providing functions to convert between F\# async sequences and Fable.Reactive observables. This includes \Reactive.ofAsyncSeq\ for converting an async sequence into an async observable, and \Reactive.toAsyncSeq\ for converting an async observable back into a non-blocking async sequence with backpressure support. Users can install this extension via \dotnet paket add Fable.Reactive.AsyncSeq\.

extra · high confidence

Behavioural changes

Reactive library refactored to use Fable.Actor and renamed to Fable.Reactive

The reactive library has been refactored to replace the previous MailboxProcessor-based implementation with Fable.Actor for concurrency and lifecycle management, and the project has been renamed to Fable.Reactive. This change introduces new actor-backed subjects (single, mailbox, and standard) and adds actor interop operators (flatMapActorSupervised, flatMapActor, mapActor, ofActor) that allow streams to be processed by supervised actors with configurable crash behaviors (escalate, stop, restart). The query builder has been updated to support async and sequence sources, and disposal logic has been strengthened with idempotent AsyncDisposable and new composite/empty utilities. Old files (Leave, Query, Stream) were removed as their functionality was superseded by these new actor-centric implementations.

src · high confidence

Repository restructured and renamed to Fable.Reactive

The project has been renamed from AsyncRx to Fable.Reactive, including the solution file, project name, and namespace. The repository structure has been reorganized to include a new \extra/AsyncSeq\ folder for optional AsyncSeq integration, and a \justfile\ has been added to standardize build, test, and packaging commands. Documentation files such as \AGENTS.md\ and \CLAUDE.md\ have been introduced to guide contributors and AI agents, while \.editorconfig\ and \.fantomasignore\ have been added to enforce formatting rules.

(repo-wide) · high confidence

Test coverage

Migrate test suite to Scriptorium and Fable.Reactive

The test suite has been rewritten to use the Scriptorium testing framework (replacing NUnit/FsUnit) and the Fable.Reactive library (replacing Reaction.AsyncRx). This change introduces new test files for Actor interop, query builders, flatMap monad laws, subjects, and time-shift operators, while removing obsolete tests for the virtual time scheduler and old binding syntax.

test · high confidence

Dependencies

Library renamed to Fable.Reactive with updated dependencies and test framework

The main library has been renamed from Reaction.AsyncRx to Fable.Reactive, updating the package ID and target framework to netstandard2.0. Dependencies have been upgraded to FSharp.Core \>= 5.0.0, Fable.Core \>= 5.0.0, and Fable.Actor 5.0.0-rc.11, while the test suite has migrated from NUnit/FsUnit to Scriptorium and targets net10.0. A new Fable.Reactive.AsyncSeq package was added to separate AsyncSeq functions, and the Python package metadata was updated to version 1.6.3.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 68 → 69 (+0.3)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 96 → 90 (-6.3)
  • Architecture 91 → 96 (+4.7)
  • Maturity 72 → 72 (-0.1)
  • Readiness 57 → 59 (+2.2)
  • Security 78 → 74 (-4.3)

Resolved (3)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no licence statement (packages/reactive/Fable.Actor/README.md)
  • Documentation: no usage examples (README.md)

New (4)

  • Combine.mergeInner (cognitive 20) (src/Combine.fs)
  • Documentation: no installation or build instructions (packages/test/Scriptorium.Parchment/README.md)
  • Hotspot: src/Transform.fs (src/Transform.fs)
  • TooManyFunctions: Reactive (src/AsyncObservable.fs)

Architecture

  • Containers 0 added · 0 removed · contexts 3 added · 0 removed · edges 0 added · 0 removed

Added bounded contexts (3)

  • Fable.Reactive
  • Scriptorium.Nib
  • Scriptorium.Quill

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

fable-hub/Fable.Reactive was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 4eac92fd7d7a786a912d03b35a107a81128ccabe — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.