Skip to content
CAI
Software that uses CAICheck a score

Ezike/Baking-App-Kotlin

63.1

Adequate · 22 September 2026

3.4k

lines of production code

Kotlin

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is an Android application for browsing and viewing recipes, structured with a clean architecture that separates domain, data, and presentation layers. It utilizes the Model-View-Intent (MVI) pattern and Hilt for dependency injection to manage UI state and user interactions. The system fetches recipe data from a remote API, handles video playback, and provides a consistent UI for displaying recipes, ingredients, and steps.

Features

Add remote layer for fetching recipe data

Introduced a new remote data source that fetches recipe information from a remote API. This includes an \ApiService\ interface for network calls, an \ApiServiceFactory\ to configure the HTTP client, and \RecipeRemoteImpl\ to execute the requests. Additionally, mappers (\RecipeRemoteMapper\, \IngredientRemoteMapper\, \StepRemoteMapper\) convert remote models into local entities, supported by corresponding unit tests.

libraries/remote · high confidence

Add reusable empty-state view component

A new \SimpleEmptyStateView\ is introduced in the common views module, providing a consistent UI for displaying empty or error states. This custom view allows screens to display a title, caption, and a retry button, with configurable visibility for the title and button. The component includes a default error icon and a styled retry button, enabling consistent user feedback across the application when no data is available.

common/views · high confidence

Add step detail view for recipe steps

Introduces a new StepDetailFragment and associated presentation layer (ViewModel, state machine, and UI) that displays a recipe step's description and video. Users can navigate between steps using the new Next and Previous buttons, with the UI updating to show the current step's content and progress indicator.

features/recipes/stepDetail · high confidence

Added data layer with entity models, mappers, and repository implementation

The data library now includes the core data models (RecipeEntity, IngredientEntity, StepEntity) and their corresponding mappers (RecipeEntityMapper, IngredientEntityMapper, StepEntityMapper) to convert between data and domain models. A new RecipeRepositoryImpl is provided to fetch recipes from a remote source and map them to domain objects. The change also adds comprehensive unit tests for the mappers and the repository, along with fake implementations and dummy data to support the test suite.

libraries/data · high confidence

Added recipe data models and mappers

The recipes feature now includes a new model layer containing data classes for Recipe, Ingredient, and Step, along with corresponding mappers to convert between domain and model representations. This enables the application to properly handle recipe data structures internally.

features/recipes/model · high confidence

Introduce Android presentation module with core infrastructure

The presentation-android module has been added to the project, providing the Android-specific layer for the application's UI. This includes the ThreadedViewModel utility for managing StateMachine threading, along with essential configuration files such as the AndroidManifest.xml, ProGuard rules, and build exclusions.

presentation-android · medium confidence

Introduce recipe detail screen with MVI architecture

Added a new recipe detail feature that displays a recipe's ingredients and steps in a unified list. The implementation uses a Model-View-Intent (MVI) architecture, featuring a \RecipeDetailViewModel\ backed by a \RecipeDetailStateMachine\ to manage state. The UI is driven by a \RecipeDetailFragment\ that observes state changes and updates the \IngredientStepAdapter\ to render headers, ingredients, and steps. Dependency injection is handled via Hilt, with a dedicated \RecipeDetailComponent\ and \PresentationModule\ binding the action, intent, and state reducer implementations.

features/recipes/recipeDetail · high confidence

Introduce video player feature with state persistence

A new video player feature has been added to the application, introducing a dedicated \VideoPlayer\ component that integrates ExoPlayer for video playback. The implementation includes a \VideoPlayerState\ data class that tracks playback progress, window index, and video URL, ensuring that playback state is preserved across configuration changes and properly reset when a new video is selected. The player supports full-screen expansion and manages lifecycle events to maintain smooth playback and state consistency.

features/videoPlayer · high confidence

Introduced MVI architecture interfaces for state management

Added a new MVI (Model-View-Intent) framework within the presentation layer, including interfaces for ViewAction, ViewIntent, ViewResult, and ViewState, along with an abstract StateMachine class to handle intent processing and state reduction. This provides a structured way to manage UI state and user interactions through a unidirectional data flow.

presentation/src/main/java/com/example/eziketobenna/bakingapp/presentation/mvi · high confidence

Introduced MVI-based recipe list feature with state management and UI components

Added a new Recipe feature module implementing a Model-View-Intent architecture. This includes the RecipeFragment, RecipeViewModel, and associated state classes (RecipeViewState, RecipeViewIntent, RecipeViewAction) to manage the recipe list's lifecycle. The update introduces a state machine (HomeStateMachine) and processors to handle data fetching, loading, and error states, wired via Dagger/Hilt dependency injection. The UI layer now displays a list of recipes using a custom adapter and handles empty, loading, and error states, providing a structured way to view and interact with recipe data.

features/recipes/recipe · high confidence

Introduces domain layer with recipe data models and use cases

The domain layer is established with new data models for Recipe, Ingredient, and Step, alongside a RecipeRepository interface and a FetchRecipes use case that retrieves recipe data as a Flow. A base FlowUseCase abstract class and a PostExecutionThread interface for coroutine dispatchers are also added to support the new domain logic.

libraries/domain/src/main · high confidence

Project initialization with Apache 2.0 license and Android build configuration

The repository was initialized with a new Apache 2.0 license file, a README detailing the Baking App's features (Kotlin, MVI, Hilt, etc.), and an updated .gitignore for Android/Gradle artifacts. Additionally, the gradlew script was made executable.

(repo-wide) · high confidence

Behavioural changes

Centralizes build configuration and dependency management

The project now uses a centralized build script in the buildSrc directory to manage dependencies and build types. This includes defining versions for AndroidX, UI libraries, networking, dependency injection (Dagger Hilt), and testing frameworks, alongside reusable Gradle plugins for Kotlin libraries and code formatting.

buildSrc · medium confidence

Core module refactored with new Hilt dependency injection and lifecycle-aware utilities

The core module has been restructured to support the new Hilt SingletonComponent for application-level bindings, introducing a dedicated CoreComponent and associated DI modules (Data, Executor, Factory, ImageLoader, Remote) that replace the previous dependency injection setup. This includes new abstractions and implementations for image loading, remote API services, and coroutine-based executors. Additionally, the update adds lifecycle-aware flow observation via LifecycleFlow, a ViewModelFactory for assisted injection, and ViewBinding delegates to simplify fragment view management, while also introducing extension functions for safe channel offering and view inflation.

core · medium confidence

Introduces SingleEvent and ViewEvent for one-shot UI events

Added SingleEvent and ViewEvent classes to the presentation layer to model one-shot events, such as snackbars or navigation, ensuring they are consumed only once and do not reappear after configuration changes like screen rotation.

presentation/src/main/java/com/example/eziketobenna/bakingapp/presentation/event · high confidence

Migrated to Material Components and Hilt with new navigation architecture

The app's UI and architecture have been updated to use Material Components (replacing AppCompat) and Hilt for dependency injection. This introduces a new navigation graph defining flows between the Recipe list, Recipe Detail, and Step Detail screens. The main activity now uses a NavigationHost fragment, and the application class is registered in the manifest to support Hilt. Additionally, the app now requests INTERNET and ACCESS\_NETWORK\_STATE permissions, and a back-arrow icon is added for the toolbar.

app/src · medium confidence

Updated ProGuard configuration file to reference Kotlin build script

The ProGuard rules file (proguard-rules.pro) was updated to reflect that the project's build configuration has migrated from the standard Groovy-based build.gradle to the Kotlin-based build.gradle.kts. This ensures the comment in the rules file accurately describes the location of the proguardFiles setting.

app · high confidence

Test coverage

Added domain layer test infrastructure; Added domain layer tests for recipe fetching; Added test utilities for coroutine and navigation testing; Added tests for the base domain use-case infrastructure; Added unit tests for SingleEvent utility; Added unit tests for domain executor components.

Dependencies

Migrated build system from Groovy to Kotlin DSL

The project's build configuration has been converted from the traditional Groovy-based Gradle scripts to Kotlin DSL (build.gradle.kts). This change introduces a more type-safe and modern build script structure, replacing the legacy Groovy files with Kotlin equivalents across the root, app, and feature modules.

(dependencies) · high confidence

Upgraded Gradle wrapper to version 7.0

The project's Gradle wrapper has been updated from version 4.6 to 7.0-milestone-1. This upgrade brings the build system to a newer version of the Gradle build tool, which may affect build performance, compatibility with newer Android Gradle Plugin versions, and the availability of new build features.

gradle · 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 65 → 63 (-1.7)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 100 (-0.0)
  • Architecture 100 → 95 (-4.6)
  • Maturity 54 → 54 (+0.0)
  • Readiness 57 → 50 (-7.0)
  • Security 85 → 95 (+9.7)

Resolved (8)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (9 lines × 2) (features/recipes/stepDetail/src/main/java/com/example/eziketobenna/bakingapp/stepdetail/presentation/factory/StepDetailViewStateFactory.kt)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Test reliability not included
  • dormant codebase — no living knowledge left to concentrate

New (11)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no licence statement (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (11 lines × 2) (features/recipes/stepDetail/src/main/java/com/example/eziketobenna/bakingapp/stepdetail/presentation/factory/StepDetailViewStateFactory.kt)
  • 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
  • Workflow token permissions not restricted

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

Survey your own repository

Ezike/Baking-App-Kotlin 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 22 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 ba1ee513d08f9d02141f914e3e58abde1abe4c14 — 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-821afab8930d.