darkmoonight/Rain
57.7
Adequate · 19 September 2026
18.7k
lines of production code
Dart
primary language
1
measurement over time
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
New interactive weather map with animated markers and city search
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.