Skip to content
CAI
Software that uses CAICheck a score

tortamque/Weathque

51.7

Adequate · 20 September 2026

2.5k

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 mobile weather application for Android and iOS that allows users to manage a list of saved cities and view their current weather conditions and weekly forecasts. It aggregates data from the OpenWeatherMap API and persists user preferences locally, presenting the information through a themed UI with animated transitions. The system is strictly limited to mobile platforms, having removed support for Linux, macOS, Web, and Windows.

Features

Add CitiesChangedCubit for city list management

A new CitiesChangedCubit has been introduced in the Add City feature to manage the state of the available cities list. This component initializes with the current list of cities by invoking the GetCitiesUseCase and provides a method to refresh this list on demand, ensuring the UI reflects the latest data from the domain layer.

_lib/features/app/presentation/bloc/add\city · high confidence

Add city selection via custom bottom sheet with color preservation

Users can now add a new city by opening a custom bottom sheet that includes a text input field and a list of saved cities. When a city is submitted, the app fetches its weather data, saves the city with a randomly assigned theme color, and refreshes the current weather and forecast views. The interface provides immediate feedback via toast messages for success, duplicate entries, or invalid city names.

_lib/features/app/presentation/widgets/misc/bottom\sheet · high confidence

Added data models for current and forecast weather responses

New model classes (ForecastWeatherModel and WeatherModel) have been added to parse JSON responses for current and forecast weather data, mapping API fields to domain entities.

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

Added domain use cases for city and weather management

This change introduces a set of new domain use cases in the app feature layer to handle city and weather operations. Users can now save and delete cities, retrieve lists of saved cities and their associated colors, and fetch both current weather and weather forecasts for specific cities. These use cases act as the domain layer interface, delegating storage operations to the StorageRepository and weather data retrieval to the WeatherRepository and ForecastWeatherRepository.

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

Initial theme configuration with Material 3 and custom color palette

The application now includes a base theme configuration in \lib/config/theme\ that enables Material 3 and sets the text selection handle color to black. Additionally, a new \CustomColors\ enum is introduced, defining a palette of yellow, blue, and pink colors for use throughout the UI.

lib/config · high confidence

Introduce BLoC for fetching multi-city weather forecasts

Added the presentation-layer BLoC components (event, state, and bloc) for the weather forecast feature. This implementation allows the app to retrieve forecast data for all saved cities in a single operation, returning the results as a map of city names to forecast entities.

_lib/features/app/presentation/bloc/get\_weather\forecast · high confidence

Introduce animated weather card component

Added a new WeatherCard widget that displays wind speed, humidity, and visibility data within a styled container. The component features a top-and-right origin animation that triggers after a short delay, enhancing the visual presentation of the weather details.

_lib/features/app/presentation/widgets/weather\card · high confidence

Introduce local storage and weather API repository implementations

This change adds the concrete repository implementations for the app's data layer. The new StorageRepositoryImplementation handles local persistence operations, including saving and retrieving city names and their associated colors, as well as deleting cities. The WeatherRepositoryImplementation classes provide the bridge to remote weather data, with separate implementations for fetching current weather and forecast data by city name using the respective API services.

lib/features/app/data/repository · high confidence

Introduces core dependency injection and API configuration

The application now initializes its dependency injection container (GetIt) to manage the lifecycle of key services, including API clients for OpenWeatherMap, local storage, and various domain use cases and presentation blocs. This setup is supported by new constants defining the base URLs for current weather and forecast endpoints, and a .gitignore rule to prevent sensitive configuration files from being committed.

lib/core · high confidence

Introduces domain entities and summary builder for weather data

This change adds the core domain models required to represent weather information within the app. It defines \WeatherEntity\ and \ForecastWeatherEntity\ to map current and forecast weather data (including temperature, coordinates, and conditions) from JSON responses, alongside supporting classes like \Coord\, \Information\, and \Wind\. A new \City\ enum is introduced to represent available locations (Paris, New York, Sydney), and a \SummaryBuilder\ class is added to generate human-readable weather summaries from the entity data.

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

Introduces domain repository interfaces for weather data and local storage

New abstract repository interfaces are added to the application's domain layer to define contracts for data access. The \StorageRepository\ interface specifies methods for managing city preferences, including saving a city with its associated color, retrieving lists of saved cities and colors, and deleting a city. The \WeatherRepository\ and \ForecastWeatherRepository\ interfaces define methods for fetching current weather and forecast data for a specific city name, establishing the domain-side abstraction for these features.

lib/features/app/domain/repository · high confidence

Introduction of core use-case interfaces for city and color management

A new abstract base class \UseCase\ and specific interface definitions for \SaveCityUseCase\, \GetCitiesUseCase\, \GetColorsUseCase\, and \DeleteCityUseCase\ have been added to the core layer. These interfaces define the contracts for managing city data (including saving, retrieving, and deleting cities by name) and fetching associated color values, establishing the foundational API for business logic in this module.

lib/core/usecases · high confidence

Introduction of custom toast notification widget

A new custom toast widget has been added to the application, providing users with visual feedback for actions. This widget displays a colored banner (red for errors, green for success) accompanied by an appropriate icon and flexible text content, replacing or supplementing standard system toasts with a branded appearance.

lib/features/app/presentation/widgets/misc/toast · high confidence

Local storage for city and color preferences

A new local storage implementation has been added to persist user-defined cities and their associated color values using shared preferences. This component initializes with default data (Paris, New York, Sydney) if the storage is empty, supports saving new city-color pairs, retrieving existing lists, and deleting specific cities while keeping the color list synchronized.

_lib/features/app/data/data\sources/local · high confidence

New animated summary text widget

A new presentation widget has been added to display summary text with a staggered top-and-right entrance animation. The widget splits the input text into three lines, animating each line sequentially with a 200ms delay between them using a custom TopAnimation component, and positions the initial animation state based on the device's screen height via MediaQuery.

_lib/features/app/presentation/widgets/summary\text · high confidence

New loading and weather page views with city-specific theming

The app now includes a dedicated LoadingPage that displays a colored background and a black circular progress indicator, and a WeatherPage that presents the current weather and forecast data within a menu widget. Both pages support a custom color theme and the WeatherPage specifically displays the city name in the app bar title, allowing for distinct visual styling per city.

lib/features/app/presentation/pages · high confidence

New remote API service for weather data

A new remote data source has been added in the app's feature layer to fetch current and forecast weather information. This service uses the Retrofit library to define interfaces for calling the OpenWeatherMap API, specifically targeting endpoints for current weather and forecasts. It accepts a city name as the primary query parameter and defaults to metric units for temperature and distance measurements, providing structured responses via generated code that maps directly to the app's existing weather models.

_lib/features/app/data/data\sources/remote · high confidence

New slide-in animation widgets for right and top entry effects

Two new Flutter widgets, RightAnimation and TopAnimation, have been added to the presentation layer to handle specific entry animations. RightAnimation slides content in from the right side, while TopAnimation slides content in from the top; both widgets combine position movement with opacity fading using configurable duration, curve, and initial values, allowing developers to easily apply these directional entrance effects to child widgets.

lib/features/app/presentation/widgets/animations · high confidence

New weather menu widget with city-specific theming

A new Menu widget has been introduced in the app presentation layer to display current weather conditions, a daily summary, and a weekly forecast. The widget accepts a specific color parameter, enabling distinct visual themes for different cities, and integrates with the existing dependency injection system to generate weather summaries.

lib/features/app/presentation/widgets/menu · high confidence

New weekly forecast display with staggered entry animations

The weekly forecast section now renders a horizontal list of five daily forecast cards, each showing the date, temperature, and weather icon. These cards are wrapped in a TopAnimation widget that triggers a staggered fade-and-slide-in effect from the top as the view loads, with each card appearing sequentially over a 600ms window. The layout uses fixed dimensions for the cards and includes padding between items for visual separation.

_lib/features/app/presentation/widgets/weekly\forecast · high confidence

New wrapper widgets for weather BLoCs and Cubits

Added three new presentation widgets—CitiesCubitWidget, CurrentWeatherForecastBloc, and ForecastBlocWidget—that encapsulate BLoC/Cubit state management logic. These components automatically handle loading states by displaying a LoadingPage and invoke a provided callback only when the underlying data is ready, simplifying how parent widgets consume weather-related state.

lib/features/app/presentation/bloc/widgets · high confidence

Removals

Removal of Linux, macOS, Web, and Windows platform support

The Linux, macOS, Web, and Windows platform directories have been removed from the project. This eliminates the native build configurations, source code, and assets for these platforms, meaning the application can no longer be built or run on Linux, macOS, Web, or Windows environments.

(repo-wide) · high confidence

Behavioural changes

Add animated settings button to the app bar

The app bar now includes a settings button that triggers a custom bottom sheet. This button features an animated rotation effect when tapped and passes the bottom sheet's color theme to ensure visual consistency.

lib/features/app/presentation/widgets/misc/AppBar · high confidence

Android package name change and internet permission added

The Android application's package name has been updated from com.example.weathque to com.tortamque.weathque, and the app label has been capitalized to 'Weathque'. Additionally, the INTERNET permission has been added to the AndroidManifest.xml, allowing the app to access network resources.

android · high confidence

Animated condition text widget with slide-in effect

The condition display now uses a new widget that animates the text sliding in from the top with a fade effect. The animation is triggered on load, uses a 500ms duration with an ease-out sine curve, and positions the initial state based on the screen height to ensure consistent spacing across devices.

lib/features/app/presentation/widgets/condition · high confidence

Animated weekly forecast header with staggered entrance effects

The weekly forecast header now features animated text and arrow elements that slide in from the top and right with staggered delays. The 'Weekly' and 'forecast' text fade and slide into view after 2.2 and 2.4 seconds respectively, while the arrow icon slides in from the right after 2.5 seconds, all using an easeOutSine curve. Initial positions and opacities are now derived from MediaQuery values rather than hard-coded constants, ensuring proper responsiveness across different screen sizes.

_lib/features/app/presentation/widgets/misc/headers/forecast\header · high confidence

The logic for building the weather carousel slider has been moved into a new standalone function in \lib/features/app/presentation/functions/build\_carousel\_slider.dart\. This function encapsulates the retrieval of city and color data via use cases and constructs the \CarouselSlider\ widget, providing a reusable component for rendering the weather forecast slides.

lib/features/app/presentation/functions · high confidence

Initialize app with dependency injection and structured BLoC providers

The application entry point now initializes Flutter bindings and sets up dependency injection before launching the UI. The main widget has been refactored to wrap the MaterialApp in a new BlocsProviderBuilder, which centrally registers providers for weather data retrieval and city management. This replaces the previous static home page with a nested widget structure that handles city selection, current weather display, and forecast rendering through dedicated BLoC widgets.

lib · high confidence

Introduce animated summary header with fade-in effect

The summary header widget now features an entrance animation where the text fades in and slides down from the top. This is implemented by layering a transparent text placeholder with an animated version that uses a 500ms ease-out sine curve, starting with zero opacity and a vertical offset derived from the screen height. The header accepts dynamic text content and applies a black color to the animated text layer.

_lib/features/app/presentation/widgets/misc/headers/summary\header · high confidence

New animated date display widget with city-specific theming

The date presentation layer now uses a new Date widget that displays the date with an animation originating from the top and right, utilizing a reusable DateCard component. The widget accepts a specific color parameter, enabling different colors for each city, and replaces previous hard-coded initial values with MediaQuery-based positioning to improve layout adaptability.

lib/features/app/presentation/widgets/date · high confidence

Refactor current weather bloc to aggregate weather for all saved cities

The GetCurrentWeatherBloc has been restructured to fetch and display weather data for all saved cities simultaneously. Instead of handling a single city, the bloc now retrieves the list of saved cities, iterates through them to fetch individual weather reports, and aggregates the results into a Map of city names to weather entities before emitting a done state.

_lib/features/app/presentation/bloc/get\_current\weather · high confidence

Refactored bottom sheet UI into modular widgets

The bottom sheet's user interface has been restructured into three distinct, reusable components: a city list view that renders individual city cards, a dedicated text input field for adding new cities, and a city card widget that displays the city name and supports swipe-to-delete animations. This change improves code maintainability by separating the list rendering, input handling, and individual item display logic within the bottom sheet presentation layer.

_lib/features/app/presentation/widgets/misc/bottom\sheet/widgets · high confidence

Temperature display now features staggered entrance animations

The temperature widget has been refactored to animate the temperature value and degree symbol separately upon loading. The main temperature number fades in and slides down from the top after a 1-second delay, while the degree symbol follows with a right-side entrance animation after 1.4 seconds. These animations use specific durations and easing curves (easeOutSine for the number, easeOutCubic for the symbol) to create a polished, staggered visual effect.

lib/features/app/presentation/widgets/temperature · high confidence

Updated iOS app display name capitalization

The app name displayed on the iOS home screen has been changed from 'weathque' to 'Weathque' by updating the CFBundleName key in the Info.plist file.

ios · high confidence

Test coverage

Removed default Flutter widget smoke test

The default widget test file (test/widget\_test.dart) has been deleted. This removes the boilerplate test that previously verified the app's counter increments from 0 to 1 upon tapping the '+' icon, indicating that this specific automated verification of the initial app state is no longer part of the test suite.

test · high confidence

Dependencies

Initial dependency setup and Android build configuration

This change establishes the project's foundational dependencies and build settings. It adds core libraries for state management (flutter\_bloc), dependency injection (get\_it), internationalization (intl), UI components (fluttertoast, flutter\_carousel\_slider), and data persistence (shared\_preferences), alongside code-generation tools (retrofit, json\_serializable, build\_runner). It also configures the Android build to use a keystore for release signing, updates the application namespace and ID to com.tortamque.weathque, and registers weather-related assets for the app icon and UI.

(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 45 → 52 (+6.8)
  • Rubric changed (rubric-2026.08.17 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 98 (-1.9)
  • Architecture 100 → 97 (-3.0)
  • Maturity 43 → 54 (+11.2)
  • Readiness 24 → 33 (+9.1)
  • Security 100 → 98 (-1.6)
  • Domain Modelling 61 → 62 (+0.7)

Resolved (8)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — no supported dependency manifest was read
  • No exposed public API
  • Test reliability not included
  • The 'Architecture' section only briefly states Clean Architecture and lists layers without elaborating on how each layer (Data/Domain/Presentation) interacts with one another or what it actually does. (README.md)
  • The 'Features' section is present in the outline but not shown; features like 5-day forecast and offline support are mentioned only in the description. (README.md)
  • complexity unreadable for .dart, .kt, .swift — churn × complexity hotspots could not be measured
  • single-maintainer — knowledge-concentration (bus factor) risk

New (9)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no architecture or design documentation (README.md)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (3–7 lines × 5) (lib/features/app/presentation/widgets/weekly_forecast/weekly_forecast.dart)
  • Duplicated block (8 lines × 2) (lib/features/app/domain/entities/forecast_weather_entity.dart)
  • High CVE: [GHSA redacted] (pubspec.lock)
  • MethodTooLong: _WeeklyForecastState.build (lib/features/app/presentation/widgets/weekly_forecast/weekly_forecast.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

tortamque/Weathque 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 20 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 f34e381cbb04276ccc8f3d3cbbd95169d6f15680 — 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-28e75b8e3254.