Skip to content
CAI
Software that uses CAICheck a score

cem256/manga_clean_arch

58.9

Adequate · 21 September 2026

2.2k

lines of production code

Dart

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is a Flutter-based manga browsing application that allows users to search for titles, view popular content, and manage a local favorites list. It implements a clean architecture with distinct data, domain, and presentation layers, utilizing the BLoC pattern for state management. The system supports internationalization, dynamic theming, and local caching via Hive, with comprehensive unit testing for its core features.

Features

Add custom error and network image widgets

Users will now see a dedicated error display for network, unknown, and null response failures, each showing a localized message and a retry button. Additionally, image loading is handled by a new custom network image widget that provides placeholders and error states.

lib/app/widgets/error · high confidence

The popular feature now includes the presentation layer using the BLoC pattern. This adds the core logic for fetching and managing the state of popular manga, including handling loading, success, and failure states, as well as pagination support for infinite scrolling.

lib/feature/popular/presentation/bloc · high confidence

Added app initialization and animated theme switch widget

Users can now experience an animated transition when switching between light and dark themes, driven by a new Lottie-based widget. The application startup process has been consolidated into a dedicated initializer that sets up the BLOC observer, local storage, screen orientation, Hive, dependency injection, and localization.

lib/app/initializer, lib/app/widgets/animation · medium confidence

Added custom grid view widget

Introduced a new \CustomGridView\ widget in \lib/app/widgets/grid/custom\_grid\_view.dart\. This widget renders a grid of manga cards using \GridView.builder\, featuring a fixed cross-axis count of 2, a child aspect ratio of 3/4, and adaptive spacing. It supports infinite scrolling via a \ScrollController\ and displays a loading indicator when the end of the list is reached.

lib/app/widgets/grid · high confidence

Added local favorites persistence via Hive cache

Users can now save and retrieve their favorite manga items locally on the device. This change introduces a new favorites feature layer, including a \FavoritesCacheClient\ that registers Hive adapters for \MangaEntity\ and related models, a \FavoritesLocalDataSource\ for direct cache interactions, and a \FavoritesRepositoryImpl\ that exposes \getFavorites\ and \addOrRemoveItem\ operations. The domain layer includes a \FavoritesRepository\ interface and corresponding use cases (\UCGetFavorites\, \UCAddOrRemoveFavorite\) to manage favorite status, ensuring that favorite items are persisted and accessible even without network connectivity.

lib/feature/favorites/data · high confidence

A new remote data source implementation was added to fetch popular manga titles from the API. The \PopularRemoteDataSource\ interface and its \PopularRemoteDataSourceImpl\ class handle the network request using \NetworkClient\, mapping the API response to a list of \MangaModel\ objects. This change introduces the specific logic for retrieving popular content, including error handling for null responses and network exceptions.

lib/feature/popular/data/datasources · high confidence

Added search functionality for manga

Users can now search for manga by query. This change introduces the complete data and domain layers for the search feature, including the remote data source that fetches manga from the API, the repository implementation that maps the response to entities, and the use case that exposes the search capability to the rest of the application.

lib/feature/search/data · high confidence

Added search input field widget

A new search text field widget has been introduced to the search feature. It provides a Cupertino-style search input with an autofocus, a prefix search icon, and a suffix clear icon. The widget manages a text controller and integrates with the SearchBloc by emitting SearchQueryChanged and SearchFieldCleared events, allowing users to enter and clear search queries.

lib/feature/search/presentation/widgets · high confidence

Centralized app constants and configuration

The application now uses dedicated constant files to manage asset paths, cache entity types, animation durations, and API endpoints. This includes a new theme switch animation asset, specific cache identifiers for manga, images, and genres, standardized duration definitions for UI animations, and updated API endpoints for popular and search features.

lib/app/constants · high confidence

Core infrastructure and utilities for caching, logging, and UI layout

The lib/core directory now includes a new abstract CacheClientInterface for managing local data storage via Hive, a singleton LoggerUtils class for structured application logging, and a CustomBlocObserver to log Bloc lifecycle events. Additionally, the codebase introduces utility classes for event transformation (debounce and throttle for Flutter BLoC events) and expands the BuildContext extension with comprehensive padding and theme accessors, enabling more consistent UI layout and debugging across the application.

lib/core · high confidence

Added the implementation of the PopularRepository interface, which handles fetching a list of popular manga from the remote data source. The new PopularRepositoryImpl class manages network calls using Dio, mapping remote data to domain entities and handling specific failure cases like network errors, null responses, and unknown exceptions.

lib/feature/popular/data/repositories · high confidence

Added new data model classes to the popular feature's data layer, including GenreModel, ImageModel, JpgModel, and MangaModel. These classes handle JSON deserialization and provide conversion methods to map raw API responses into domain entities, establishing the data structure for the popular manga list.

lib/feature/popular/data/models · high confidence

Adds new domain entities (MangaEntity, GenreEntity, ImageEntity, JpgEntity) and a repository interface (PopularRepository) to support fetching popular manga. Includes a use case (UCGetPopularMangas) that delegates to the repository, establishing the core data models and access contract for this feature.

lib/feature/popular/domain · high confidence

New build and localization automation scripts

Added three new shell scripts to automate common development and build tasks. The android\_build.sh script streamlines building Android artifacts, allowing users to generate either an App Bundle or an APK with specified version names and numbers, and automatically opens the output directory. The build\_runner.sh script executes the Dart build runner to generate code from data models. The localization.sh script generates Dart code for English localizations from translation files, supporting the app's internationalization workflow.

scripts · high confidence

Search functionality implemented via BLoC pattern

A new search feature has been added to the application, implemented using the BLoC (Business Logic Component) pattern. This includes the core \SearchBloc\ which handles \SearchQueryChanged\ and \SearchFieldCleared\ events, along with corresponding \SearchEvent\ and \SearchState\ classes to manage the loading, success, failure, and no-result states for manga search results.

lib/feature/search/presentation/bloc · high confidence

Behavioural changes

App initialization, localization, and theme management

The application now initializes via AppInitializer and wraps the root widget with EasyLocalization for English translations, enabling locale-aware UI text. A new AppL10n configuration defines supported locales and translation paths. The main entry point also integrates a ThemeCubit to manage light/dark mode, and registers FavoritesBloc and ThemeCubit in the widget tree. Routing is updated to use the new router config with a custom observer, and environment variable loading via flutter\_dotenv is removed in favor of the new initialization flow.

lib · medium confidence

Dynamic theme switching with updated color schemes

Users can now dynamically switch between light and dark modes via the new ThemeCubit, which persists the user's preference. The default color scheme for both light and dark themes has been updated from deepPurple to aquaBlue, providing a refreshed visual appearance across the application.

lib/app/theme · high confidence

Favorites screen now displays a localized title and manages loading, empty, and error states

The Favorites screen has been updated to use a localized title instead of a hardcoded string, and the view now fully manages the BLOC state transitions. Users will see a loading spinner while favorites are fetched, a specific message when no favorites exist, and an error widget if the fetch fails. On success, the list of favorite manga is displayed.

lib/feature/favorites/presentation · high confidence

Implemented search view with state-driven UI and localization

The search view has been refactored to use a BlocProvider for state management, replacing the previous static title with a dynamic search text field. The body now renders different UI states (initial, loading, no result, failure, success) using a switch expression on the SearchState, displaying localized messages via easy\_localization and a custom error widget for failures.

lib/feature/search/presentation/view · medium confidence

Localize navbar labels and update icons

The navbar view now displays localized strings for the 'Popular' and 'Favorites' tabs using the easy\_localization package, replacing hardcoded English labels. Additionally, the tab icons have been updated to use the rounded variants (Icons.book\_rounded and Icons.star\_rate\_rounded) for a consistent visual style.

lib/feature/navbar · high confidence

Migrate environment variable management from flutter\_dotenv to envied

The application now uses the \envied\ package to read environment variables, replacing the previous \flutter\_dotenv\ implementation. This change introduces an \Env\ class that reads the \.env\ file located at \env/.env\ with obfuscation enabled, and generates a corresponding \env.g.dart\ file to provide access to variables like \BASE\_URL\.

lib/app/env · high confidence

The Popular View has been refactored to use the BLoC pattern for state management. The view now wraps its content in a BlocProvider and uses BlocBuilder to handle loading, failure, and success states, displaying a circular progress indicator during loading, a custom error widget on failure, and a success widget with the fetched manga list when data is available.

lib/feature/popular/presentation/view · medium confidence

Rearranged navigation routes and added route observation

The navigation structure has been reorganized: the Detail route now accepts a MangaEntity and a Key as arguments, and the Navbar route has been swapped with the Search route in the generated router configuration. Additionally, a new CustomRouteObserver has been introduced to log all route changes, providing visibility into navigation events.

lib/app/router · medium confidence

The Popular feature now includes a dedicated app bar with a centered title, a search icon that navigates to a new SearchRoute, and an animated theme switcher. The main content area uses a custom grid view that supports infinite scrolling to load more items. The UI also supports English localizations and dynamic theming.

lib/feature/popular/presentation/widgets · medium confidence

Redesigned manga detail page with rich visual layout

The manga detail view has been completely redesigned to replace the previous minimal interface. The new layout features a full-width background image with a fade effect, a left-aligned cover image, and a favorites button overlaid on the header area. Below the header, the page displays genre tags, statistics, the title, and the synopsis in a structured column. This change introduces several new internal widgets (background image, fade effect, favorites button, genre tags, stats) and integrates localization and theme constants for styling.

lib/feature/detail/presentation/view · high confidence

Refactored the manga detail view into modular widget components

The manga detail view has been refactored to use separate, reusable widget classes for each UI section, improving code organization and maintainability. The new components include a background image widget, a fade effect overlay, a favorites button with state management, a genre tags display, a left-aligned image widget, and a stats tile widget for ranking, rating, and member count.

lib/feature/detail/presentation/widgets · high confidence

iOS minimum deployment target raised to iOS 12

The iOS minimum deployment target has been updated from 11.0 to 12.0, meaning the app will no longer support devices running iOS 11. Additionally, English localization support has been added to the iOS app configuration.

ios · high confidence

Test coverage

Added unit tests for Favorites feature; Added unit tests for popular and search features.

Dependencies

Updated Flutter dependencies and migrated to Hive and localization packages

The project's dependencies have been updated to newer versions, including auto\_route (7.7.0 → 8.2.0), dio (5.2.1+1 → 5.4.3+1), and flutter\_bloc (8.1.3 → 8.1.6). New packages for state management and caching (hive\_flutter, hydrated\_bloc, easy\_localization) have been added, while older dependencies like flutter\_dotenv and json\_annotation have been replaced or updated. Additionally, test dependencies (mocktail, bloc\_test) have been moved to dev\_dependencies, and the Android build configuration has been modernized to use the new Gradle plugin management system.

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

Lenses

  • Code Health 100 → 99 (-0.5)
  • Architecture 100 → 90 (-10.3)
  • Maturity 56 → 61 (+4.6)
  • Readiness 24 → 36 (+11.7)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 100 → 100 (+0.0)

Resolved (7)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • No exposed public API
  • Test reliability not included
  • complexity unreadable for .dart, .kt, .swift — churn × complexity hotspots could not be measured
  • early-stage repository — too little history to judge knowledge freshness
  • single-maintainer — knowledge-concentration (bus factor) risk

New (7)

  • 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)
  • Duplicated block (12–13 lines × 2) (lib/feature/popular/presentation/bloc/popular_bloc.dart)
  • Duplicated block (13 lines × 2) (lib/feature/popular/data/repositories/popular_repository_impl.dart)
  • Duplicated block (16–17 lines × 2) (lib/feature/popular/data/datasources/remote/popular_remote_datasource.dart)
  • No ADRs found

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

Survey your own repository

cem256/manga_clean_arch 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 1716cca09debf6ffe974fdb9dec357817b5f13c3 — 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.