Skip to content
CAI
Software that uses CAICheck a score

azizutku/Modular-Clean-Arch-Movie-App

62.4

Adequate · 21 September 2026

4.1k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is an Android application for browsing and managing movies, featuring a trending list, a personal watchlist, and detailed movie information. It implements an offline-first architecture using Room for local caching and Paging for efficient list loading. The system includes comprehensive test coverage with unit, instrumentation, and macrobenchmark tests to ensure reliability and performance.

How it got here

2022 — Build system modernization and performance benchmarking

8 changes.

This period focused on modernizing the project's build infrastructure by migrating to Kotlin DSL, implementing version catalogs, and upgrading Gradle. Concurrently, the team enhanced the application's user interface with dark mode and navigation features, while establishing a comprehensive benchmarking suite to measure and optimize app startup performance.

2023 — Core architecture and feature implementation

16 changes.

The project established a standardized Android build configuration and introduced a modular architecture with core, domain, and feature layers. Key features for trending movies, movie details, and watchlist management were implemented alongside comprehensive unit and instrumentation tests.

Features

Add movie detail feature with watchlist integration

The app now includes a new Movie feature that displays detailed information about a specific movie, including title, description, tagline, poster, and release year. The feature fetches data from a remote API, caches it locally, and displays it in a new fragment. Users can also add or remove the movie from their watchlist directly from the movie detail screen.

feature/movie/src/main/kotlin/com/azizutku/movie/feature/movie · high confidence

Add splash screen, bottom navigation, and dark theme support

The app now displays a splash screen on launch using the Android SplashScreen API, replacing the previous blank or default launch state. A bottom navigation bar has been added to the main activity, allowing users to switch between the Trending and Watchlist sections. The app also supports a dark theme, with specific color definitions for the bottom navigation states and splash screen background in the night resource directory. Additionally, the app icon has been updated with a new foreground drawable and background color.

app/src · high confidence

The app now includes a new 'Trending' feature that displays a list of popular movies. This feature implements an offline-first architecture using Room for local caching and Android Paging 3 for efficient list loading. Users can browse trending movies with seamless pagination, and the UI includes loading and error states with retry options. The implementation includes data models, repository, use cases, and UI components specific to the trending module.

feature/trending/src/main/kotlin/com/azizutku/movie/feature/trending · high confidence

Added cold, warm, and hot startup benchmarks and baseline profile generator

The benchmark module now includes tests for cold, warm, and hot app startup times, allowing users to measure startup performance under different conditions. Additionally, a BaselineProfileGenerator has been added to create baseline profiles that can be used to improve app startup speed. These changes provide new ways to evaluate and optimize the app's startup performance.

benchmark · high confidence

Added core database layer with Room entities and DAOs

The app now includes a local database layer using Room to persist movie data. This change introduces the MainDatabase configuration, along with data models (MovieEntity, TrendlistEntity, etc.) and Data Access Objects for managing trending movies, watchlists, and remote keys. This provides the foundation for offline data storage and caching within the core/database module.

core/database · high confidence

New macrobenchmark test suites have been added for the Movie, Trending, and Watchlist features. Each suite includes action helpers and JUnit4 test classes that measure frame timing metrics during cold starts and scrolling interactions, running against both None and Partial (baseline profile) compilation modes to evaluate app performance.

benchmark/src/main/java/com/azizutku/movie/benchmark/features/movie, benchmark/src/main/java/com/azizutku/movie/benchmark/features/trending, benchmark/src/main/java/com/azizutku/movie/benchmark/features/watchlist · high confidence

Introduce common base classes and network result handling

Added new base classes in core/common for managing UI state and loading conditions: BaseListAdapter, BaseViewHolder, BaseViewModel, ErrorOwner, and LoadingOwner. These provide shared functionality for RecyclerView adapters, view holders, view models, and flow-based error/loading states. Also added network-related utilities including NetworkException with specific error codes, a ResultCall wrapper for Retrofit to return Kotlin Result types, and a corresponding CallAdapter factory. Additionally, utility extensions for Booleans and navigation, along with theme management and DI modules, were introduced to support the new architecture.

core/common · high confidence

Introduce the Watchlist feature module

Users can now view and manage their personal movie watchlist. This change introduces the complete Watchlist feature, including the UI (fragment, view model, and adapter) to display movies, along with the data layer (repository, data source, and mapper) to handle adding, removing, and retrieving movies from local storage.

feature/watchlist/src/main/kotlin/com/azizutku/movie/feature/watchlist · high confidence

Introduce watchlist domain layer with repository and use cases

Added the core domain layer for the watchlist feature, including the WatchlistRepository interface and four use cases (AddMovieToWatchlistUseCase, CheckMovieInWatchlistUseCase, RemoveMovieFromWatchlistUseCase) that expose Flow-based APIs for managing a user's watchlist.

core/domain · high confidence

New Android build convention plugins for application, library, and benchmark modules

The build system introduces a set of new convention plugins in the build-logic module to standardize Android project configuration. A new AndroidApplicationConventionPlugin configures application modules with standard build types (including a new Benchmark type), packaging rules, and test dependencies. AndroidLibraryConventionPlugin sets up library modules with similar base configurations and adds default JaCoCo code coverage support. AndroidFeatureConventionPlugin provides a template for feature modules, automatically wiring common dependencies (such as Hilt, Room, and Coroutines) and applying KSP. Additionally, specific plugins are introduced for Hilt (AndroidHiltConventionPlugin), Room (AndroidRoomConventionPlugin), Detekt (DetektConventionPlugin), and Git Hooks (GitHooksConventionPlugin), each encapsulating specific build logic previously scattered or manually configured. This refactoring centralizes build configuration, making it easier to maintain and update Android-specific settings across the project.

build-logic/convention/src/main/kotlin · high confidence

New build conventions for product flavors, code analysis, and coverage

The build system now includes new convention plugins and extensions to standardise build configurations. Product flavors are now configured via a new \BuildProductFlavor\ extension, which defines dimensions and applies suffixes for application IDs and version names. Code analysis is standardised with a new \configureDetekt\ extension that sets up HTML, XML, and text reports. Coverage is handled by two new plugins: \configureJacoco\ for unit test reporting and \configureKover\ for Kotlin code coverage, both applying specific exclusions for generated and framework classes. Additionally, Git hooks are automatically installed via a new \configureGitHooks\ extension, and general Kotlin Android configuration is centralised in \configureKotlinAndroid\ to enforce Java 17 and Kotlin compiler options.

build-logic/convention/src/main/kotlin/com/azizutku/movie/extensions · medium confidence

New core UI components and dark theme support

The core/ui module now includes foundational UI building blocks: a BaseFragment for standardizing view binding and lifecycle management, along with Dagger Hilt modules to provide error handling and dialog instances. The app introduces reusable UI elements including an AlertDialog and LoadingDialog, a toolbar layout, and spacing utilities for RecyclerViews. Additionally, a complete dark theme is added via night-mode resource directories, defining specific colors, styles, and typography for the dark mode experience.

core/ui · high confidence

Behavioural changes

Added pre-commit hook for static code analysis

A new pre-commit git hook has been added to the repository, automatically running the Detekt static analysis tool on each commit. This ensures that code quality checks are enforced before changes are committed, preventing the introduction of static analysis issues.

scripts · high confidence

Centralized build configuration and build type definitions

The project introduces a new centralized build configuration in the build-logic module, defining constants for Android SDK versions (compileSdk and targetSdk 34), application ID, versioning, and test instrumentation runners. It also introduces structured build type definitions for debug, release, and benchmark configurations, including minification, resource shrinking, and signing settings.

build-logic/convention/src/main/kotlin/com/azizutku/movie · high confidence

New build utility functions for local properties, managed devices, and version stability

Added three new Kotlin utility files to the build-logic module: BuildUtils to read local.properties, GradleManagedDevices to configure Android virtual devices for testing, and VersionUtils to detect non-stable versions. These changes support the migration to Gradle composite builds and the addition of new Gradle managed devices for generating baseline profiles.

build-logic/convention/src/main/kotlin/com/azizutku/movie/utils · medium confidence

Update Gradle wrapper and add editorconfig for Kotlin code style

The Gradle wrapper script (gradlew) has been updated to a newer version, which changes the shell script logic and Windows batch file syntax. Additionally, an .editorconfig file was added to enforce trailing comma rules for Kotlin (.kt) and Kotlin script (.kts) files, ensuring consistent code style across the project.

(repo-wide) · high confidence

Updated ProGuard rules for Kotlin serialization and benchmarking

The app's ProGuard configuration was updated to preserve Kotlin serialization metadata, including companion object fields and serializer methods for serializable classes, as well as runtime annotations for polymorphic serialization. Additionally, rules were added to keep generic signatures for suspend functions and the Result class required by the Retrofit adapter, while suppressing warnings for missing SSL-related classes.

app · medium confidence

Test coverage

Added Android instrumentation tests for the Watchlist feature; Added Android instrumented tests for the trending feature; Added test utilities and fake implementations in core/testing; Added unit tests for Trending and Watchlist features; Added unit tests for the Movie feature.

Dependencies

Migrate Android build configuration to Kotlin DSL and version catalogs

The project's build system has been modernized by converting all \build.gradle\ files to Kotlin DSL (\build.gradle.kts\) and introducing a centralized \libs.versions.toml\ version catalog. This change replaces direct dependency declarations with typed references (e.g., \libs.androidx.constraintlayout\), enabling consistent version management across modules. Additionally, the \buildSrc\ directory has been restructured into a \build-logic\ directory containing convention plugins, which standardizes the configuration of Android libraries, features, and application modules. The \settings.gradle\ has also been converted to Kotlin DSL, and Gradle properties have been updated to enable build caching and increased memory allocation.

(dependencies) · high confidence

Updated Gradle wrapper to version 8.8

The project's Gradle wrapper has been upgraded from version 7.5 to 8.8, bringing in the latest build tooling and associated configuration updates such as network timeout and distribution validation settings.

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 59 → 62 (+3.3)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 99 → 100 (+0.5)
  • Architecture 100 → 93 (-6.8)
  • Maturity 46 → 49 (+2.8)
  • Readiness 57 → 57 (+0.0)
  • Security 65 → 93 (+28.0)
  • Domain Modelling 100 → 85 (-15.1)

Resolved (13)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (6 lines × 2) (build-logic/convention/src/main/kotlin/AndroidBenchmarkConventionPlugin.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)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (16)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • 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)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Medium: 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

azizutku/Modular-Clean-Arch-Movie-App 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 21 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 d6e8a01a41d1f61fc1b233cb32e17505c0707a20 — 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-fa71c66cabd8.