Skip to content
CAI
Software that uses CAICheck a score

uber/RIBs

68.9

Adequate · 25 September 2026

24.2k

lines of production code

Kotlin

with Java

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Features

Add Android activity lifecycle delegation and coroutine testing utilities

This change introduces new infrastructure for Android and Kotlin Coroutines testing. For Android, it adds \ActivityDelegate\ and \CoreAppCompatActivity\ to allow \RibActivity\ and other activities to share a common parent and lifecycle management. For testing, it adds \RibCoroutinesRule\, \TestRibDispatchers\, and scope override utilities in the \rib-coroutines-test\ module, enabling controlled coroutine execution and dispatcher injection in tests. Additionally, the \rib-compiler-app\ module receives new annotation processing classes (\AnnotatedClass\, \InteractorAnnotatedClass\, \RibProcessor\, etc.) to handle \@RibInteractor\ annotations, accompanied by corresponding unit tests.

(repo-wide) · high confidence

Add Android demo app for Flipper integration

The Flipper demo application for Android has been added, introducing a new Android application entry point. This includes the AndroidManifest configuration, the main Activity, and the Application class that initializes Flipper and the RibTree plugin. The demo implements a RIB-based navigation flow starting with a 'Logged Out' screen for user login, which transitions to a 'Logged In' state. The logged-in state features an 'Off Game' screen and a 'Tic Tac Toe' game, allowing users to play a simple game within the demo environment.

(repo-wide) · high confidence

Add Compose-based RIB demo application

The \demos/compose\ directory now contains a complete RIB (Router-Interactor-View) demo application built with Jetpack Compose. This includes the application entry point, root activity, and a navigation hierarchy featuring a main screen that switches between logged-in and logged-out states. The logged-in state includes an 'Off Game' screen and a fully functional Tic-Tac-Toe game, demonstrating how Compose UI integrates with the RIB architecture.

demos/compose, demos/rib-workers · high confidence

Add RIB code generation and Android device management to the IntelliJ plugin

The IntelliJ plugin now includes a complete code generation system for RIBs, featuring a dialog for user input and multiple generator classes for creating Interactors, Presenters, Views, and Routers in both Java and Kotlin. Additionally, the plugin introduces an Android device repository to track connected devices and a project activity to attach the RIB project service, enabling deeper integration with Android development workflows.

tooling/rib-intellij-plugin · high confidence

Added Android Compose and Screen Stack base libraries, plus a Flipper debug plugin

Introduced new RIBs support for Android development: a Compose-based router and presenter in the \rib-android-compose\ library, a \ScreenStackBase\ interface and \ViewProvider\ base class for managing view-based screen stacks in \rib-screen-stack-base\, and a \RibTreePlugin\ for debugging RIBs via Flipper. The plugin tracks router events and provides visual overlays for debugging.

libraries/rib-android-compose, libraries/rib-screen-stack-base, tooling/rib-flipper-plugin · high confidence

Added Android demo app for memory leak detection

The memory-leaks demo now includes a complete Android application structure, including the main activity, application class, and RIB components for root, logged-in, and logged-out states. The app integrates LeakCanary to monitor for memory leaks, specifically demonstrating a potential leak in the logged-out state where a long-running RxJava subscription is not properly disposed. This provides a working example of how to set up memory leak detection in an Android app using the RIB architecture.

demos/memory-leaks · high confidence

Added RIBs testing utilities and compiler test generation

Introduced a suite of testing helpers and utilities for the RIBs framework. This includes the \InteractorTestGenerator\ which automatically generates test helper classes for annotated interactors, along with corresponding processor and test files. Additionally, new test helper objects were added for \Interactor\, \Presenter\, \Router\, and \Worker\ to simplify unit testing, alongside a \FakeComponent\ and \FakeRouter\ for mocking. A \TreeChart\ component was also added to the Flipper plugin desktop application to visualize the RIB tree structure.

(repo-wide) · high confidence

Added the Stack Nav demo application

A new Android demo application named 'Stack Nav Demo' has been added to the demos/stack-nav directory. This feature provides a functional example of a navigation stack, allowing users to push and pop screens in a hierarchical manner. The demo includes the necessary Android manifest, activity, and a complete set of Kotlin classes (including RootActivity, RootInteractor, RootRouter, and Screen components) that implement the stack navigation logic and UI.

demos/stack-nav · high confidence

Added tutorial4 sample app with RIB architecture

Added the complete source code for tutorial4, a sample Android application demonstrating the RIB (Router-Interactor-Builder) architecture. This includes the root activity and application classes, the root RIB with logged-in/logged-out states, and child RIBs for game selection, an off-game lobby, and two playable games (Tic-Tac-Toe and Random Winner). The implementation uses Dagger for dependency injection and RxJava for reactive streams, providing a full working example of the framework's patterns.

tutorials/tutorial4 · high confidence

New Android core components and lifecycle events

The \libraries/rib-android\ module introduces a suite of new classes to support Android activity lifecycle management and view routing. This includes \RibActivity\ as the base activity implementation, along with \ActivityStarter\, \IntentCreator\, \IntentFactory\, and \ViewBuilder\ to facilitate cleaner dependency injection and testing. Additionally, \ActivityLifecycleEvent\ and \ActivityCallbackEvent\ are added to expose activity lifecycle and callback events (such as \onSaveInstanceState\, \onActivityResult\, and \onNewIntent\) for reactive streams, while \XRay\ provides a debug overlay for visualizing riblet names on views.

libraries/rib-android · high confidence

New coroutine scope management with configurable lifecycle behavior

The \rib-coroutines\ library introduces new APIs for managing coroutine scopes tied to \ScopeProvider\ and \Application\ lifecycles. By default, accessing the \coroutineScope\ property after the provider has completed will throw a \LifecycleEndedException\. A new configuration option, \RibCoroutinesConfig.shouldCoroutineScopeFailSilentlyOnLifecycleEnded\, allows developers to suppress this exception and receive an immediately cancelled scope instead. The \RibDispatchers\ object provides a centralized way to configure default \CoroutineDispatcher\s for Rib scopes, and tests have been added to verify the new throwing and silent-fail behaviors.

libraries/rib-coroutines · high confidence

Repository governance and build infrastructure overhaul

The repository has been restructured with new governance files (CODE\_OF\_CONDUCT.md, CONTRIBUTING.md, and a detailed CHANGELOG.md) and updated documentation (README.md, including a notice about iOS moving to a separate repo). The project's licensing has changed from MIT to Apache 2.0, and the build system now includes a Gradle wrapper and a dedicated release script to automate versioning and publishing.

(repo-wide) · high confidence

Behavioural changes

Interactor lifecycle events now use StateFlow by default, improving ANR stacktraces

The \Interactor\ class now uses \MutableStateFlow\ for lifecycle events by default, replacing the previous \SharedFlow\ implementation. This change improves ANR stacktraces and reduces ANRs. Additionally, \RibEvents.setExtraBufferCapacity\ is now available to configure the buffer capacity for router and action events, and a new \FlowAsScope\ utility converts \SharedFlow\ of lifecycle events into a \CompletableSource\.

libraries/rib-base · high confidence

Standardized build conventions and code quality tooling for Android and Kotlin modules

The project introduces new Gradle build conventions that standardize the compilation environment and code quality checks. All Android and Kotlin modules now compile against Java 1.8 source and target compatibility while using a JDK 17 toolchain. The Android application and library conventions enforce explicit API modes, configure Spotless for consistent code formatting, and integrate Error Prone with NullAway to enforce non-nullability and other checks. Additionally, the Android application convention disables release variants in the build, and the library conventions adjust test variant configurations.

conventions · high confidence

Upgrade Gradle build system and dependencies

The project has upgraded its Gradle build infrastructure to use Gradle 8.14.3 and Android Gradle Plugin 8.13.0. This change introduces centralized version catalogs for both production and test dependencies, including updates to Kotlin, Compose, Coroutines, and other libraries, while also removing iOS-specific configurations to prepare for a separate repository.

gradle · medium confidence

Dependencies

Upgrade Android Gradle Plugin to 8.13.0 and Kotlin to 2.1.10

The project's build system has been updated to use Android Gradle Plugin 8.13.0 and Kotlin 2.1.10. This upgrade brings modern Gradle features and improved Kotlin support to the build configuration, affecting how the project is compiled and packaged. Additionally, the Gradle version catalog has been updated to reflect these new dependency versions, ensuring consistent dependency management across all modules.

(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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 49 → 69 (+20.0)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 97 (-3.1)
  • Architecture 96 → 100 (+4.4)
  • Maturity 51 → 63 (+11.6)
  • Readiness 27 → 58 (+31.0)
  • Security 76 → 91 (+15.0)

Resolved (23)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • Duplicated block (6 lines × 2) (tooling/rib-flipper-plugin/src/main/kotlin/com/uber/rib/flipper/RibTreePlugin.kt)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • LLM evaluation failed
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No exposed public API
  • …and 3 more

New (41)

  • Concentrated knowledge decay
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Duplicated block (17 lines × 2) (demos/compose/src/main/kotlin/com/uber/rib/compose/root/RootRouter.kt)
  • Duplicated block (9 lines × 2) (demos/compose/src/main/kotlin/com/uber/rib/compose/ComposeApplication.kt)
  • Duplicated block (9 lines × 2) (demos/compose/src/main/kotlin/com/uber/rib/compose/root/main/MainScope.kt)
  • Further sole-owners (lower concentration)
  • HackComment (tooling/rib-intellij-plugin/src/main/kotlin/com/uber/intellij/plugin/android/rib/ui/HierarchyBrowserBase.kt)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No ADRs found
  • No dependency advisory monitoring
  • Off-boarding risk: anonymized user #1
  • Release publish has no approval gate
  • RibTree.persistedStateReducer (cognitive 37) (tooling/rib-flipper-plugin/desktop/src/index.js)
  • RibTree.persistedStateReducer (cyclomatic 17) (tooling/rib-flipper-plugin/desktop/src/index.js)
  • …and 21 more

Architecture

  • Containers 0 added · 0 removed · contexts 12 added · 0 removed · edges 9 added · 0 removed

Added bounded contexts (12)

  • compose
  • intellij-broadcast-rib
  • rib-base
  • rib-coroutines
  • rib-coroutines-test
  • rib-flipper-plugin
  • rib-intellij-plugin
  • rib-router-navigator
  • rib-workers
  • stack-nav
  • tutorial3-completed
  • tutorial4

Added dependency edges (9)

  • compose → rib-base
  • rib-coroutines-test → rib-coroutines
  • rib-flipper-plugin → rib-base
  • rib-router-navigator → rib-base
  • rib-workers → rib-base
  • stack-nav → rib-base
  • stack-nav → rib-router-navigator
  • tutorial3-completed → tutorial4
  • tutorial4 → tutorial3-completed

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

Survey your own repository

uber/RIBs 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 25 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 e3aff84f660ac1232ffe7868fcbd51621eda277d — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.