Skip to content
CAI
Software that uses CAICheck a score

fable-hub/Fable.Actor

72.3

Strong · 3 October 2026

1.2k

lines of production code

F#

with Erlang

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Fable.Actor is a cross-platform actor model library for F\# that compiles to BEAM, JavaScript, and Python via Fable. It provides a unified abstraction for concurrency, leveraging native lightweight processes on BEAM and MailboxProcessor on other targets, while supporting supervision, message passing, and request-reply patterns. The system includes examples demonstrating interactive animations and cross-language interoperability with Erlang, serving as a practical reference for its capabilities.

Features

Add Python Tkinter demo for Fable.Actor

Introduces a new Python-based example in the \examples/timeflies-python\ directory that demonstrates the Fable.Actor library using a Tkinter GUI. The application visualizes the 'timeflies' concept by displaying a sequence of characters that move across the window in response to mouse movements, leveraging \Fable.Python.TkInter\ and \Fable.Actor\ to handle the UI and actor-based logic. The entry also includes the \uv.lock\ dependency file, which pins the \fable-library\ to version 5.17.2 and requires Python 3.12 or newer.

examples/timeflies-python · high confidence

Add Timeflies actor-based WebSocket demo for Fable.Beam

The examples/timeflies-beam directory now contains a complete demo application that reimplements the classic 'Timeflies' Reactive Extensions example using Fable.Actor and Cowboy WebSockets. The application runs on port 3000, serving an HTML page where letters of 'TIME FLIES LIKE AN ARROW' follow the mouse cursor with a staggered delay. The architecture uses a BEAM server with a 'Distributor' actor that fans out mouse position updates to individual 'letter' actors, which schedule delayed responses back to the browser via WebSocket. The example demonstrates key Fable.Actor features such as spawn, linked actors, message receive loops, and scheduling, and includes both F\# source files and corresponding Erlang Cowboy handlers for the HTTP and WebSocket routes.

examples/timeflies-beam · high confidence

Add Timeflies-JS interactive example using React and Vite

A new JavaScript-based example has been added to the examples directory, demonstrating an interactive 'Timeflies' animation built with React (via Feliz) and Vite. This example showcases the use of Fable.Actor for handling mouse movement events through an actor pipeline, rendering animated text characters that follow the cursor. The implementation includes a Vite configuration for local development on port 3000 and a React component that manages state and effects for the animation.

examples/timeflies-js · high confidence

Introduce cross-platform actor model with BEAM and MailboxProcessor support

Fable.Actor now provides a unified actor abstraction that adapts to the target runtime: on BEAM targets, it uses native lightweight processes with a CPS-based computation expression, while on other targets it delegates to F\#'s MailboxProcessor via async workflows. This change introduces core types for supervision (OneForOne strategy, child exit results), message passing (Post, Receive), and request-reply patterns, enabling users to write platform-agnostic actor code that leverages native concurrency semantics on each platform.

Fable.Actor · high confidence

Migrate from Gleam to F\# and introduce cross-platform actor library

The project has been rewritten from Gleam to F\# (compiled via Fable to BEAM, Python, and JavaScript) and renamed from ActorX to Fable.Actor. This migration removes the Gleam build tooling (gleam.toml, manifest.toml) and replaces it with a .NET/F\# architecture, adding a new \justfile\ for build/test automation, \.editorconfig\ for F\# formatting, and configuration for the ELPI linter. The library now provides a unified \actor { }\ computation expression and typed \Actor\<'Msg\>\ abstraction that works across all three targets, replacing the previous BEAM-only reactive extensions.

(repo-wide) · high confidence

New F\#-Erlang actor interop example demonstrating cross-language messaging

Added an interop example in \examples/interop\ that demonstrates bidirectional communication between an F\# actor (Dag) and a native Erlang process (Joe). The example illustrates the wire protocol for cross-language actor communication, including how F\# discriminated unions compile to Erlang tagged tuples, how the \fable\_actor\_msg\ envelope is handled, and how to construct a \ReplyChannel\ map manually from Erlang to support call patterns. It also shows fire-and-forget messaging using raw Erlang sends to bypass the envelope.

examples/interop · high confidence

New Timeflies demo using actor-based letter animation

A new Timeflies demo example has been added that implements a text animation where each letter is managed by its own linked actor. The demo features a distributor actor that fans out mouse position events to individual letter actors, which then schedule delayed responses to create a wave-like effect. This change introduces a specific actor topology for the demo, isolating lifecycle and delay logic per character, and outputs JSON data for each letter's position and character.

Timeflies.Common · high confidence

Removals

Removed Gleam implementation of ActorX

The ActorX reactive extensions library for Gleam has been removed from the codebase. This change deletes the core type definitions, creation operators, filter and transform logic, builder syntax, and observer utilities that previously allowed Gleam users to compose asynchronous event streams.

src/actorx · high confidence

Behavioural changes

Migration of ActorX library from Gleam to F\# (Fable.Beam)

The ActorX reactive programming library has been migrated from the Gleam language to F\# using the Fable.Beam compiler. This change replaces the original Gleam source files (such as \actorx.gleam\) with a new F\#-based project structure managed by \rebar.config\, enabling the library to target the BEAM virtual machine via F\#. Users should expect the underlying implementation to shift from Gleam to F\#, while the public API surface (observables, observers, and operators) remains conceptually consistent for BEAM-based applications.

src · high confidence

New BEAM platform implementation with typed Erlang bindings

The BEAM target now uses a new Platform.fs module that delegates to Fable.Beam.Erlang for standard BIFs and implements actor-specific protocol Emits using typed F\# bindings. This change introduces an InternalMsg discriminated union to model wire envelopes (ActorMsg, Reply, Exit) and replaces local Erlang .erl files with F\# \[\<Emit\>\] bindings, ensuring public actor messages and replies retain their established Erlang envelope tags while improving type safety for process helpers like killProcess, trapExits, and timer management.

src/Fable.Actor · high confidence

Test coverage

Added F\# test suite for Fable.Actor using Scriptorium

Added a new cross-target behavioral test suite for the Fable.Actor library, replacing the previous Gleam-based tests. The suite, built with the Scriptorium (Quill + Nib) testing framework, covers actor spawning, message receiving, computation-expression control flow, timeouts, and supervision strategies (including linked and supervised children). It includes platform-specific plumbing to handle differences between BEAM and other targets, ensuring the library behaves consistently across all supported environments.

test · high confidence

Dependencies

Update dependencies and target frameworks for Fable.Actor examples

The Fable.Actor library and its examples have been updated to use .NET 10.0 as the target framework. Key dependency upgrades include Fable.Beam to version 5.0.0-rc.37, Fable.Core to 5.0.0 (and 5.2.0 for Python/test projects), Feliz to 3.2.0, and the fable-library to 5.17.2. The JavaScript example now uses React 19, Vite 8.2.2, and the corresponding React plugin. Test infrastructure has been updated to use Scriptorium (Quill 0.5.1 and Nib 0.4.1).

(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 72 → 72 (-0.0)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 99 → 99 (+0.0)
  • Architecture 93 → 93 (-0.3)
  • Maturity 64 → 64 (+0.0)
  • Readiness 74 → 74 (+0.0)
  • Security 78 → 78 (+0.0)

Findings

  • No change — the same findings as the prior survey.

Changes since last survey

  • 13 commits — 12 feature/other, 1 fixes

By area

  • .config/dotnet-tools.json — 5 commits
  • (root) — 4 commits
  • examples/timeflies-python — 2 commits
  • .github/dependabot.yml — 1 commit
  • .github/workflows — 1 commit

Notable commits

  • fix: fix!: return supervised replacement child (#59)
  • change: chore(deps): bump extractions/setup-just from 3 to 4 (#49)
  • change: chore(deps): bump fable from 5.16.0 to 5.17.1 (#51)
  • change: chore(deps): bump fable from 5.17.1 to 5.17.2 (#55)
  • change: chore(deps): bump fable-library from 5.16.0 to 5.17.0 (#50)
  • change: chore(deps): bump fable-library from 5.17.0 to 5.17.2 (#54)
  • change: chore(deps): bump fable-library in /examples/timeflies-python (#52)
  • change: chore(deps): bump fable-library in /examples/timeflies-python (#53)
  • change: chore: Bump fable from 5.17.2 to 5.18.0 (#57)
  • change: chore: Bump fantomas from 7.0.6 to 8.0.0 (#56)
  • change: chore: Bump fantomas from 8.0.0 to 8.0.5 (#58)
  • change: chore: configure Dependabot commit messages
  • change: chore: release Fable.Actor@5.0.0-rc.12 (#60)

Architecture

  • Unchanged — 0 containers · 2 contexts · 1 edges

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.Actor 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 86bdf8b194aa120b19dd8d62dc841a4047ad87ff — 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.