Skip to content
CAI
Software that uses CAICheck a score

MathRoda/DashCoin

47.7

Weak · 22 September 2026

12.3k

lines of production code

Kotlin

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is a cross-platform mobile application for tracking cryptocurrency and financial news, built using Kotlin Multiplatform (KMP) to share business logic and UI components across Android and iOS. The system provides user authentication, real-time market data visualization, and personalized news feeds, while managing local caching and background synchronization. It utilizes a modern Android and iOS tech stack, including Jetpack Compose, Ktor, and Room, to deliver a unified experience on both platforms.

How it got here

2022 — Architecture modernization and cross-platform foundation

8 changes.

The project underwent a significant architectural overhaul, removing legacy data and presentation layers while introducing a new cross-platform network module built with Ktor and Koin. This period also focused on establishing a robust foundation for the Android app by migrating the build system to Kotlin DSL, upgrading Gradle, and adding essential infrastructure for background synchronization and connectivity.

2023–2024 — KMP migration and feature expansion

13 changes.

This period focused on migrating the codebase to Kotlin Multiplatform (KMP) and establishing a unified architecture for Android and iOS. Key developments included implementing local caching with Room, creating shared charting and authentication UI components, and restructuring the Android and iOS app modules. The work also involved centralizing dependency management and fixing compilation issues related to the Kotlin 2.0.0 upgrade.

Features

Add common charting components for bar, line, and pie charts

The features/common area now includes the shared UI components and internal implementations for rendering bar, stacked bar, line, and pie charts. This includes the public composables (BarChartView, StackedBarChartView, LineChartView, PieChartView) that accept data sets and styles, along with internal helpers for data validation, animation specifications, and layout logic. Users can now display interactive charts with touch feedback, error states, and customizable styling across iOS and Android via the common module.

features/common · high confidence

Added basic email/password and Google sign-in UI for the login screen

The auth/signin module now includes the BasicSignIn composable and its associated LoginSection component, introducing the primary user interface for logging in. Users can now enter their email and password, toggle password visibility, and trigger a login action via a dedicated button. The screen also provides navigation to the forgot password flow and includes a placeholder for Google sign-in, which is currently commented out with a TODO note regarding iOS/Android OAuth implementation.

auth/signin · medium confidence

Added basic forgot password and sign-up screens

The application now includes new UI components for user authentication flows. Specifically, a 'BasicForgotPasswordScreen' has been added to handle password reset requests via email, and a 'BasicSignUpScreen' has been introduced to allow new users to register with a username, email, and password. These screens provide the frontend interfaces for account recovery and new user registration.

auth/forgot-password, auth/signup · high confidence

Added cross-platform network layer for fetching crypto and news data

Introduced a new \core-network\ module providing a shared API client for retrieving cryptocurrency details, charts, and news. The implementation uses Ktor with platform-specific HTTP engines (OkHttp for Android, Darwin for iOS) and Koin for dependency injection, including error handling and JSON serialization.

core-network · high confidence

Added new Favorite Coins, News, and Profile drawer UI components

Introduced new UI screens and components for the Favorite Coins, News, and Profile features. The Favorite Coins feature now includes a main screen with user-state-specific views (authed, ghost, and premium users) and a pull-to-refresh list of favorite coins. The News feature adds a market news screen with a filter picker (Trending, Latest, Bullish, Bearish) and news cards. The Profile feature adds a drawer layout with a header displaying user info and a footer with social media links and sign-out functionality.

features/favorite-coins, features/news, features/profile · high confidence

Added project documentation and licensing

The repository now includes a comprehensive README.md file that introduces the Dash Coin application, detailing its features, installation methods, technical stack (including Retrofit, Jetpack Compose, and Clean Architecture), and links to external resources. Additionally, an Apache License 2.0 file has been added to the project root, and the .gitignore file has been updated to exclude a specific network API file.

(repo-wide) · high confidence

Adds platform-specific infrastructure for background sync, internet connectivity, and device motion

The core-infrastructure module now includes platform-specific implementations for background task scheduling, real-time internet state monitoring, and device motion detection. On Android, this introduces a WorkManager-based periodic worker (DashCoinWorker) that triggers background syncs at intervals determined by the user's subscription status (e.g., every 10 minutes for premium users, daily for others), alongside Android-specific connectivity and accelerometer services. On iOS, the module provides the corresponding implementations for internet connectivity and phone shaking detection. These changes enable the app to maintain data synchronization and react to device movement in a platform-appropriate manner.

core-infrastructure · high confidence

Core utilities and platform-specific implementations added

The core module now includes shared utility functions for formatting numbers, validating emails and passwords, and generating unique identifiers, alongside a constants file defining app strings and API endpoints. Platform-specific implementations for Android and iOS provide the actual logic for generating UUIDs and setting up the Koin dependency injection module, enabling the application to run on both mobile platforms.

core · high confidence

Generated build configuration for the shared module

A new auto-generated BuildConfig class has been added to the shared module, exposing build-time constants such as the debug flag, library package name, and build type. This provides a centralized, compile-time accessible configuration for the shared codebase.

shared/build/generated · high confidence

Introduces local Room database caching for favorite coins and user data

The core-cache module now implements a local data layer using Room for both Android and iOS platforms. This adds a new local cache for favorite coins and user information, replacing previous remote-only or different local storage approaches. The change includes database entities (FavoriteCoinEntity, UserEntity), data access objects (FavoriteCoinsDao, UserDao), type converters, and platform-specific Koin modules to initialize the Room database on each OS.

core-cache · high confidence

iOS app scaffolding and initial configuration added

The iOS application structure has been established, introducing the main entry point (iosAppApp) that initializes Firebase and Koin, and a ContentView that wraps the shared Compose UI. The project includes standard Xcode project files, configuration settings (bundle ID, app name), asset catalogs, and default unit and UI test suites.

core/build/generated, iosApp · medium confidence

Removals

Removed legacy data layer and presentation components

The app's legacy data layer and presentation components have been removed. This includes the \DashCoinApi\ interface and associated DTOs (ChartDto, Coin, CoinDto, News, NewsDto, ReactionsCount), the \DashCoinRepository\ interface and its implementation, domain models (Charts, CoinDetail), use cases (GetChartUseCase, GetCoinUseCase, GetCoinsUseCase, GetNewsUseCase), and the \CoinsViewModel\ and \MainActivity\ that relied on them. Additionally, the Hilt dependency injection configuration in \AppModule\ and the \DashCoinApplication\ class have been deleted, along with example unit and instrumented tests.

app/src · high confidence

Behavioural changes

Added ProGuard and build configuration files to core-datasource

The core-datasource module now includes essential build configuration files: a .gitignore to exclude build artifacts and sensitive files, a consumer-rules.pro file, and a proguard-rules.pro file containing default ProGuard rules for code obfuscation and optimization.

core-datasource · medium confidence

Added build configuration files to auth modules

Added .gitignore, consumer-rules.pro, and proguard-rules.pro files to the forgot-password, signin, and signup modules within the auth directory. These files configure build-time exclusions and ProGuard rules for each module.

auth · high confidence

Added domain models for chart time spans and news types

The core-domain module now includes new Kotlin enum classes for chart time spans (1 day, 1 week, 1 month, 1 year, and all) and news types (handpicked, trending, latest, bullish, and bearish). These domain models are now available for use across the application's common code.

core-domain · high confidence

Android app structure and UI theme updated

The Android application module has been reorganized from the root 'app' directory to 'androidApp', with all source files, resources, and configuration files moved accordingly. The app's visual identity has been updated: the splash screen now uses a custom 'DashCoin' icon and a blue background, the app icon has been renamed to 'ic\_dashcoin', and the status bar color has changed to dark gray. Additionally, the app now supports deep links via a new intent filter and initializes Koin for dependency injection.

androidApp · high confidence

Centralized dependency and version management for Android and KMP

The buildSrc module now centralizes all dependency versions and library coordinates in Kotlin files (Configuration.kt, Deps.kt, Version.kt). This update introduces support for KMP libraries, including the Konnectivity library for internet state updates, the Charts library for cross-platform graphing, and the Voyager navigation library for KMP. It also updates core AndroidX Compose, Koin, and Ktor dependencies, reflecting a shift towards a unified dependency management structure for both Android and iOS targets.

buildSrc · high confidence

Gradle wrapper upgraded to 8.8

The project's Gradle wrapper has been updated from version 7.3.3 to 8.8, ensuring that builds use the latest Gradle release for improved performance and compatibility.

gradle · high confidence

Kotlin 2.0.0 compiler crash in ProfileViewModel

The \ProfileViewModel\ in the \feat-profile\ module fails to compile with a \BackendException\ from the Kotlin 2.0.0 compiler. The error occurs during IR lowering and code generation for the \updateProfilePicture\ function, specifically when handling the \updateUserProfilePicture\ flow from \FirebaseRepository\. This prevents the application from building successfully.

.kotlin · high confidence

Migrate data and domain modules to KMM libraries

The data and domain modules have been migrated to KMM libraries, introducing new view models for authentication flows (sign-in, sign-up, and password reset) and implementing platform-specific Google authentication providers for Android and iOS. The repository layer now utilizes a unified \DashCoinRepository\ that coordinates between local caching (DataStore, Room) and remote sources (Firebase, API), while use cases manage favorite coins and user states.

core-datasource/src, shared · high confidence

Dependencies

Migrated Android app build configuration from Groovy to Kotlin DSL

The project's build system has been refactored from Groovy scripts to Kotlin DSL (build.gradle.kts). This change introduces a centralized build configuration in the root build.gradle.kts, defining plugin versions for Android (8.5.2), Kotlin (2.0.20), and Compose (1.7.0-beta02). The migration also updates the Gradle JVM memory allocation to 4096m and configures KSP for Room database schema generation.

(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 54 → 48 (-6.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 98 → 98 (-0.3)
  • Architecture 99 → 99 (-0.5)
  • Maturity 64 → 66 (+2.8)
  • Readiness 24 → 15 (-9.3)
  • Security 90 → 100 (+10.0)
  • Domain Modelling 100 → 70 (-30.3)

Resolved (18)

  • Boundary-crossing change coupling: FirebaseRepository.kt ↔ FavoriteCoinsViewModel.kt (core-datasource/src/commonMain/kotlin/com.mathroda.datasource/firebase/FirebaseRepository.kt)
  • Change coupling: DashCoinApi.kt ↔ Coin.kt (core-network/src/commonMain/kotlin/com.mathroda/network/DashCoinApi.kt)
  • Change coupling: DashCoinApplication.kt ↔ Constants.kt (androidApp/src/main/java/com/mathroda/dashcoin/DashCoinApplication.kt)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (13 lines × 2) (features/favorite-coins/src/commonMain/kotlin/com/mathroda/favorites/components/authed_users/FavoriteCoinsAuthedUsers.kt)
  • Duplicated block (13 lines × 2) (features/profile/src/commonMain/kotlin/com/mathroda/profile/drawer/DrawerFooter.kt)
  • Duplicated block (14 lines × 2) (auth/signin/src/commonMain/kotlin/com/mathroda/signin_screen/BasicSignIn.kt)
  • Duplicated block (14 lines × 2) (auth/signup/src/commonMain/kotlin/com/mathroda/signup/BasicSignUpScreen.kt)
  • Duplicated block (14 lines × 2) (features/common/src/commonMain/kotlin/com/mathroda/common/components/CustomDialog.kt)
  • Duplicated block (15 lines × 2) (auth/forgot-password/src/commonMain/kotlin/com/mathroda/BasicForgotPasswordScreen.kt)
  • Duplicated block (15 lines × 2) (features/coins/src/commonMain/kotlin/com/mathroda/coins/components/CoinsScreenState.kt)
  • Duplicated block (15 lines × 2) (features/common/src/commonMain/kotlin/com/mathroda/common/components/CustomDialog.kt)
  • Duplicated block (25 lines × 2) (features/favorite-coins/src/commonMain/kotlin/com/mathroda/favorites/components/authed_users/FavoriteCoinsAuthedUsers.kt)
  • No exposed public API
  • Test reliability not included
  • There is no dedicated Built With or License section in the visible text. (README.md)
  • dormant codebase — no living knowledge left to concentrate

New (25)

  • Boundary-crossing change coupling: CoinsScreen.kt ↔ App.kt (features/coins/src/commonMain/kotlin/com/mathroda/coins/CoinsScreen.kt)
  • Boundary-crossing change coupling: DashCoinRepositoryImpl.kt ↔ CoinsViewModel.kt (core-datasource/src/commonMain/kotlin/com.mathroda.datasource/core/DashCoinRepositoryImpl.kt)
  • Boundary-crossing change coupling: DashCoinWorker.kt ↔ BasicCoinDetailScreen.kt (core-infrastructure/src/androidMain/kotlin/com/mathroda/workmanger/worker/DashCoinWorker.kt)
  • Change coupling: BasicSignUpScreen.kt ↔ Constants.kt (auth/signup/src/commonMain/kotlin/com/mathroda/signup/BasicSignUpScreen.kt)
  • Change coupling: CoinsViewModel.kt ↔ FavoriteCoinsViewModel.kt (features/coins/src/commonMain/kotlin/com/mathroda/coins/CoinsViewModel.kt)
  • Change coupling: SignInViewModel.kt ↔ Constants.kt (auth/signin/src/commonMain/kotlin/com/mathroda/signin_screen/SignInViewModel.kt)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no licence statement (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (13 lines × 2) (auth/signup/src/commonMain/kotlin/com/mathroda/signup/BasicSignUpScreen.kt)
  • Duplicated block (13 lines × 2) (features/profile/src/commonMain/kotlin/com/mathroda/profile/drawer/DrawerFooter.kt)
  • Duplicated block (14 lines × 2) (auth/forgot-password/src/commonMain/kotlin/com/mathroda/BasicForgotPasswordScreen.kt)
  • Duplicated block (14–17 lines × 2) (features/common/src/commonMain/kotlin/com/mathroda/common/components/CustomDialog.kt)
  • Duplicated block (16–17 lines × 2) (features/coins/src/commonMain/kotlin/com/mathroda/coins/components/CoinsScreenState.kt)
  • Duplicated block (19 lines × 2) (features/common/src/commonMain/kotlin/com/mathroda/common/components/CustomDialog.kt)
  • Duplicated block (19–21 lines × 2) (features/favorite-coins/src/commonMain/kotlin/com/mathroda/favorites/components/authed_users/FavoriteCoinsAuthedUsers.kt)
  • Duplicated block (25–26 lines × 2) (features/favorite-coins/src/commonMain/kotlin/com/mathroda/favorites/components/authed_users/FavoriteCoinsAuthedUsers.kt)
  • Inverted test pyramid
  • Leaked secret: hardcoded-credential (shared/src/commonMain/kotlin/com/mathroda/shared/navigation/main/MainGraph.kt)
  • …and 5 more

Architecture

  • Containers 0 added · 0 removed · contexts 17 added · 0 removed · edges 35 added · 0 removed

Added bounded contexts (17)

  • chart
  • coin-details
  • coins
  • common
  • core
  • core-cache
  • core-datasource
  • core-domain
  • core-infrastructure
  • core-network
  • favorite-coins
  • forgot-password
  • news
  • onboarding
  • profile
  • signin
  • signup

Added dependency edges (35)

  • coin-details → core (coupling)
  • coin-details → core-datasource (coupling)
  • coin-details → core-domain (coupling)
  • coin-details → core-infrastructure (coupling)
  • coins → core-datasource
  • coins → core-domain (coupling)
  • coins → core-infrastructure (coupling)
  • coins → profile
  • common → core
  • common → core-domain (coupling)
  • core-cache → core-domain (coupling)
  • core-datasource → core
  • core-datasource → core-cache
  • core-datasource → core-domain (coupling)
  • core-datasource → core-network
  • core-infrastructure → core
  • core-infrastructure → core-datasource (coupling)
  • core-network → core-domain (coupling)
  • favorite-coins → core
  • favorite-coins → core-datasource (coupling)
  • …and 15 more

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

Survey your own repository

MathRoda/DashCoin 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 22 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 cf303ba50bad35a816253bee5b27beee5ea364b8 — 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-90d5d2fe38ee.