sawal-timsina/flutter-skeleton
65.6
Adequate · 21 September 2026
1.9k
lines of production code
Dart
primary language
4
measurements over time
What this system is
This system is a Flutter-based mobile application skeleton designed to provide a modern, feature-complete foundation for building cross-platform apps. It implements a clean architecture with a feature-based directory structure, utilizing Riverpod for state management and GoRouter for navigation. The codebase includes essential infrastructure for continuous integration, automated testing, and UI component libraries, serving as a reusable template for rapid application development.
How it got here
2022 — Modernization and state management migration
16 changes.
This period focused on modernizing the codebase by migrating state management from Provider to Riverpod and replacing Firebase authentication with a custom HTTP-based solution. The update also involved upgrading build tools, raising iOS deployment targets, and refactoring UI components to use a shared input field layout.
2023–2024 — Initial feature and infrastructure setup
10 changes.
This period focused on establishing the application's core architecture and user flows, including authentication, onboarding, and home screens. The team also implemented essential infrastructure, such as CI/CD pipelines, Git hooks, and integration tests, to support the new feature set.
Features
Add Git hooks for commit message validation and pre-commit checks
A new Dart script at bin/git\_hooks.dart introduces automated Git hooks. The pre-commit hook enforces code quality by running dart fix, dart format, and dart analyze on staged Dart files, and warns about outdated packages. The commit-msg hook validates that commit messages follow a specific set of allowed prefixes (feat, fix, chore, etc.).
bin · high confidence
Add language switcher and migrate header to Riverpod
A new language switcher feature is introduced, comprising a draggable LanguageSettings widget and a LanguageSwitch wrapper that renders it in an Overlay during development. The Header molecule is migrated from the Provider package to Flutter Riverpod, switching from a standard StatelessWidget to a ConsumerWidget that watches the auth state via the new authRepositoryProvider. Additionally, the PageHeader molecule updates its title text to 'Flutter App Skeleton' and uses the displayLarge text style.
lib/src/widgets/molecules · high confidence
Add route logging, query context, and app locale constants
Introduces a new RouteLogger class that logs navigation events (push, pop, remove, replace) to the debug console, providing visibility into the app's navigation flow. Adds a QueryContext class to manage pagination and query parameters. Updates the constants file to define AppLocale for Japanese and English, and introduces a Flavour enum for environment configuration. These changes enhance debugging capabilities, state management for queries, and localization support.
lib/src/core/utils · high confidence
Added CI/CD configuration for automated Flutter builds
Introduced a new CircleCI pipeline to automate the build process for the Android application. The configuration defines a 'build-dev' job that installs Flutter SDK 3.13.9, sets up build variables (CONFIG, KEY\_PROPERTIES, KEYSTORE) from environment secrets, and generates a release APK. The workflow also includes steps to update the app name based on the branch, store the resulting APK as an artifact, and automatically comment on pull requests with a download link.
.circleci · high confidence
Added Fastlane configuration for Android Play Store deployments
The Android module now includes Fastlane configuration files (Appfile and Fastfile) that automate the process of building and uploading Android app bundles to Google Play. The setup defines lanes for internal testing, production releases, and service account validation, streamlining the release workflow for the 'com.example.flutter\_skeleton' package. Additionally, the Gradle wrapper has been updated to use Gradle 7.6.1.
android · high confidence
Added app routing configuration and router implementation
The application now includes a new routing setup in the \lib/src/config/router\ directory. This introduces a \ConstantRoutingConfig\ class to manage static routing rules and an \AppRouter\ that defines navigation paths for the Onboarding, Sign In, Sign Up, Home, and Demo screens. The router integrates with Riverpod to handle authentication state, redirecting unauthenticated users to the sign-in page and authenticated users away from the sign-in/sign-up flows.
lib/src/config/router · high confidence
Added demo, home, and not-found feature screens
The app now includes three new feature screens: a Home page with a navigation button, a Demo page with various routing actions (sign-in, onboarding, and home navigation), and a Not Found page for unmatched routes. These components provide the basic UI structure for the application's core navigation and error handling.
lib/src/features · high confidence
Added integration test driver entry point
A new entry point for the integration test driver has been added to the test\_driver directory, enabling the execution of integration tests.
_test\driver · high confidence
Added sign-in and sign-up screens with Riverpod state management
Introduced the authentication feature for the first time, providing the user interface and logic for signing in and signing up. The change adds the \SignIn\ and \SignUp\ presentation layers (views and controllers) that utilize \flutter\_riverpod\ for state management. It also introduces the \AuthRepository\ interface and its \HttpAuthRepository\ implementation, which currently uses mock data and placeholder API calls. This establishes the foundational structure for user authentication within the application.
lib/src/features/authentication · high confidence
Added version update checker
A new \version\_updator.dart\ file was added to the core module, implementing a \versionUpdater\ function that checks for app updates via the \app\_version\_update\ package and redirects users to the App Store if an update is available.
lib/src/core · high confidence
New core extensions for UI styling and context helpers
Added three new extension files in the core module to simplify common UI and navigation tasks. The \button.dart\ file provides extension methods on \OutlinedButtonThemeData\ to generate \ButtonStyle\ configurations for outline, disabled, and icon button variants. The \context.dart\ file adds a \BuildContext\ extension that exposes convenient access to the GoRouter, screen size, theme data, text styles, and colors, as well as helper methods to show bottom sheets and display snackbars with icons. The \other\_extenstion.dart\ file adds a \DotRemover\ extension on \String\ to parse version numbers by removing dots.
lib/src/core/extensions · high confidence
Architecture
Restructure onboarding feature into dedicated feature directory
The onboarding feature has been reorganized to follow a feature-based architecture. The presentation layer (UI and state management) has been moved into a new 'presentation' subdirectory within the onboarding feature folder. Additionally, the core provider logic has been migrated from the global providers directory to the feature-specific directory, and the provider has been updated to use Riverpod for state management.
lib/src/features/onboarding · high confidence
Behavioural changes
Migrate from Firebase to Riverpod and GoRouter
The application has replaced the Firebase authentication service with a custom HTTP-based authentication repository and migrated state management from Provider to Riverpod. The routing system has been updated to use GoRouter, and the app now checks for version updates on start and resume. Additionally, a language switcher widget has been added to the app builder.
lib/src · medium confidence
Migrate state management to Riverpod and introduce new providers
The application's state management has been updated to use Riverpod, replacing the previous ChangeNotifier-based implementation. A new connectivity status provider has been added to monitor network conditions, and a search provider has been introduced with debounced query handling. As part of this migration, the legacy Firebase-based authentication provider has been removed.
lib/src/providers · high confidence
Migrate to Riverpod for state management
The application's entry point in lib/main.dart has been updated to wrap the app in a ProviderScope, enabling Riverpod state management. This change replaces the previous initialization approach, integrating the new state management layer alongside the existing EasyLocalization setup.
lib · high confidence
Refactored form input widgets with a shared layout component
The form input components have been refactored to use a new shared \InputField\ wrapper that standardizes the display of labels, required indicators, and styling. \TextInput\ has been updated to use this wrapper and now supports prefix/suffix widgets, border customization, and explicit enabled/disabled states. A new \DropDown\ widget has been added to provide a consistent dropdown input experience. Additionally, the \Tag\ component's color mapping has been updated to use the primary color instead of green for secondary tags, and typography has been updated from \caption\ to \bodySmall\.
lib/src/widgets/atoms · high confidence
Removal of auto-generated assets mapping file
The auto-generated file lib/generated/assets.dart, which previously mapped asset paths for images and translations, has been removed from the project.
lib/generated · high confidence
Removal of legacy AppRouter route configuration
The file defining the application's route mapping (AppRouter) has been removed. This eliminates the previous mechanism for handling navigation states for login, registration, profile updates, and other app screens, indicating a shift away from this specific routing implementation.
lib/src/config/routes · high confidence
Removal of unused Demo page
The Demo page component, which previously displayed a title and was associated with DemoScreenArguments, has been removed from the application. This change eliminates dead code and simplifies the pages module by deleting the now-unused file.
lib/src/pages · high confidence
Switched API authentication from Firebase to a local auth token
The API client configuration now uses a local auth token (Config.authToken) instead of fetching an ID token from Firebase Auth. This change removes the Firebase dependency and the associated debug logging, while adding the PrettyDioLogger for request/response logging.
lib/src/config/api · medium confidence
Updated DoubleBackToClose widget to support async back-press handling
The DoubleBackToClose widget now allows the onBackPress callback to be asynchronous, enabling components to perform async operations before deciding whether to close. Additionally, the createState method now explicitly returns the generic State type, and local variable names were updated to follow current naming conventions.
lib/src/widgets/organisms · high confidence
Updated app theme and color palette
The application's visual style has been updated. The primary color scheme has changed from green to blue, and the secondary color has been switched to pink. Additionally, warning and error colors have been introduced. These changes affect the overall look and feel of the app, including text styles, input fields, and app bar themes.
lib/src/config/themes · high confidence
User model refactored to use manual JSON serialization
The User model has been refactored to replace the previous automatic JSON serialization (via json\_annotation) with manual serialization logic. This change introduces new fields (firebaseUid, nickName, residentStatus) and removes the dependency on the generated user.g.dart file, meaning the model now handles JSON conversion directly within the User class itself.
lib/src/models · high confidence
iOS minimum deployment target raised to iOS 11
The minimum supported iOS version for the app has been increased from 9.0 to 11.0, meaning the app will no longer run on devices with older iOS versions. This change is accompanied by the addition of a Fastlane configuration for iOS and updates to the Xcode project file to support CocoaPods integration, including new build phases for checking and embedding pods.
ios · high confidence
Test coverage
Added integration tests for the login flow
Added new integration tests for the login functionality. The test suite verifies that the login title is present and that tapping the login button executes without error, ensuring the login page renders and responds to user interaction correctly.
_integration\test · high confidence
Dependencies
Updated build tools and dependencies for modernization
The project has been upgraded to support modern development practices. The Android build system now targets Gradle 7.1.0 and Kotlin 1.8.0, while the iOS minimum deployment target has been raised to iOS 11.0. In the Dart/Flutter layer, the SDK constraint was updated to require Dart 3.1.5 or higher, and several core dependencies were upgraded, including Dio, Flutter FormBuilder, and GoRouter. Additionally, new packages for connectivity, version checking, and CI hooks were added to the project.
(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 58 → 66 (+7.9)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 99 (-1.0)
- Architecture 100 → 89 (-10.6)
- Maturity 41 → 55 (+13.9)
- Readiness 47 → 55 (+8.1)
- Security 88 → 91 (+2.9)
- Domain Modelling 100 → 100 (+0.0)
Resolved (13)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- Medium CVE: [GHSA redacted] (android/Gemfile.lock)
- Medium CVE: [GHSA redacted] (android/Gemfile.lock)
- No exposed public API
- Test reliability not included
- complexity unreadable for .dart, .kt, .swift — churn × complexity hotspots could not be measured
- dormant codebase — no living knowledge left to concentrate
New (18)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (12 lines × 2) (lib/src/features/onboarding/onboarding_provider.dart)
- Duplicated block (17 lines × 2) (lib/src/features/authentication/presentation/signin/signin_view.dart)
- Duplicated block (27 lines × 2) (lib/src/features/authentication/presentation/signin/signin_view.dart)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- High CVE: [GHSA redacted] (android/Gemfile.lock)
- Medium CVE: [GHSA redacted] (android/Gemfile.lock)
- Medium CVE: [GHSA redacted] (android/Gemfile.lock)
- No ADRs found
- No dependency advisory monitoring
- Outdated: fastlane
- Secret passed as a command-line argument
- TodoComment (lib/src/features/authentication/data/http_auth_repository.dart)
- TodoComment (lib/src/features/authentication/data/http_auth_repository.dart)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
sawal-timsina/flutter-skeleton 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 db678e9b5d83a5e9a21c7e2b886632dcf7a5dcd3 — 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.