Skip to content
CAI
Software that uses CAICheck a score

darkmoonight/Rain

57.7

Adequate · 19 September 2026

18.7k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Rain is a cross-platform weather application that provides detailed forecasts, air quality monitoring, and interactive mapping for multiple saved cities. It fetches data from the Open-Meteo API, caches results locally for offline access, and supports native home-screen widgets on Android. The system is built on Flutter with Riverpod for state management and GoRouter for navigation, targeting iOS, Android, Linux, macOS, and Web platforms.

How it got here

2023 — Platform modernization and feature expansion

11 changes.

The project underwent a comprehensive modernization of its core architecture, migrating state management to Riverpod and routing to GoRouter while upgrading build systems and dependencies across all platforms. This period also focused on expanding native capabilities, introducing Material You widgets for Android, enhancing plugin support for Linux, macOS, and Windows, and adding web splash screen functionality.

2024–2026 — Riverpod migration and feature expansion

31 changes.

The project underwent a comprehensive architectural shift, migrating state management from GetX to Riverpod and navigation to GoRouter across all major features. This refactoring was accompanied by significant feature additions, including detailed air quality monitoring, an interactive weather map, and Android home screen widgets. The period also saw the implementation of robust local caching with Isar, expanded internationalization via Slang, and the establishment of a comprehensive test suite to ensure stability.

Features

Added Linux plugin registrations for system colors, timezone, and app restart

The Linux build now registers five new Flutter plugins: dynamic\_system\_colors, flutter\_timezone, isar\_community\_flutter\_libs, restart\_app, and url\_launcher\_linux. This enables the application to access dynamic system colors, retrieve the device timezone, use Isar database libraries, restart the application process, and launch URLs on Linux. Additionally, the JNI plugin is added to the FFI plugin list.

linux/flutter · high confidence

Added domain logic for loading and validating saved city weather cards

This change introduces two new domain classes to handle the persistence and integrity of saved city data. The \CitiesLoadResolver\ manages the retrieval of weather cards from the database, ensuring that an empty result is treated as a valid state rather than an error. The \WeatherCardValidator\ provides utilities to check if a saved card contains all necessary fields for network refreshes, determine if data has expired, filter cards based on completeness or expiry, perform text-based search matching against city or district names, locate cards by ID, and repair index mismatches in the stored list.

lib/features/cities/domain · high confidence

Added i18n validation tool and FLOSS dependency override

The tool directory now includes a new Dart script (validate\_i18n.dart) that validates internationalization JSON files by checking for key parity across locales and detecting untranslated English keys, with CLI flags to control reporting and failure behavior. Additionally, a new pubspec override file (pubspec\_overrides.floss.yaml) was added to pin the geolocator\_android dependency to a specific Git fork (Zverik/flutter-geolocator, ref floss), likely to support FLOSS (Free/Libre Open Source Software) compliance or specific localization needs.

tool · high confidence

Added native splash screen support for web builds

The web application now displays a branded splash screen while the Flutter engine initializes. This is achieved by injecting a new splash layout into index.html, which includes CSS styles for centering and background theming, and a script that removes the splash elements once the app is ready. The splash image respects the user's system color scheme (light or dark mode) and scales appropriately across different device pixel ratios.

web · high confidence

Automated APK build and release asset preparation scripts

Added a suite of shell scripts to automate the Flutter APK build process for GMS and Floss variants. The new \build\_apk.sh\ script handles variant-specific configuration (including Floss overrides), dependency resolution, and invokes helper scripts for reproducible JNI builds and output renaming. \build\_release\_apks.sh\ orchestrates the full release set (splits and universal APKs for both variants) and restores default dependencies afterward. Supporting scripts \patch\_jni\_reproducible\_build.sh\ and \rename\_apk\_outputs.sh\ ensure consistent, reproducible binary outputs and correctly named release assets, while \restore\_pub\_default.sh\ cleans up local overrides.

scripts · high confidence

Introduce new data repositories for cities, settings, and weather

Added three new repository classes in the data layer to manage local persistence and remote data coordination. The CitiesRepository handles saving, reordering, and refreshing weather cards using Isar, including logic to repair display indices. The SettingsRepository manages app settings and clock skew persistence, while also reading the primary location cache. The WeatherRepository coordinates fetching fresh weather data from remote sources and managing the local main weather and location caches, including expiration checks and clearing logic.

lib/data/repositories · high confidence

Migrated internationalization to Slang with expanded language support

The app's internationalization system has been replaced with the Slang library, introducing generated locale files and a new utility layer for managing language settings. This change adds support for 36 languages, including new locales such as Assamese (as\_IN), Georgian (ka\_GE), Odia (or\_IN), and Punjabi (pa\_IN), while maintaining existing translations. Users will benefit from improved locale handling and date formatting reliability across the application.

lib/i18n · high confidence

New Air Quality Card with Pollutant Breakdown

Users can now view a dedicated Air Quality card in the weather forecast. This card displays the current Air Quality Index (AQI) value, a severity badge, and a color-coded scale bar indicating the pollution level. Below the main AQI display, a collapsible section reveals a detailed list of individual pollutant concentrations (such as PM2.5, PM10, etc.), each shown with a proportional colored bar to visualize relative impact.

_lib/features/weather/presentation/widgets/air\quality · high confidence

New Material You home-screen weather widgets

The Android app now includes native home-screen widgets that display current weather conditions, a 1x1 forecast summary, and a horizontal clock-style widget. These widgets use Material You theming, automatically adapting to light and dark system palettes, and support custom background and text colors. They are built using Kotlin and the HomeWidget plugin, with a dedicated refresh coordinator that updates the widgets when the device theme or locale changes.

android/app · high confidence

New city weather detail and list screens

Added PlaceInfo and PlaceList views for the cities feature. PlaceInfo displays full weather details for a single city, syncing time indices and scrolling to the current hour based on the city's timezone. PlaceList provides a searchable, refreshable list of saved city weather cards, handling loading, error, and empty states.

lib/features/cities/presentation/view · high confidence

New data models for Air Quality, City search, and Weather forecasts

The \lib/data/models\ directory now includes new model definitions to support additional data sources and local storage. \air\_quality\_api.dart\ introduces \AirQualityDataApi\ and \AirQualityHourly\ to parse hourly air quality metrics (such as European/US AQI, PM2.5, PM10, ozone, and various pollutants) from the Open-Meteo Air Quality API. \city\_api.dart\ adds \CityApi\ and \Result\ classes to handle geocoding search responses from Open-Meteo. \weather\_api.dart\ defines \WeatherDataApi\, \Hourly\, and \Daily\ models to parse standard weather forecast data, including temperature, precipitation, wind, and UV index. Additionally, \db.dart\ expands the local \Settings\ collection with new fields for air quality standards (\aqiStandard\), widget theming (background/text colors for light/dark modes), and notification settings, while the \MainWeatherCache\ collection is updated to store the new air quality metrics locally.

lib/data/models · high confidence

New home shell UI with Riverpod state management and persistent notifications

The home screen shell has been rebuilt to use Flutter Riverpod for state management and Material 3 components (NavigationBar, TabBarView). This change introduces a persistent notification feature on Android that refreshes weather data every minute when enabled in settings, and adds an inline city search field within the weather tab's app bar. The shell now dynamically adjusts its tab count based on the 'hide map' setting, ensuring the UI remains consistent when users toggle map visibility.

lib/features/shell · high confidence

The map feature now includes a new MapPage that renders an interactive weather map using flutter\_map, displaying animated markers for the main location and saved cities. Users can search for cities via a built-in search field, tap markers to view detailed weather cards with slide animations, and utilize an expandable floating action button for quick navigation. The implementation integrates with Riverpod for state management and includes caching for map tiles to improve performance.

lib/features/map · high confidence

New open-source license screen and widget configuration in Settings

The Settings feature now includes a dedicated Open Source Licenses screen (AppLicensePage) that lists all dependencies and allows users to view full license texts in a dialog, along with a shimmer loading state. Additionally, a new Widget Settings page (WidgetSettingsPage) has been added to configure Android home-screen widget colors (background and text) and manage background refresh status, supported by a reusable HSV color picker and selection dialogs.

lib/features/settings · high confidence

New weather and air quality data sources with local caching

The app now fetches a 12-day weather forecast and 7-day air quality forecast from the Open-Meteo API, merging air quality metrics (European/US AQI, PM2.5, PM10, ozone, CO, NO2, SO2) into the weather data. Weather data is persisted locally using Isar for offline access and cache validation, while city search and reverse geocoding are handled via Open-Meteo and Nominatim APIs.

lib/data/datasources · high confidence

New widget data bridge for Android home screen widgets

A new \WidgetDataBridge\ class has been added to the Android app to handle loading weather data and appearance settings for home screen widgets. This component reads configuration (such as theme mode, time format, and color preferences) and current weather payload (location, temperature, icon) from shared preferences, parsing them into structured data classes for use by the widget UI.

app · high confidence

Project documentation and configuration scaffolding

The repository now includes essential project documentation and configuration files to support development and community contribution. A new Code of Conduct and Contributing guide establish community standards and provide detailed instructions for setting up the development environment, running tests, and building release APKs. The project is now licensed under the MIT License. Additionally, configuration files for the build system (build.yaml) and internationalization (slang.yaml) have been added, and the README has been expanded to describe the app's features, data sources, and build stack.

(repo-wide) · high confidence

Architecture

App initialization and core infrastructure restructured

The app's startup sequence has been consolidated into a dedicated bootstrap layer that initializes the Isar local database, applies schema migrations for weather caches and notification channels, and configures Android notification channels and home-screen widgets. Navigation has been migrated to GoRouter with a provider-based router that handles onboarding and geolocation redirects, while dependency injection now uses Riverpod providers to manage services like connectivity, location, and weather repositories. The settings system has been refactored to use a catalog-driven approach for appearance and data pickers, and a new settings revision mechanism ensures dependent UI components rebuild when preferences change.

lib/core · high confidence

Behavioural changes

Application window title capitalization corrected

The main application window title has been changed from the lowercase 'rain' to the capitalized 'Rain'. This affects the text displayed in the window's header bar or title bar, depending on the current UI configuration.

linux · high confidence

Geolocation screen rewritten with Riverpod and GoRouter

The geolocation selection screen has been completely rewritten to migrate from GetX to Riverpod for state management and GoRouter for navigation. This change introduces a new UI implementation using Material UI and FlutterMap, integrating with the updated dependency stack (including Iconsax Plus and Slang for i18n) to allow users to select or edit their primary weather location via map interaction, city search, or current location detection.

lib/features/geolocation · high confidence

Migrate cities state management to Riverpod

The application layer for the cities feature has been rewritten to use Riverpod instead of the previous state management solution. This introduces a new \CitiesNotifier\ that manages the list of saved weather cards, handling local cache loading, online refreshes, and error states. The change ensures that cached cards are displayed immediately while fresh data is fetched in the background, improving perceived performance and reliability when the device is offline or connectivity is intermittent.

lib/features/cities/application · high confidence

Migrate to Riverpod, GoRouter, and Material UI

The application has been refactored to replace the previous state management and routing stack with Riverpod for dependency injection and state, GoRouter for navigation, and the material\_ui package for UI components. The entry point now initializes an AppBootstrap object and wraps the root RainApp widget in a ProviderScope, while the app itself is configured with dynamic color support, edge-to-edge display handling, and a compatibility bridge for third-party packages still using the standard Flutter Material library.

lib · high confidence

Migrate weather application logic to Riverpod

The main weather application logic has been migrated from the previous state management approach to Riverpod, introducing a new \MainWeatherNotifier\ and its associated provider. This change implements a stale-while-revalidate caching strategy to ensure the main weather tab remains responsive by displaying cached forecasts during background refreshes, and integrates with the new navigation and dependency injection structures.

lib/features/weather/application · high confidence

New main weather screen with Riverpod state management and persistent clock sync

The main weather screen in the presentation layer has been rewritten to use Riverpod for state management, replacing the previous implementation. It now features a persistent timer that syncs current time indices every 30 seconds, ensuring the displayed hourly forecast remains accurate. The screen renders a detailed weather view with support for daily forecasts, AQI standards, and handles loading states with shimmer placeholders and empty states with error messaging when forecast data is unavailable.

lib/features/weather/presentation · high confidence

Redesigned city card UI with new editing and list management widgets

The cities feature now uses a new set of presentation widgets to manage saved city weather data. Users can create or edit city cards via a bottom sheet form (PlaceAction) that validates inputs and handles unsaved-change warnings. Saved cities are displayed in a reorderable list (PlaceCardList) where cards can be swiped to delete or tapped to view details. The card display (PlaceCard) shows current temperature, weather conditions, location, and a live wall-clock time, with shimmer placeholders during loading. Incomplete or error-state cards show a retry button to refresh data.

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

Rewritten weather detail UI with Riverpod and Material 3

The weather detail view and its components (daily forecast, hourly strip, current conditions, and variable grids) have been rebuilt from the ground up. The presentation layer now uses Riverpod for state management and the Material 3 (material\_ui) library for styling, replacing the previous implementation. This change introduces a new layout for the 7-day forecast preview and detail pages, a redesigned hourly forecast strip with selectable tiles, and an expandable grid for hourly/daily weather metrics. The widgets are now fully locale-aware for dates and units, and the current conditions header supports a toggleable large-icon layout based on user settings.

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

Windows build now supports multiple target platforms and registers additional native plugins

The Windows build configuration has been updated to support target platforms beyond the hardcoded x64 architecture by introducing a configurable \FLUTTER\_TARGET\_PLATFORM\ variable, allowing the build to adapt to different Windows architectures. Additionally, the Windows platform now registers several new native plugins, including connectivity\_plus, dynamic\_system\_colors, flutter\_timezone, geolocator\_windows, isar\_community\_flutter\_libs, restart\_app, and url\_launcher\_windows, enabling these features to function correctly on Windows devices.

windows · high confidence

iOS app now requires iOS 13+ and includes location permissions

The iOS build now targets a minimum of iOS 13.0 (up from 11.0) and includes the necessary permission descriptions for accessing the device's location (NSLocationWhenInUseUsageDescription and NSLocationTemporaryUsageDescriptionDictionary) in the Info.plist. The launch screen has been updated to support a background image, and the project has been configured to use CocoaPods for dependency management.

ios · high confidence

macOS app now supports background tasks, location, and system integrations

The macOS build now registers a suite of new plugins, enabling features such as background work execution (workmanager), device information retrieval, dynamic system color support, local notifications, timezone handling, geocoding, geolocation, package info, app restart capabilities, URL launching, and connectivity monitoring. This expands the macOS platform's feature parity with other supported platforms by activating these native capabilities.

macos/Flutter · high confidence

Test coverage

Added core unit and widget tests for app bootstrap, navigation, and services; Added initial macOS test suite scaffold; Added tests for settings feature components; Added unit tests for AirQualityMapper and WeatherMapper; Added unit tests for cities feature application and domain logic; Added unit tests for data layer components; Added unit tests for weather application logic; Added widget tests for app screens; Added widget tests for app settings, onboarding, and settings UI components; Added widget tests for cities feature UI components; New test infrastructure and mock helpers for the test suite.

Dependencies

Gradle wrapper upgraded to version 9.3.1

The Android build system now uses Gradle 9.3.1 instead of the previous version 7.4. This update to the wrapper configuration ensures that the project builds with the newer Gradle release, which may bring performance improvements, new features, and compatibility updates for the Android toolchain.

android/gradle · high confidence

Major dependency upgrade and Android build system migration

The project has undergone a significant dependency and build infrastructure update. On the Dart side, the SDK constraint has been raised to 3.13.3, and key libraries have been upgraded, including Riverpod (to 3.4.3), GoRouter (to 18.0.1), Dio (to 5.11.1), and Isar (to 3.3.2). On the Android side, the build system has migrated from the legacy \apply plugin\ syntax to the modern Gradle Plugin DSL, updating the Android Gradle Plugin to 9.1.1 and Kotlin to 2.4.0. This migration also introduces Java 17 compatibility, a new application namespace (\com.yoshi.rain\), and support for FLOSS (Free/Libre Open Source Software) product flavors to exclude Google Play Services.

(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

Baseline

  • First survey — no prior run to compare against. CAI 58.

Lenses

  • Code Health 95
  • Architecture 96
  • Maturity 59
  • Readiness 33
  • Security 100
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 206 feature/other, 94 fixes

By area

  • (root) — 74 commits
  • lib/app — 64 commits
  • (repo) — 50 commits
  • lib/translation — 40 commits
  • lib/core — 14 commits
  • lib/i18n — 14 commits
  • android/app — 12 commits
  • lib/features — 11 commits
  • lib/main.dart — 5 commits
  • fastlane/metadata — 4 commits
  • test/core — 3 commits
  • assets/i18n — 2 commits
  • .github/ISSUE_TEMPLATE — 1 commit
  • .github/workflows — 1 commit
  • android/settings.gradle — 1 commit
  • assets/images — 1 commit
  • assets/weather_icons — 1 commit
  • lib/data — 1 commit
  • lib/theme — 1 commit

Notable commits

  • fix: Add da_DK locale and fix error
  • fix: Add fonts and fix translate
  • fix: Add test and fix bugs
  • fix: Bump Kotlin to 1.9.10 Fixed build errors
  • fix: Fix AQI
  • fix: Fix ExpandableFab
  • fix: Fix UI
  • fix: Fix UI
  • fix: Fix UI widget
  • fix: Fix analyze
  • fix: Fix anim new add form && Add feels to the top tile
  • fix: Fix animation markers
  • fix: Fix api code
  • fix: Fix bug
  • fix: Fix bugs
  • fix: Fix bugs
  • fix: Fix bugs
  • fix: Fix bugs
  • fix: Fix bugs 2
  • fix: Fix build
  • …and 280 more

Architecture

  • 0 containers · 1 bounded contexts · 0 dependency edges (baseline)

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

Survey your own repository

darkmoonight/Rain 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 19 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 8a897f6f6d86821251456cb3d8fb705c13560fc1 — 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-13a154b7f5d1.