Skip to content
CAI
Software that uses CAICheck a score

actix/actix

74.2

Strong · 29 September 2026

7.7k

lines of production code

Rust

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Rust-based actor framework, primarily centered around the \actix\ crate, which provides primitives for building concurrent and distributed applications using message passing. It includes a pub/sub message broker (\actix-broker\) for inter-actor communication and procedural macros (\actix-derive\) to simplify message handling and response types. The codebase has been significantly restructured to remove legacy Python and early Rust runtime dependencies, focusing instead on modern async patterns, weak reference management, and comprehensive testing utilities.

How it got here

2017 — Rust migration and legacy cleanup

6 changes.

The project underwent a significant restructuring to migrate from Python-based tooling and legacy Rust components to a modern Rust 2021 workspace. This involved removing the deprecated \ctx\ async library, \fectl\ process manager, and \tokio-core\ dependencies in favor of an updated actor framework.

2020–2021 — actor framework restructuring and broker introduction

16 changes.

This period focused on restructuring the core Actix actor framework by introducing new address-based communication primitives, a public context API, and comprehensive futures and streams modules. It also saw the initial release of the actix-broker crate for pub/sub messaging and the addition of the actix-derive crate to simplify macro-based message handling. These changes were supported by extensive integration tests and updated examples to align with the new ecosystem.

Features

Initial release of actix-broker message broker

This change introduces the \actix-broker\ crate, providing a pub/sub message broker for the Actix actor framework. It adds \SystemService\ and \ArbiterService\ brokers that track subscriptions and route messages to actors. The library exposes \BrokerSubscribe\ and \BrokerIssue\ traits, allowing actors to subscribe to messages (with optional delivery of the last known message via \subscribe\_sync\) and issue messages asynchronously or synchronously to all subscribers on either the system-wide or arbiter-specific broker.

actix-broker/src · high confidence

Introduce actix-derive crate with Message and MessageResponse macros

The new actix-derive crate provides procedural macros to simplify actor message handling. The \#\[derive(Message)\] macro allows users to specify a custom result type via the rtype attribute, supporting multiple syntaxes including quoted strings, paths, and the result = TYPE form. The \#\[derive(MessageResponse)\] macro automatically implements the MessageResponse trait for types, enabling them to be sent back to actors via oneshot channels. Additionally, the crate re-exports the \#\[actix::main\] and \#\[actix::test\] attributes to bootstrap the Actix system for async entry points and tests.

actix-derive/src · high confidence

New ActorFuture combinator traits and implementations

The \actix::fut::future\ module has been restructured to provide a comprehensive set of combinators for \ActorFuture\. This change introduces the \ActorFutureExt\ trait, which adds \map\, \then\, \timeout\, and \boxed\_local\ methods to allow chaining computations that have access to the actor and its context. It also implements \ActorFuture\ for \Either\ (to handle alternative futures), \Box\ (for dynamic dispatch), and \Ready\ (for immediate results), and adds specific combinator types like \Map\, \Then\, and \Timeout\ to support these operations.

actix/src/fut/future · high confidence

New ActorStream combinators and traits

The \actix/src/fut/stream\ module now provides a comprehensive set of combinators for the \ActorStream\ trait, allowing users to transform and consume actor-driven streams. New methods include \map\ for synchronous item transformation, \then\ for chaining asynchronous operations, \fold\ for accumulating results, \collect\ for gathering items into a collection, and \finish\ to wait for stream completion. Filtering is supported via \take\_while\ and \skip\_while\ with asynchronous predicates, and \timeout\ allows setting duration limits on stream items. These changes introduce the \ActorStream\ and \ActorStreamExt\ traits along with their underlying implementations, replacing previous patterns for handling streams within actors.

actix/src/fut/stream · high confidence

New Mocker utility actor for testing

A new Mocker actor has been added to the actix actors module. This utility wraps an existing actor and intercepts all messages it receives, allowing developers to provide custom mock responses via a closure. This enables easier unit testing by replacing real actor instances with the mocker in test builds, simplifying the verification of actor interactions without needing the actual underlying implementation.

actix/src/actors · high confidence

New examples for sync actors, mocking, and weak references

The actix/examples directory now includes several new demonstration programs: a ping/pong example for basic actor communication, a fibonacci example showing how to run synchronous actors on a thread pool for CPU-bound tasks, a ring benchmark for performance testing, and a weak\_addr/weak\_recipient example demonstrating how to manage client lifecycles with weak references. Additionally, a mock.rs example illustrates how to use the Mocker utility to test actors in isolation by mocking system services.

actix/examples · high confidence

Removals

Removal of legacy fectl worker and application runner code

The \fectl\ package's internal worker and application runner implementations have been removed. This includes the deletion of the \fectl\ entry-point script, the \AiohttpRunner\ and its configuration settings, the base \Worker\ class, and the specific \AsyncioWorker\ and \GeventWorker\ implementations. Consequently, the \fectl\ command-line tool and its associated async/gevent worker capabilities are no longer available in this location.

fectl · high confidence

Removal of legacy src components and tokio-core runtime

The \src\ directory has been completely removed, eliminating the legacy implementation that relied on \tokio-core\, \futures\ 0.1, and \mio\. This change removes the entire codebase for the master process, client, worker management, and configuration handling, effectively stripping the library of its previous synchronous and early asynchronous runtime dependencies.

src · high confidence

Removal of the legacy \`ctx\` async service library

The entire \ctx\ crate has been removed, deleting all associated modules including \ctx.rs\, \ctxframed.rs\, \framed.rs\, and the \fut\ subdirectory containing future combinators like \and\_then\, \map\, and \then\. This eliminates the legacy context-aware service framework that previously relied on \tokio\_core\ and \futures\ 0.1, along with traits such as \ContextAware\ and \FramedContextAware\ and their corresponding service builders.

ctx · high confidence

Repository restructuring and cleanup

The repository has been restructured to remove legacy artifacts and standardize configuration. The Python-based process manager 'fectl' and its associated build scripts (setup.py, build.rs) and configuration files (fectl.toml) have been removed. Documentation has been consolidated, with the old README.rst and CHANGES.rst deleted in favor of a symlinked README.md. License files have been renamed for clarity (LICENSE.txt to LICENSE-APACHE, addition of LICENSE-MIT), and a new Code of Conduct has been added. CI and formatting tooling have been updated with new configuration files (.codecov.yml, .prettierrc.yml, .rustfmt.toml, zizmor.yml) and a justfile for build automation, while the .gitignore has been updated to reflect the new project structure.

(repo-wide) · high confidence

Behavioural changes

Actix 0.13.5 release with Registry improvements and MSRV update

This release updates the minimum supported Rust version (MSRV) to 1.88 and introduces new methods to the Registry API: \Registry::try\_get()\ and \Registry::get\_or\_start\_default()\. The existing \Registry::get()\ method is now deprecated, and the \ArbiterService\ bound has been relaxed for \Registry::query()\ and \Registry::set()\, allowing greater flexibility when using the registry without requiring specific arbiter service implementations.

actix · high confidence

Actix actor framework restructured with new try-future adapters and public context API

The actix crate has been reorganized into a new modular structure, introducing dedicated modules for context implementation, context items, and a new \try\_future\ subsystem that adds \ActorTryFuture\ and \ActorTryFutureExt\ traits with \and\_then\, \map\_ok\, and \map\_err\ adapters for handling Result-returning actor futures. The \Context::new()\ constructor is now public, allowing users to create and manage actor contexts explicitly before running them, and the \Clock\ module now re-exports time utilities from \actix\_rt\. Additionally, the \Registry\ API has been updated to allow usage without requiring \ArbiterService\, and the \ResponseChannel\ trait has been removed in favor of direct message handling patterns.

actix/src · high confidence

Introduce new address-based actor communication primitives

The \actix/src/address\ module has been replaced with a new implementation that introduces \Addr\<A\>\ and \WeakAddr\<A\>\ as the primary handles for actor communication, replacing the previous \Recipient\ and \ResponseChannel\ abstractions. This change adds support for weak references to actors via \WeakAddr\, allowing users to hold non-owning references that do not prevent an actor from being dropped. The new system also includes a \MailboxError\ enum to explicitly distinguish between closed mailboxes and message delivery timeouts, and utilizes a new \MsgRequest\ future type for asynchronous message sending with optional timeout support.

actix/src/address · high confidence

New actix futures module with ActorFuture and ActorTryFuture traits

A new \actix/src/fut\ module has been introduced to provide custom \Future\ and \Stream\ implementations with Actix support. This module exposes key traits and utilities including \ActorFuture\, \ActorFutureExt\, \ActorTryFuture\, \ActorTryFutureExt\, \ActorStream\, and \ActorStreamExt\, along with helper functions like \wrap\_future\, \wrap\_stream\, and result constructors (\ok\, \err\, \ready\, \result\). This change reorganizes and exposes the asynchronous execution primitives used by Actix actors.

actix/src/fut · high confidence

Updated broker examples for actix-web 4 and actix-rt 2 compatibility

The example applications in the actix-broker crate have been updated to work with the newer actix-web 4 and actix-rt 2 ecosystems. The 'basic' example now demonstrates message passing using the updated async/sync subscription patterns compatible with the new runtime, while the new 'actix-web' example shows how to integrate the broker with an actix-web server, specifically illustrating how to issue messages asynchronously from a web handler and subscribe to them within an actor.

actix-broker/examples · high confidence

actix-broker 0.4.4 release with MSRV bump and performance improvements

The actix-broker crate has been updated to version 0.4.4, raising the Minimum Supported Rust Version (MSRV) to 1.88 and introducing performance improvements for broker message handling. This release also includes a fix for at-least-once delivery guarantees on the IssueAsync method (introduced in 0.4.3) and adds benchmarking infrastructure to measure broker performance under varying actor and message loads.

actix-broker · high confidence

actix-derive 0.6.2 release with MSRV and quoted rtype fix

The actix-derive crate has been updated to version 0.6.2, raising the Minimum Supported Rust Version (MSRV) to 1.88. This release also includes a fix for compile failures that occurred when using the quoted rtype form (e.g., \\#\[rtype("()")\]\) in the \\#\[derive(Message)\]\ macro.

actix-derive · high confidence

Test coverage

Added comprehensive test suite for actix core components; Added integration tests for message delivery and broker interaction; Added tests for Message rtype result and compile-time macro validation; Removed obsolete asyncio test file.

Dependencies

Migrate to Rust 2021 edition and raise MSRV to 1.88

The project has upgraded its Rust edition to 2021 and increased the Minimum Supported Rust Version (MSRV) to 1.88 across the \actix\, \actix-broker\, and \actix-derive\ crates. This change is part of a broader restructuring that moves the codebase into a Cargo workspace, replacing the previous \fectl\ binary with a multi-crate structure for the actor framework and its utilities.

(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 76 → 74 (-2.2)
  • Rubric changed (rubric-2026.09.8 → rubric-2026.09.17) — scores are not directly comparable.

Lenses

  • Code Health 95 → 95 (+0.0)
  • Architecture 100 → 100 (+0.0)
  • Maturity 59 → 59 (+0.0)
  • Readiness 87 → 79 (-8.1)
  • Security 92 → 95 (+3.1)

Resolved (3)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Off-boarding risk: anonymized user #1

New (10)

  • Ambiguous and inconsistent naming for registry lookup operations. 'get', 'try_get', and 'query' are used across Registry and SystemRegistry with unclear distinctions. 'try_get' returning Addr (not Result) suggests it might panic or return a default, which is confusing.
  • Duplicate intent with 'stop' and 'terminate'. It is unclear what the difference is between stopping and terminating an actor. This creates confusion for API users about which method to use for graceful shutdown vs immediate termination.
  • Inconsistent naming for actor creation/starting operations. 'start' vs 'start_default' vs 'create' vs 'start_in_arbiter'. The distinction between 'start' and 'start_default' is unclear without documentation, and 'create' is used in Actor but 'start' in Supervisor/SyncArbiter.
  • Inconsistent parameters for try_send. AddressSender.try_send takes an extra 'park: bool' parameter, while Addr.try_send and Recipient.try_send do not. This suggests different underlying behaviors or capabilities that are not clearly distinguished by name.
  • Inconsistent return types for non-blocking send operations. 'do_send' returns 'Result' on AddressSender but no Result (likely void or unit) on Addr and Recipient. This forces different error handling patterns for equivalent operations.
  • Inverted test pyramid
  • Off-boarding risk: anonymized user #1
  • Outdated: actix-macros
  • Outdated: smallvec
  • Verbosity and inconsistency in broker message handling. The proliferation of '_async' and '_sync' suffixes, combined with '_system' and '_arbiter' variants, creates a large and confusing API surface. The distinction between 'async' and 'sync' is not always clear (e.g., does 'sync' block?).

Changes since last survey

  • 9 commits — 8 feature/other, 1 fixes

By area

  • (root) — 5 commits
  • .github/workflows — 4 commits

Notable commits

  • fix: fix: raise MSRV to 1.88 to match actix-rt
  • change: chore(deps): bump actions-rust-lang/setup-rust-toolchain (#720)
  • change: chore(deps): bump rui314/setup-mold (#719)
  • change: chore(deps): bump taiki-e/install-action from 2.85.4 to 2.87.10 (#718)
  • change: chore(deps): bump the all group across 1 directory with 9 updates (#722)
  • change: chore(deps): bump zizmorcore/zizmor-action from 0.6.1 to 0.6.4 (#717)
  • change: chore: update -net deps
  • change: chore: update -rt in lockfile
  • change: chore: update gitignore

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

Survey your own repository

actix/actix 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 29 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit dfbde581d566dbdf3b50e8bbe84233e4fbad83f7 — the exact code this score is about.
  • Scored under rubric-2026.09.17 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fbec9b1e08c2.