Skip to content
CAI
Software that uses CAICheck a score

mshdabiola/Kmtemplate

57.6

Adequate · 21 September 2026

15.2k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Kmtemplate is a cross-platform application for managing notes, supporting Android, Desktop, and Web (Wasm) targets. It provides features for creating, editing, and organizing notes, with local persistence and network-based update checking. The system includes a settings interface for user preferences and a detailed view for note content. It also incorporates dynamic language switching and crash reporting capabilities.

How it got here

2024 — Architecture refactoring and cleanup

45 changes.

The project underwent a major structural overhaul, migrating from a flat module layout to a core/feature architecture while renaming the application to Kmtemplate. This period focused on removing legacy code, unused components, and platform-specific stubs across the codebase. Additionally, the build system was modernized with new Gradle tasks and conventions to automate development workflows.

2025 — Multi-platform feature expansion and localization

36 changes.

The project expanded its feature set by implementing a new Detail screen, a Main screen with empty states, and a Settings screen, while adding comprehensive localization support across multiple languages. Concurrently, the codebase was refactored to support WasmJs, Android, and Desktop platforms, with significant improvements to the data layer, navigation, and testing infrastructure.

Features

Add Main feature with Lottie empty state and translations

The Main feature now includes a new empty state screen featuring a Lottie animation (empty\_state.json) and localized strings for German, Spanish, Finnish, French, Italian, Polish, Portuguese, Russian, Turkish, and Vietnamese, alongside the English defaults. The MainScreen composable renders this animation when no items are present, and the MainViewModel manages the loading, empty, and success states for the note list.

feature/main · high confidence

Add UI test actions for the detail screen

A new Kotlin file, DetailActions.kt, was added to the benchmarks directory, introducing UI automation functions for the detail screen. These include goBack() to navigate back and addNote() to simulate user input for title and content fields, enabling more precise benchmarking of the detail view interactions.

benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/detail · medium confidence

Add model conversion extensions for UserPreferences and UserSettings

Added ModelExtension.kt to provide bidirectional conversion between the datastore model (UserPreferences) and the domain model (UserSettings). This includes mapping the dark theme configuration using a safe fallback to FOLLOW\_SYSTEM, and includes fields for showUpdateDialog and updateFromPreRelease.

core/data/src/commonMain/kotlin/com/mshdabiola/data · medium confidence

Add new Detail screen for viewing and editing notes

A new Detail screen has been introduced, allowing users to view and edit note titles and content. The implementation includes a ViewModel that handles note retrieval and auto-save via a 500ms debounce, and a UI that displays title and content text fields along with back and delete actions. The feature is supported by comprehensive unit and screenshot tests, and localized string resources for multiple languages.

feature/detail · high confidence

Add test tags for UI components

New test tag constants have been added for multiple screens and components, including AboutScreen, AppearanceScreen, DetailScreen, FaqScreen, KmtScaffold, LanguageScreen, MainScreen, NoteCard, ReleaseUpdate, ReportBugScreen, and UpdateScreen. These tags provide stable identifiers for UI elements, enabling more robust and maintainable UI testing.

core/model/src/commonMain/kotlin/com/mshdabiola/model/testtag · high confidence

Added Material 3 theme and font configuration for Android

Added new files to the \km tempate\ module to support Material 3 theming. \ui/theme/Color.kt\ defines light and dark color palettes with medium and high contrast variants. \ui/theme/Theme.kt\ assembles these into \ColorScheme\ objects and provides a \Theme\ composable. \ui/theme/Type.kt\ configures typography using Google Fonts (Roboto and Montserrat) via the AndroidX Google Fonts provider, and \res/values-v23/font\_certs.xml\ supplies the necessary certificate arrays for font loading on API 23+.

km tempate · high confidence

Added core design system components and theme infrastructure

The core/designsystem module now includes a comprehensive set of reusable UI components, including KmtButton, KmtTextField, KmtTopAppBar, KmtTab, and KmtLoading, alongside a SplashScreen implementation. The update also introduces a new theming system with support for dynamic color schemes on Android, Google Fonts integration for typography, and centralized color and background theme models. Additionally, the module now provides language support strings and test tags for the splash screen.

core/designsystem · high confidence

Added custom ktlint rules for naming conventions

The ktlint module now includes a custom rule set that enforces specific naming conventions for the application's UI components. The \PreferMethodNameRule\ flags usages of standard Material3 components (such as \MaterialTheme\, \Button\, \TabRow\, and \TopAppBar\) and suggests replacing them with \Kmt\-prefixed alternatives. Additionally, the \PreferReceiverNameRule\ enforces the use of \KmtIcons\ instead of the default \Icons\ receiver. These rules are registered via the \CustomRuleSetProvider\ and the associated service loader configuration.

ktlint/src/main · high confidence

Adds WasmJs note persistence via KStore

WasmJs clients can now persist notes locally using KStore. This change introduces the NoteEntity data model, a NoteDao interface, and a RealNoteDataSource implementation that manages note CRUD operations (create, read, update, delete) in memory. The Koin dependency injection module is also provided to wire the data source.

core/database/src/wasmJsMain · high confidence

Desktop app now supports dynamic language switching and integrates Bugsnag for crash reporting

On desktop, the app now supports dynamic language switching via a new \LocalAppLocale\ implementation that updates the system locale at runtime. The main entry point initializes Bugsnag for crash reporting and configures a custom log writer for desktop logging. Additionally, the \getPlatform()\ function is now public and returns a \Platform.Desktop\ object containing the operating system name and Java version, enabling platform-specific behavior.

app/src/jvmMain · medium confidence

Introduce user preferences persistence via DataStore

The app now persists user settings such as contrast, dark theme, dynamic color, onboarding status, gradient background, language, and update preferences. These preferences are stored locally using AndroidX DataStore on Android/JVM and KStore on Wasm, with platform-specific modules wiring the storage. A new test suite verifies that individual preference updates are correctly saved and emitted via the data flow.

core/datastore · high confidence

Introduce version parsing and update-checking logic for app updates

Added a new \ParsedVersion\ class that parses and compares semantic version strings, including support for pre-release identifiers (alpha, beta, rc). This enables the \RealNetworkRepository\ to fetch the latest release information, compare it against the current app version, and determine if a new update is available. The \UserDataRepository\ now persists user preferences for allowing pre-release updates and showing the update dialog, while the \DataModule\ wires these repositories via Koin.

core/data/src/commonMain/kotlin/com/mshdabiola/data/repository · high confidence

Introduces core model classes for app configuration, updates, and notifications

The application now includes a centralized \BuildConfig\ object containing version details (e.g., \1.2.20\), brand information, and developer contact links. A new \UserSettings\ data class manages user preferences, including theme settings (\DarkThemeConfig\), language, and update preferences (\updateFromPreRelease\, \showUpdateDialog\). The update system is supported by a \ReleaseInfo\ sealed class to represent update states (new update, up-to-date, or error) and a set of specific \UpdateException\ types (e.g., \AssetNotFoundException\, \InvalidVersionFormatException\) for error handling. Additionally, a \Notification\ sealed class with \Type\ and \SnackbarDuration\ enums enables structured notification handling, while \Platform\ and \Flavor\/\BuildType\ enums define device and build configurations.

core/model/src/commonMain/kotlin/com/mshdabiola/model · high confidence

Major build system overhaul: new convention plugins and CI tasks

The build logic has been significantly restructured with the introduction of new convention plugins for code coverage (Kover), static analysis (Detekt, Spotless, Ktlint), and CI/CD automation tasks. The \CiTaskPlugin\ now registers several Gradle tasks including \removeFirebaseReferences\, \renameProjectArtifacts\, \updateBuildVersions\, \setVersionTag\, and \releaseChangeLog\ to automate versioning and project refactoring. Additionally, the \AndroidApplicationConventionPlugin\ has been updated to support Kotlin Multiplatform with WasmJs targets, and the \AndroidLibraryConventionPlugin\ now includes Power Assert and Ktor dependencies. The \AndroidApplicationFirebaseConventionPlugin\ has been simplified to conditionally configure Crashlytics based on product flavors.

build-logic/convention/src/main/kotlin · high confidence

New Gradle tasks for build, versioning, and project refactoring

The build system introduces several new Gradle tasks to automate and simplify common development workflows. \DowngradeBuildToolsTask\ allows developers to downgrade Gradle and Android Gradle Plugin (AGP) versions via \libs.versions.toml\ and the Gradle wrapper. \PrependUnreleasedToChangelogTask\ and \ReleaseChangeLogTask\ automate the management of \CHANGELOG.md\ by prepending unreleased sections and formatting release headers. \SetVersionTagTask\ and \UpdateBuildVersionsTask\ (including a pre-release variant) update version strings in \BuildConfig.kt\, \ci.conveyor.conf\, and \libs.versions.toml\. \RenameProjectArtifactsTask\ automates renaming package names, app names, and file prefixes across the project. Additionally, \RemoveFirebaseReferencesTask\ strips Firebase-related code and dependencies from the build files. The \GradleManagedDevices\ and \Jacoco\ configuration files have been removed.

build-logic/convention/src/main/kotlin/com · high confidence

New UI components and localization for the release update dialog

The core/ui module now includes a new \ReleaseUpdateDialog\ component, complete with localized strings for German, Spanish, Finnish, French, Italian, Polish, Portuguese, Russian, Turkish, Vietnamese, and the default English. The dialog supports vertical scrolling for long update bodies and includes test tags for UI testing. Additionally, the \NoteCard\ component has been updated to support shared transitions and includes test tags. A new \KmtSnackBar\ component provides styled snackbars for different message types (default, error, success, warning). The \Sematic\ utility for accessibility and test tagging has been implemented across Android, JVM, and WasmJS platforms.

core/ui · high confidence

New network layer for fetching GitHub release information

The core/network module now includes a complete network implementation to fetch and parse GitHub release data. This introduces a new \NetworkDataSource\ interface and \RealNetworkDataSource\ implementation that retrieves the latest release from the \mshdabiola/kmtemplate\ repository, handling HTTP errors and empty responses. The change also adds platform-specific HTTP client configurations for Android, JVM, and WasmJS targets, along with Koin dependency injection wiring and corresponding unit tests using mock HTTP engines.

core/network · high confidence

Project documentation and configuration files added

The repository now includes comprehensive documentation and configuration files to guide users and contributors. A new \CHANGELOG.md\ tracks all notable changes, adhering to the Keep a Changelog format. A \README.md\ provides an overview of the project's architecture, tech stack, and build instructions. Additionally, \CODE of\_conDUCT.md\, \CONTRIBUTING.md\, and \SECURITY.md\ files have been added to establish community guidelines, contribution processes, and security reporting procedures. Configuration files for code coverage (\codecov.yml\), Compose compiler stability (\compose\_compiler\_config.conf\), and desktop packaging (\conveyor.conf\) are also included.

(repo-wide) · high confidence

Settings screen localized and Android-specific navigation implemented

The Settings feature now includes full localization for German, Spanish, Finnish, French, Italian, and Polish, covering UI strings for the update screen, bug reporting, and FAQ sections. Additionally, an Android-specific implementation for the window repository has been added to handle URL and email intents, enabling the 'Report Bug' and 'Check for Updates' features to function on Android devices.

feature/setting · high confidence

WasmJs platform support for note data layer

The application now supports running on the WasmJs platform, enabling note management features on that target. This is achieved by adding WasmJs-specific implementations for the data layer: a Koin module that wires the \RealModelRepository\ to the \NoteRepository\ interface, a repository class that bridges database entities to domain models, and extension functions for converting between \Note\ and \NoteEntity\. These changes allow the app to persist and retrieve notes via the database on WasmJs, matching the functionality available on other platforms.

core/data/src/wasmJsMain · high confidence

Removals

Removal of desktop-specific application entry point and platform implementations

The desktop-specific application entry point (MainApp.kt) and its associated argument model (AppArgs.kt) have been removed from the codebase. Additionally, desktop-specific implementations for the database module, design system theme configuration, and UI navigation previews have been deleted. This change eliminates the ability to run the application on desktop platforms, as the desktop entry point and related platform-specific modules are no longer present.

(repo-wide) · high confidence

The database module has removed all files related to image storage and management. Specifically, the ImageDao interface, the ImageEntity data class, the associated Koin dependency injection module, and the database name constant have been deleted. This eliminates the ability to persist or query image data via the Room database.

modules/database/src/commonMain · high confidence

Removal of legacy design system components and icons

The \Button\, \LoadingWheel\, \TextField\, \TopAppBar\, \NavigationIcon\, and \SkIcons\ components have been removed from the design system. This change eliminates the previous \Sk\-prefixed implementations and associated icon sets, likely as part of a broader refactoring or migration to updated Material 3 components and a new naming convention.

modules/designsystem/src/commonMain/kotlin/com/mshdabiola/designsystem/component · high confidence

Removed Main feature implementation and associated tests

The Main feature's core implementation has been removed from the application. This includes the MainScreen composable, MainViewModel, MainModule, MainNavigation, and the associated Android and Desktop preview stubs. Additionally, the related unit tests (MainViewNoteTest) and Android UI tests (MainScreenTest) for this feature have been deleted, along with the feature's string resources and Android manifest.

features/main/src · high confidence

Removed deprecated data layer components and interfaces

The data module has been refactored by removing several obsolete classes and interfaces, including ModeRemoteMediator, ModelPagingSource, and the IModelRepository, INetworkRepository, and ISettingRepository interfaces. Additionally, the DataModule dependency injection configuration, along with fake repositories (FakeNoteRepository, FakeUserDataRepository) and model extension functions, have been deleted to simplify the data layer architecture.

modules/data/src/commonMain · high confidence

Removed legacy Detail feature implementation

The legacy Detail feature has been removed from the codebase. This includes the deletion of the \DetailScreen\ and \DetailViewModel\ components, the associated Koin dependency injection module (\DetailModule\), and the navigation route configuration (\DetailNavigation\). This change eliminates the previous implementation of the note editing and display functionality in favor of a newer architecture.

features/detail/src/commonMain · high confidence

Removed the Settings feature and its associated components

The Settings feature has been removed from the application. This includes the deletion of the SettingScreen composable, the SettingViewModel, the SettingState data class, and the associated navigation route. Additionally, related resources such as string resources, drawables, and test files for the Setting feature have been deleted.

features/setting/src · high confidence

Architecture

Restructures project into core and feature modules

The project's build configuration has been reorganized to use a 'core' and 'feature' directory structure. The previous flat 'modules' directory (containing app, data, database, datastore, designsystem, domain, model, and mvvn) has been removed and replaced with new build scripts in core/{app,data,database,datastore,designsystem,model,network,testing,ui} and feature/{main,detail,setting} modules. This change simplifies the project's architecture by grouping shared libraries under 'core' and UI/feature logic under 'feature'.

(dependencies) · high confidence

Behavioural changes

Add web support for Wasm target with favicons and locale override

The application now includes a dedicated HTML entry point and CSS for the Wasm-based web build. This adds a full set of favicons (SVG, PNG, ICO) for mobile and desktop browsers, and includes a script that overrides the browser's language detection to support dynamic language switching via a custom locale variable.

app/src/wasmJsMain/resources · high confidence

Added dynamic language switching and network-aware update logic

Users can now switch the app's display language dynamically via the new LocalAppLocale mechanism, and the MainAppViewModel now respects user settings (such as showUpdateDialog and updateFromPreRelease) when fetching release information from the network.

app/src/commonMain/kotlin/com/mshdabiola/kmtemplate · medium confidence

Android-specific implementation for dynamic language switching and crash reporting

The app now supports dynamic language switching on Android, allowing users to change the app's language at runtime via the new LocalAppLocale implementation. Additionally, crash reporting via ACRA is conditionally initialized for the 'fossReliant' flavor, and a new BaseActivity class centralizes UI state and edge-to-edge theming logic for Android activities.

app/src/androidMain/kotlin · medium confidence

App renamed to Kmtemplate with updated package structure and configuration

The application's package name has been changed from 'com.mshdabiola.skeletonapp' to 'com.mshdabiola.kmtemplate', and the app label has been updated to 'Kmtemplate' in the release build metadata. The Google Services configuration has been updated to reflect the new project ID 'kmtemplate-71cf8' and associated client IDs, while the debug build metadata now reflects the new package name and version 1.1.3. Additionally, ProGuard rules have been updated to suppress warnings for Firebase Performance and Java annotation processing, and the project directory has been renamed from 'composeApp' to 'app'.

app · high confidence

Database module refactored and expanded with new data access methods

The database module has been reorganized into a 'core' directory structure, moving files from 'modules/database' to 'core/database'. The database class was renamed from 'SkeletonDatabase' to 'KmtDatabase', and the 'ImageEntity' was removed from the database schema. Additionally, the 'NoteDao' interface was updated to include new 'insert' and 'update' methods, and the 'insertAll' method's parameter was renamed from 'users' to 'notes'.

core/database/src/nonJsMain · high confidence

Introduce centralized dependency injection for the main application view model

The application's dependency injection layer now explicitly registers the MainAppViewModel via Koin, wiring its dependencies (userDataRepository, networkRepository, and a logger) and including the app's core modules (data, detail, main, and setting). This change consolidates the DI configuration for the main app component.

app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/di · high confidence

Migrate from Spotless to ktlint plugin

The Gradle build system no longer uses the Spotless plugin for code formatting. The \gradle/init.gradle.kts\ file, which previously applied Spotless to Kotlin and KTS files, has been removed. This change likely affects how code style enforcement is handled in the project, potentially requiring developers to use a different tool or configuration for linting and formatting.

gradle · medium confidence

Migrate navigation to Navigation 3

The app's navigation layer has been refactored to use the new Navigation 3 APIs. This update replaces the previous NavHost implementation with NavDisplay and introduces entry decorators for managing state and view models. As a result, back navigation now explicitly cancels notification jobs and dismisses indefinite snackbars, ensuring a cleaner user experience when navigating away from active states.

app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/navigation · medium confidence

Migrate to Navigation 3 and implement dynamic language switching

The app's navigation system has been upgraded to Navigation 3, introducing a new state management model for handling routes and deep links. This change enables dynamic language switching via the new \LocalAppLocale\ composition local, allowing the UI to update immediately when the user changes their preferred language. Additionally, the \KmtApp\ composable now manages release update dialogs and integrates with the new \KmtAppState\ to handle navigation and snackbar notifications more robustly.

app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/ui · high confidence

Moved CustomLogWriter to core:model module

The CustomLogWriter implementation, which handles writing log messages and exceptions to text files in the temporary directory, has been moved from its previous location to the core:model module. This change improves code organization by centralizing logging infrastructure within the core model layer.

core/model/src/jvmMain · high confidence

Platform-specific database initialization for JVM and Android

The database module now provides distinct initialization logic for each platform. On Android, the database is created using the application context and the Android SQLite driver. On the JVM, the database is stored in the system's temporary directory using the bundled SQLite driver. This change ensures that the database builder correctly adapts to platform-specific requirements for storage paths and drivers.

core/database/src/jvmMain · high confidence

Refactor to introduce BaseActivity and shorten application name

The application's main activity now extends a new shared BaseActivity class, reducing code duplication across the app. The package name has been shortened from com.mshdabiola.kmtemplate to com.mshdabiola.kmtemplate (note: the diff shows the package declaration remains com.mshdabiola.kmtemplate, but the commit message indicates a shortening; however, the diff only shows the new file with the existing package name. The key change is the introduction of BaseActivity). This refactoring improves maintainability by centralizing common activity logic.

app/src/androidFossReliant · medium confidence

Refactored Android app structure and reduced code duplication

The Android application code has been reorganized: the package name was updated from 'com.mshdabiola.skeletonapp' to 'com.mshdabiola.kmtemplate', and files were moved from 'composeApp/src/androidMain' to 'app/src/androidGooglePlay'. Additionally, a new 'BaseActivity' was introduced to reduce code duplication, with 'MainActivity' now extending it instead of 'ComponentActivity'. Several logging statements (Timber) were commented out, and code formatting was standardized using Spotless.

app/src/androidGooglePlay/kotlin · medium confidence

Removal of Android and Desktop preview stubs and app shell

The Android and Desktop platform-specific preview stubs (e.g., \DetailScreenPreview\, \MainScreenPreview\) and the \AndroidManifest.xml\ have been removed. Additionally, the core application shell has been deleted, including the \MainAppViewModel\, the Koin dependency injection module (\ApplicationModule\), and the primary navigation components (\SkeletonApp\, \SkAppState\, \SkeletonAppNavHost\). This removes the main entry point and the UI for the main, detail, and setting screens, effectively stripping the app of its primary navigation and state management logic.

modules/app, modules/mvvn, shared · high confidence

Removal of English 'What's New' file

The English 'What's New' file (whatsnew-en-US) has been removed from the distribution. This change eliminates the English-language release notes for the product, meaning users will no longer see this specific file's content as part of the distribution.

distribution · high confidence

Removal of core application components and navigation structure

The diff shows the deletion of several key files in the common module: the main application UI (\SkApp.kt\), the navigation host (\SkNavHost.kt\), the application state management (\SkAppState.kt\), the main view model (\MainAppViewModel.kt\), the dependency injection module (\ApplicationModule.kt\), and a drawable resource (\compose-multiplatform.xml\). This effectively strips out the primary UI layer, navigation routing, and state management logic from the shared codebase.

composeApp/src/commonMain · high confidence

Removal of design system preview and Android-specific theme utilities

The design system module has had its Android-specific theme support and preview files removed. Specifically, the AndroidManifest.xml, the theme configuration file (Theme.android.kt), and all preview-only Kotlin files (BackgroundPreview, ButtonPreview, DynamicAsyncImage, LoadingWheelPreview, TextFieldPreview, TopbarPreview) have been deleted. Additionally, the placeholder drawable and the strings.xml resource file have been removed from the main source set.

modules/designsystem/src/main · high confidence

Removal of legacy UI components and state management

The legacy UI components and state management structures have been removed from the common UI module. Specifically, the \Navigation.kt\ file containing the old drawer and rail navigation implementations, along with \MainState.kt\ for state management, have been deleted. Additionally, unused or older components such as \AnalyticsExtensions.kt\, \Notes.kt\ (containing the \NoteUi\ list item), \ProfileCard.kt\, and \ScreenSize.kt\ have been removed, indicating a shift away from these specific UI patterns and state models.

modules/ui/src/commonMain/kotlin · high confidence

Removal of legacy network layer and unused models

The legacy network module has been cleaned up by removing the \NetworkDataSource\ implementation, its \INetworkDataSource\ interface, and all associated data models (such as \Continue\, \Imageinfo\, \Page\, \Query\, \Response\, and \Thumbnail\). Additionally, the Ktor-based HTTP client configuration (\HttpClient1.kt\), the Koin dependency injection module (\NetworkModule.kt\), and various test interfaces (e.g., \LoginInterface\, \MediaInterface\) have been deleted, significantly reducing the size and complexity of the network module.

modules/network · high confidence

Removal of placeholder and test scaffolding from domain module

The domain module has been cleaned of its default scaffolding: the placeholder AndroidManifest.xml, the example unit test (ExampleUnitTest.kt), and build-related configuration files (.gitignore, consumer-rules.pro, proguard-rules.pro) have all been removed. This removes the initial boilerplate structure, indicating the module is being prepared for actual implementation rather than serving as a template.

modules/domain · medium confidence

The StubAnalyticsHelper class, which previously logged analytics events to logcat for builds where no backend tracking was needed, has been removed. Along with it, the associated Koin dependency injection module (AnalyticModule) and the AndroidManifest.xml configuration file have been deleted from the analytics module, simplifying the codebase by removing the stub implementation.

modules/analytics · medium confidence

Removal of unused Android-specific UI components and preview utilities

The UI module has been cleaned up by removing several unused or platform-specific files. Specifically, Android-only preview functions (NavigationPreview, ProfileCardPreview) and the TimeZoneBroadcastReceiver have been deleted, along with helper extensions for tracking jank and device-specific preview annotations. This reduces the codebase size and removes dead code that was not contributing to the core UI logic.

modules/ui/src/main/kotlin · medium confidence

Removed Android-specific application and JankStats modules

The Android-specific application class (SkeletonApplication) and the JankStats dependency injection module have been removed from the Android main source set. This eliminates the automatic initialization of Koin with Android context and the tracking of janky frames via Timber and Logcat, indicating a shift away from Android-specific lifecycle management and performance monitoring in this module.

composeApp/src/androidMain/kotlin · high confidence

Removed Android-specific database initialization code

The Android-specific implementation for database initialization has been removed. This includes the deletion of the AndroidManifest.xml file and the Platform.android.kt file, which previously handled the creation of the Room database builder using Android Context. This change suggests a move towards a more platform-agnostic or shared database initialization strategy.

modules/database/src/androidMain · high confidence

Removed WasmJs theme implementation

The WasmJs-specific implementation for the design system's theme, including the \supportsDynamicTheming\ and \getDynamicColor\ functions, has been removed from the codebase.

modules/designsystem/src/wasmJsMain · high confidence

Removed benchmarking code for bookmarks, For You, and interests screens

The benchmarking implementation files for the bookmarks, For You, and interests screens have been deleted. This removes the macrobenchmark tests and associated action helpers that previously navigated to and interacted with these specific app sections, meaning these areas are no longer covered by these specific performance tests.

benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/bookmarks, benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/foryou, benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/interests · high confidence

Removed deprecated DataStore implementation and associated test files

The DataStore module's implementation of user settings persistence has been removed. This includes the deletion of the \MultiplatformSettings\ interface and its \MultiplatformSettingsImpl\ class, which previously handled theme, color, and onboarding preferences via AndroidX DataStore. The change also removes the Koin dependency injection modules (\PlatformModule\, \SettintModule\) that wired the DataStore, along with the \UserDataSer\ serialization model and related unit tests. This eliminates the legacy data persistence layer in favor of a newer approach.

modules/datastore · high confidence

Removed deprecated theme components from the design system

The Background, Gradient, Theme, ThemeColor, and Tint theme files have been removed from the common design system module. This eliminates the previous implementation of background, gradient, and tint theme providers, along with the associated composition locals and color scheme logic, indicating a significant restructuring of how the application's visual theme is applied.

modules/designsystem/src/commonMain/kotlin/com/mshdabiola/designsystem/theme · high confidence

Removed empty Wasm JS UI preview stubs

The empty Wasm JS-specific preview functions for Navigation and ProfileCard have been removed. These stubs previously provided empty @Composable functions for the Wasm JS target, and their removal indicates a cleanup of unused or placeholder UI code in the Wasm JS module.

modules/ui/src/wasmJsMain · high confidence

Removed obsolete model classes and platform-specific path definitions

The model module has been cleaned up by removing several unused or obsolete classes: Contrast, DarkThemeConfig, DummySetting, GeneralPath (including its platform-specific implementations for desktop, Android, and Wasm), Image, Note, and ThemeBrand. Additionally, the .gitignore file for the model module has been removed. These changes streamline the model layer by eliminating dead code and platform-specific logic that is no longer needed.

modules/model · high confidence

Reorganized core modules into a unified directory structure

The analytics and data modules have been moved from the flat \modules/\ directory into a structured \core/\ hierarchy (e.g., \core/analytics\, \core/data\). This change consolidates shared core functionality, such as the Koin dependency injection modules (\AnalyticModule\, \DataModule\) and utility classes (\NetworkMonitor\, \ConnectivityManagerNetworkMonitor\), into a single, organized location. This reorganization simplifies the project's module structure, making it easier to locate and manage shared code across Android, Desktop, and WasmJs platforms.

core/analytics, core/data/src/main, core/data/src/nonJsMain · high confidence

Reworked main screen benchmarks to measure the main feed and note interactions

The benchmark suite for the main screen has been restructured. The previous benchmarks for the 'For You' feed and 'Interests' screens have been replaced with new benchmarks targeting the main note list and detail screen interactions. Specifically, \ScrollForYouFeedBenchmark\ and \ScrollTopicListBenchmark\ have been renamed and refactored into \ScrollMainNoteBenchmark\ and \MainScreenRecompositionBenchmark\ respectively, updating the measured actions to scroll the main note list and navigate to the detail screen. Additionally, \ScrollNotePowerMetricsBenchmark\ now measures power metrics for the main note list instead of the previous screens. These changes reflect a shift in focus from the 'For You' and 'Interests' screens to the main feed and note interactions.

benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/main · high confidence

The default copyright headers used by Spotless have been updated from a generic placeholder to include the full Apache License 2.0 text and attribution for 2024 mshdabiola (lawal abiola) across Kotlin and XML template files. This changes the license header that will be applied to new or reformatted files, ensuring compliance with the Apache 2.0 license terms.

spotless · high confidence

Update baseline profile generation and startup benchmark wait conditions

The baseline profile generation test was refactored to use specific navigation helper functions (goToDetailScreen, addNote, goBack) instead of raw UI automation, and the startup benchmark was updated to wait for the main content using the main screen's wait condition instead of the 'for you' screen's wait condition.

benchmarks/src/main/kotlin/com/mshdabiola/benchmarks/baselineprofile · medium confidence

Updated Gradle wrapper to version 9.2.1

The Gradle wrapper configuration has been updated to use Gradle version 9.2.1, replacing the previous version 8.6. This ensures the project uses the specified Gradle distribution for builds.

build-logic · high confidence

Updated benchmark package name and removed unused utility function

The benchmark module's package name has been updated to \com.mshdabiola.kmtemplate\ to reflect the application's new identity, and the \waitAndFindObject\ utility function has been removed as it is no longer used. Additionally, license headers and a commented-out \pressHome()\ call in the start activity action were modified.

benchmarks/src/main/kotlin/com/mshdabiola/benchmarks · high confidence

WasmJS app entry point and locale management

The WasmJS entry point (Main.kt) now initializes the Koin dependency injection container, sets up Kermit logging, and renders the Compose UI within the browser viewport. It manages a 2-second splash screen before revealing the main application. Additionally, a new LocalizationWrapper.wasmJs.kt file implements LocalAppLocale, allowing the app to dynamically switch languages by updating the browser's locale context.

app/src/wasmJsMain/kotlin · medium confidence

Test coverage

Add screenshot test infrastructure; Add tests for NoteDao; Added MainDispatcherRule for JVM tests; Added comprehensive UI and ViewModel tests for the app state and navigation; Added fake repository and test utilities for unit testing; Added test doubles for network, database, and user preferences; Added tests for MagicNumber and StringLiteral rules; Added unit tests for data layer repositories; Removed Roborazzi-based screenshot tests; Removed empty UI test file; Removed obsolete Android UI test file; Removed obsolete unit and UI tests; Removed obsolete unit test file; Removed testing module utilities and test infrastructure; Removed unused UiAutomatorHelpers.kt from benchmarks.

Dependencies

Upgraded Gradle wrapper to version 9.2.1

The Gradle wrapper has been updated to version 9.2.1, changing the distribution URL from 8.6 to 9.2.1. Additionally, network timeout and distribution validation settings have been added to the wrapper configuration.

gradle/wrapper · 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 → 58 (+3.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 94 → 96 (+2.2)
  • Architecture 97 → 94 (-3.5)
  • Maturity 75 → 81 (+6.1)
  • Readiness 63 → 68 (+5.5)
  • Security 34 → 38 (+3.5)
  • Accessibility 74 → 74 (+0.0)

Resolved (99)

  • Boundary-crossing change coupling: MainActivity.kt ↔ KmtApp.kt (app/src/androidFossReliant/kotlin/com/mshdabiola/kmtemplate/MainActivity.kt)
  • Change coupling: AndroidApplicationConventionPlugin.kt ↔ AndroidLibraryConventionPlugin.kt (build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt)
  • Change coupling: AndroidFeatureConventionPlugin.kt ↔ AndroidLibraryConventionPlugin.kt (build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt)
  • Change coupling: AppearanceScreen.kt ↔ FaqScreen.kt (feature/setting/src/commonMain/kotlin/com/mshdabiola/setting/detailscreen/AppearanceScreen.kt)
  • Change coupling: KmtAppState.kt ↔ TopLevelRoute.kt (app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/ui/KmtAppState.kt)
  • Change coupling: ReportBugScreen.kt ↔ UpdateScreen.kt (feature/setting/src/commonMain/kotlin/com/mshdabiola/setting/detailscreen/ReportBugScreen.kt)
  • Coverage not included — suite not readable by the collector
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (build-logic/convention/src/main/kotlin/CiTaskPlugin.kt)
  • Duplicated block (13 lines × 2) (app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/ui/KmtScaffold.kt)
  • Duplicated block (13 lines × 2) (build-logic/convention/src/main/kotlin/com/mshdabiola/app/UpdateBuildVersionsPreReleaseTask.kt)
  • Duplicated block (13 lines × 2) (build-logic/convention/src/main/kotlin/com/mshdabiola/app/UpdateBuildVersionsPreReleaseTask.kt)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • …and 79 more

New (150)

  • Change coupling: DetailScreen.kt ↔ DetailViewModel.kt (feature/detail/src/commonMain/kotlin/com/mshdabiola/detail/DetailScreen.kt)
  • Change coupling: MainScreen.kt ↔ MainNavigation.kt (feature/main/src/commonMain/kotlin/com/mshdabiola/main/MainScreen.kt)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no project overview (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (16 lines × 2) (app/src/commonMain/kotlin/com/mshdabiola/kmtemplate/ui/KmtScaffold.kt)
  • Duplicated block (8 lines × 2) (build-logic/convention/src/main/kotlin/CiTaskPlugin.kt)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • …and 130 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

mshdabiola/Kmtemplate 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 456adcef9fcbcf6cbbbbb6eb7cbda8fc656495d0 — 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.