Skip to content
CAI
Software that uses CAICheck a score

IsaiasCuvula/quote_generator

44.8

Weak · 21 September 2026

6.1k

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 mobile application for creating, managing, and sharing text-based quotes. It supports user authentication via Google Sign-In and allows users to generate, edit, and search quotes with customizable styling options. The system features a discovery feed for browsing and interacting with quotes, a download capability for saving quote images, and a profile section for managing favorites and settings. The architecture is modular, separating domain, data, and presentation layers with clean architecture principles.

Features

Added English and Portuguese localization files for the app

The app now includes translation resources for English and Portuguese, enabling users to see the interface in their preferred language. The new files define strings for the navigation bar, app bar, alerts, quote creation, search, and general settings in both languages, supporting a localized user experience.

lib/config/l10n · high confidence

Added Google Sign-In authentication flow

Introduced the complete presentation layer for authentication, including the AuthScreen with a Google Sign-In button, state management via Riverpod providers (AuthNotifier, AuthState), and a stream provider for Firebase auth state changes. This enables users to sign in using their Google account.

lib/features/auth/presentation · high confidence

Added SearchQuote use-case and provider

Introduced the SearchQuote use-case class and its corresponding Riverpod provider, enabling the application to search for quotes via the quote repository.

_lib/features/quote/domain/usecases/search\quote · medium confidence

Added auth state changes and sign-out use cases

The application now exposes domain-level use cases for managing authentication state and signing out. The new \AuthStateChangesUseCase\ wraps the underlying repository to stream authentication state changes, while the \SignOutUseCase\ provides a dedicated method to trigger the sign-out process. Both are registered in the dependency injection layer via Riverpod providers, making these capabilities available for use in the rest of the application.

_lib/features/auth/domain/usecases/auth\_state\_changes, lib/features/auth/domain/usecases/sign\out · high confidence

Added discovery and quote detail screens

Users can now browse a list of quotes on the new Discovery screen, which supports pull-to-refresh and displays an empty state when no quotes are available. Tapping a quote card navigates to a new Detail screen that presents the full quote text, author, and styling options, along with actions to share or delete the quote.

lib/features/discovery/presentation/screens · high confidence

Added discovery feed quote card and interactive widgets

Users can now view and interact with quotes in the discovery feed. A new RemoteQuoteCard widget displays quote details, including the author's name and the quote text. The card includes interactive elements: a like/dislike button that updates the user's like status, a favorites counter showing the total likes, and buttons to copy, share, or download the quote. This replaces the previous static or placeholder UI with a fully functional, interactive card component for the discovery feature.

lib/features/discovery/presentation/widgets · high confidence

Added domain use cases for the discovery feature

The app now includes domain-layer use cases for the discovery feature, enabling users to retrieve all quotes, fetch a specific quote by ID, retrieve user information, and submit new quotes. These new use cases are wired via Riverpod providers, allowing the rest of the application to access these capabilities.

(repo-wide) · high confidence

Added download feature to save quote images to device

Users can now download and save generated quote images to their device's gallery. This change introduces a new 'download' feature module containing the domain entities (QuoteImage), repository implementations for capturing the widget as an image and saving it via the device's gallery saver, and presentation components including a DownloadButton widget and state management providers to handle the save flow and display success/error messages.

lib/features/download · high confidence

Added quote domain usecases

Introduced a new set of domain usecases for managing quotes, including operations to add, delete, retrieve by ID, list, search, and update quotes. These usecases are now exported from the domain layer, enabling the application to perform core quote-related business logic.

lib/features/quote/domain/usecases · high confidence

Added use cases for tracking and performing quote likes

The discovery feature now includes domain use cases for checking if a user has liked a specific quote and for submitting like/dislike actions. The \HasLikedQuote\ use case queries the remote repository to return a stream indicating whether a specific user has liked a quote, while the \LikeDislikeQuote\ use case handles the submission of like/dislike interactions. Both are wired into the application via Riverpod providers, enabling the UI to react to like status changes and to trigger like/dislike operations.

_lib/features/discovery/domain/usecases/has\_liked\_quote, lib/features/discovery/domain/usecases/like\_dislike\quote · high confidence

Adds discovery feature providers for quote management

The discovery feature now includes a set of Riverpod providers to handle quote-related operations in the UI layer. This includes fetching and displaying all quotes, retrieving individual quotes by ID, and managing user interactions such as liking, disliking, and deleting quotes. Additionally, it provides utilities for tracking quote likes count and fetching user information, enabling the discovery feed to interact with the backend services.

lib/features/discovery/presentation/providers · medium confidence

App entry point and configuration

The application's main entry point (lib/app/app.dart) has been introduced, establishing the root Flutter widget that configures the app's theme, localization (English and Portuguese), and routing. This change consolidates the app's initial setup, including the integration of a locale provider for language selection and a theme provider for light/dark mode, while also setting up the router for navigation.

lib/app · high confidence

Implemented QuoteRepository with local data source integration

The application now uses a new QuoteRepositoryImpl that bridges the domain layer with the local data source. This implementation handles quote operations (add, delete, get by ID, get all, update, and search) by mapping between Quote entities and models, and returns standardized success or failure results for each operation.

lib/features/quote/data/repositories · high confidence

Implemented data layer for the Discovery feature

The Discovery feature now includes a complete data layer, introducing a remote quote repository and datasource backed by Cloud Firestore. This enables users to view a feed of quotes, post new quotes, and interact with the content through real-time like and dislike functionality. The implementation includes domain entities, repository interfaces and their concrete implementations, mappers for data transformation, and provider wiring for dependency injection.

lib/features/discovery/data · high confidence

Introduce Quote domain entity

Added a new Quote entity in the domain layer, representing a quote with properties for text, author, styling (alignment, background color, font size, weight, spacing, and letter spacing) and a favorite flag. The entity includes an optional ID, implements value-based equality via Equatable, and provides an immutable copyWith method for safe updates.

lib/features/quote/domain/entities · high confidence

Introduce data layer for authentication

The application now includes a new data layer for authentication, implementing Google Sign-In and sign-out functionality via Firebase. This adds the necessary data sources, repositories, and domain interfaces to handle user authentication state and credentials.

lib/features/auth/data · high confidence

Introduce domain use cases for capturing and saving quote images

The download feature now includes dedicated domain use cases for capturing a quote widget as an image and saving that image to the device. A new \CaptureQuoteWidget\ use case wraps the repository's \captureQuoteWidget\ method, while a \SaveImageUseCase\ handles device storage via \saveQuoteImageToDevice\. Each use case is wired into the app's dependency injection via Riverpod providers, enabling the UI layer to trigger image capture and subsequent saving operations.

_lib/features/download/domain/usecases/capture, lib/features/download/domain/usecases/save\image · high confidence

Introduce local quote storage via SQLite datasource

The app now stores quotes locally on the device using a new SQLite-based datasource. Users can add, update, delete, and search for their saved quotes, with all data persisted in a local database and accessed through a dedicated provider for dependency injection.

lib/features/quote/data/datasource · high confidence

New bottom navigation and profile feature

The app now features a bottom navigation bar with five tabs: Created by You, Discovery, Search, Favorites, and Settings. Additionally, a new Profile screen has been added, allowing users to view their profile information and sign out. The Settings screen includes options to change the app's language and toggle between light and dark modes.

(repo-wide) · high confidence

New quote management providers for the presentation layer

The application now exposes a comprehensive set of Riverpod providers to manage quote data and user preferences. This includes stateful notifiers for creating, updating, and deleting quotes, as well as fetching all quotes, specific quotes by ID, and favorite quotes. Additionally, a dedicated provider manages text styling settings (font, color, alignment), allowing the UI to reactively update quote appearance based on user configuration.

lib/features/quote/presentation/providers · high confidence

New quote management screens: create, search, favorites, and details

The app now includes dedicated screens for creating new quotes, searching through existing quotes, viewing favorite quotes, and viewing individual quote details. The 'Create Quote' screen allows users to compose and save new quotes, while the 'Created by You' screen displays all user-generated quotes with a profile icon fallback when no image is available. The 'Favorites' screen shows all favorited quotes, and the 'Quote Details' screen provides a detailed view of a specific quote. A new 'Search' screen enables users to find quotes by text. All screens are exported via a new barrel file for easier imports.

lib/features/quote/presentation/screens · high confidence

New quote presentation widgets and UI components

The quote feature's presentation layer has been expanded with new UI components. A \QuoteDetailBody\ widget now provides a detailed view of a quote, including favorite, share, post, and delete actions. The \QuoteCard\ widget has been enhanced to include a \CardFooter\ with favorite, copy, share, and download buttons. Additional widgets include \ListOfQuotes\ for displaying a list of quotes, \SearchTextField\ for search functionality, and \ColorPickerPalette\ for color selection. An \EmptySearchQuoteScreen\ is also added to handle empty search states.

lib/features/quote/presentation/widgets · high confidence

New quote text customization options

The quote settings screen now includes controls for text alignment, font weight, font size, letter spacing, and word spacing, allowing users to adjust the appearance of their quotes. A new background color picker has also been added to the settings panel.

_lib/features/quote/presentation/widgets/quote\_settings\widgets · high confidence

Quote data mapping between model and entity layers

A new QuoteMapper class has been added to the quote feature's data layer, providing bidirectional mapping between the Quote entity and QuoteModel. The mapper converts fields such as quoteText, author, textAlign, backgroundColor, fontSize, fontWeight, wordSpacing, letterSpacing, and isFavorite between the domain model and the data model.

lib/features/quote/data/mapper · high confidence

Removals

Removed macOS native application layer

The macOS native application layer has been removed, including the Xcode project configuration, Swift entry points (AppDelegate, MainFlutterWindow), and all associated build configuration files (xcconfig, entitlements, and Info.plist). This eliminates the native macOS build target, indicating a shift away from the native macOS implementation.

macos · high confidence

Removed native Linux and Windows build configurations

The native build configurations for the Linux and Windows platforms have been removed. This includes all CMakeLists.txt files, generated plugin registrants, and runner source files (such as main.cc, my\_application.cc, and win32\_window.cpp). As a result, the application can no longer be built or run natively on Linux and Windows environments.

linux, windows · high confidence

Behavioural changes

App initialization refactored to support Firebase and state management

The application entry point has been restructured to initialize Firebase and shared preferences before launching the app. The default Flutter demo application has been replaced with a new 'QuoteGeneratorApp' wrapped in a 'ProviderScope' for state management, indicating a shift to a more complex architecture supporting background services and persistent storage.

lib · high confidence

Consolidate config exports into a single barrel file

The lib/config directory now exposes a unified entry point (config.dart) that re-exports localizations, navigation, and theme modules. This barrel file simplifies imports for consumers of the config layer, allowing a single import statement to access all configuration-related components.

lib/config · high confidence

Introduce quote repository interface and provider

Users can now interact with the quote feature through a clearly defined repository layer. This change introduces the \QuoteRepository\ interface, which defines methods for adding, retrieving, updating, deleting, and searching for quotes. Additionally, a Riverpod provider (\quoteRepositoryProvider\) is added to wire the repository implementation to the local data source, enabling dependency injection for the quote feature's domain logic.

lib/features/quote/domain/repositories · high confidence

Introduced QuoteModel data class with Equatable support

Added a new QuoteModel class in the quote feature's data layer, replacing the previous Freezed-based implementation with an Equatable-based model. The model now includes fields for quote text, author, text alignment, background color, font size, font weight, word spacing, letter spacing, and favorite status, with JSON serialization and copy-with functionality.

lib/features/quote/data/models · high confidence

Introduces Clean Architecture use cases for quote management

The application now implements a clean architecture structure for managing quotes, introducing new use cases for adding, deleting, retrieving by ID, retrieving all, and updating quotes. Each operation is encapsulated in its own use case class (AddQuote, DeleteQuote, GetQuoteById, GetQuotes, UpdateQuote) and wired via Flutter Riverpod providers, enabling a more modular and testable codebase.

(repo-wide) · high confidence

Modularized auth and discovery features

The auth and discovery features have been restructured into a modular architecture, each exposing a main barrel file that exports data, domain, and presentation layers. This change organizes the codebase by separating concerns within each feature, making the code easier to navigate and maintain.

lib/features/auth, lib/features/discovery · medium confidence

New app theme configuration and theme management

The app introduces a comprehensive theming system, defining light and dark mode styles for app bars, color schemes, text, and dimensions. A new \ThemeNotifier\ using Riverpod manages the current theme state, allowing users to switch between light and dark modes, with the preference persisted in shared preferences.

lib/config/theme · high confidence

New core architecture and UI components for quote management

The app's core layer has been restructured to support a cleaner, modular architecture. This includes new constants for Firebase collections and field names, along with a dedicated error handling system featuring a \Failure\ class and user-facing error messages. The update introduces a base \UseCase\ and \StreamUseCase\ interface for business logic, as well as utility classes for app alerts, shared preferences, and data types. On the UI side, reusable widgets have been added, including a nested scroll view with a floating app bar, a loading screen, an empty state card, and specific quote card components (body text, copy button, and share button) that integrate with the new core utilities.

lib/core · high confidence

Quote data layer reorganized into modular subdirectories

The quote feature's data layer has been restructured into dedicated subdirectories for models, datasources, repositories, and mappers. This change improves code organization and maintainability by grouping related components, making it easier to locate and manage quote-related data logic.

lib/features/quote/data · medium confidence

Removed iOS app configuration file

The Info.plist file, which previously defined core iOS app settings such as the bundle name, display name, and supported interface orientations, has been removed from the project.

ios/Runner · high confidence

Removed legacy web entry point and manifest files

The default web entry point (index.html) and the web app manifest (manifest.json) have been removed from the web directory. This eliminates the standard Flutter web scaffolding, meaning the application will no longer load via the traditional HTML/JS bootstrap process that initializes the Flutter engine.

web · high confidence

Reorganized quote feature into a modular structure

The quote feature has been refactored to improve modularity and maintainability. The feature is now split into distinct layers: presentation, data, and domain. The presentation layer is further organized into providers, widgets, and screens, each with their own barrel files for clean exports. This change makes it easier to navigate and maintain the codebase by separating concerns and reducing coupling between layers.

lib/features/quote/presentation · medium confidence

iOS project upgraded to Xcode 14.3 and targets iOS 13.0

The iOS project configuration has been updated to target iOS 13.0, replacing the previous 11.0 deployment target. The project file and scheme have been upgraded to Xcode 14.3, and the workspace now includes the Pods framework, enabling proper CocoaPods integration for the app.

ios/Runner.xcodeproj · high confidence

Test coverage

Removal of default Flutter widget test

The default 'Counter increments smoke test' in test/widget\_test.dart has been removed. This eliminates the boilerplate test that previously verified a counter widget's behavior, indicating a shift away from the initial project template's test coverage.

test · 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 41 → 45 (+3.4)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 99 (-0.9)
  • Architecture 96 → 91 (-5.7)
  • Maturity 27 → 39 (+12.3)
  • Readiness 15 → 17 (+1.9)
  • Security 97 → 100 (+3.3)
  • Domain Modelling 100 → 100 (+0.0)

Resolved (15)

  • Boundary-crossing change coupling: bottom_nav_bar_shell.dart ↔ screens.dart (lib/config/navigation/bottom_navigation/bottom_nav_bar_shell.dart)
  • Boundary-crossing change coupling: dimensions.dart ↔ screens.dart (lib/config/theme/dimensions.dart)
  • Boundary-crossing change coupling: routes.dart ↔ screens.dart (lib/config/navigation/routers/routes.dart)
  • Change coupling: created_by_you_screen.dart ↔ favorites_screen.dart (lib/features/quote/presentation/screens/created_by_you_screen.dart)
  • Change coupling: letter_spacing_selector.dart ↔ text_font_weight_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/letter_spacing_selector.dart)
  • Change coupling: letter_spacing_selector.dart ↔ text_size_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/letter_spacing_selector.dart)
  • Change coupling: letter_spacing_selector.dart ↔ word_spacing_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/letter_spacing_selector.dart)
  • Change coupling: text_align_selector.dart ↔ word_spacing_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/text_align_selector.dart)
  • Change coupling: text_font_weight_selector.dart ↔ word_spacing_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/text_font_weight_selector.dart)
  • Change coupling: text_size_selector.dart ↔ word_spacing_selector.dart (lib/features/quote/presentation/widgets/quote_settings_widgets/text_size_selector.dart)
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • No exposed public API
  • The README states it 'is under construction' and ends with a LaunchScreenAssets README, but there is no architecture or design documentation for the app's core features (quote creation, styling, favorites, sharing) or how they interrelate. (README.md)
  • complexity unreadable for .dart, .swift — churn × complexity hotspots could not be measured
  • single-maintainer — knowledge-concentration (bus factor) risk

New (14)

  • Boundary-crossing change coupling: dimensions.dart ↔ widgets.dart (lib/config/theme/dimensions.dart)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no architecture or design documentation (README.md)
  • Duplicated block (14 lines × 2) (lib/features/discovery/data/mapper/remote_quote_mapper.dart)
  • Duplicated block (15 lines × 2) (lib/features/quote/data/models/quote_model.dart)
  • Duplicated block (16 lines × 2) (lib/features/discovery/presentation/widgets/remote_card_footer.dart)
  • Duplicated block (16–17 lines × 2) (lib/features/discovery/presentation/screens/deatil_body.dart)
  • Duplicated block (17 lines × 2) (lib/features/discovery/data/models/remote_quote_model.dart)
  • Duplicated block (17 lines × 2) (lib/features/quote/presentation/widgets/quote_settings_widgets/letter_spacing_selector.dart)
  • Duplicated block (27 lines × 2) (lib/features/discovery/presentation/widgets/remote_quote_card.dart)
  • Duplicated block (45 lines × 2) (lib/features/discovery/presentation/screens/deatil_body.dart)
  • Duplicated block (9 lines × 2) (lib/features/quote/presentation/widgets/quote_settings_widgets/letter_spacing_selector.dart)
  • Duplicated block (9 lines × 3) (lib/features/discovery/domain/entities/remote_quote.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

IsaiasCuvula/quote_generator 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 d24b1852166d9125822e19a77f3dbb0202e4374d — 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.