Closetalk.app
App Template | Android, Kotlin, Jetpack Compose, Jetpack Navigation, feature modules, MVI, Koin, Coil, Proto DataStore, GitHub Actions
Install / Use
/learn @mobiledevpro/Closetalk.appAbout this skill
Quality Score
0/100
Category
Development & EngineeringSupported Platforms
Universal
Tags
android-appandroid-chat-applicationandroid-chat-sample-githubapp-templatecoil-image-loadercoil-kotlincompose-navigationcompose-uijetpack-composejetpack-compose-examplejetpack-compose-navigationjetpack-navigationjetpackcomposekoin-androidkoin-kotlinkotlin-androidkotlin-coroutinesmvi-androidmvi-architecturemvi-clean-architecture
README
Android Chat App entirely built with Jetpack Compose (in development)
Try demo:
Apps built from this template:
- Habit Tracker - Coming...
- Sign PDF - PDF Reader - Sign PDF in a few seconds
- Screenshot Maker - NeonFrame - Make eye-catching screenshots you share on Twitter, Instagram, and others.
Tech. stack
- Kotlin
- Coroutines
- Jetpack Compose modern toolkit for building native UI
- Jetpack libs: Navigation, Compose, etc.
- Material 3
- Koin for dependency injection
- Coil for image loading
- MVI + modularization with a clean architecture
- GitHub Actions Complete Guide
Speed up Gradle build time
Article 1 - How to speed up Gradle build time
Doc - Optimize your buid speed
Article 2 - How I Cut My Gradle Build Time by 50%
Get Gradle build report
./gradlew --profile
Notes
Plugin to generate Compose Compiler metrics (root/build.gradle.kts)
Interpreting Compose Compiler Metrics
subprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" +
project.layout.buildDirectory.get().asFile.absolutePath + "/compose_metrics"
)
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
project.layout.buildDirectory.get().asFile.absolutePath + "/compose_metrics"
)
}
}
To debug Firebase Analytics events call it in the terminal
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
UI testing with Maestro:
- Install Maestro: run in terminal
curl -Ls "https://get.maestro.mobile.dev" | bash - Install the app on emulator (doesn't work with physical device)
- Run the flow: run in terminal
maestro test -c maestro/people-profile-flow.yaml - Sample config
Module Graph
%%{
init: {
'theme': 'base',
'themeVariables': {"primaryTextColor":"#fff","primaryColor":"#5a4f7c","primaryBorderColor":"#5a4f7c","lineColor":"#f5a623","tertiaryColor":"#40375c","fontSize":"12px"}
}
}%%
graph LR
subgraph :core
:core:navigation["navigation"]
:core:ui["ui"]
:core:di["di"]
:core:domain["domain"]
:core:coroutines["coroutines"]
:core:util["util"]
:core:analytics["analytics"]
:core:database["database"]
end
subgraph :feature
:feature:home["home"]
:feature:onboarding["onboarding"]
:feature:subscription["subscription"]
:feature:chat_list["chat_list"]
:feature:people["people"]
:feature:user_profile["user_profile"]
:feature:people_list["people_list"]
:feature:people_core["people_core"]
:feature:people_profile["people_profile"]
end
:core:navigation --> :core:ui
:core:navigation --> :core:di
:core:navigation --> :core:domain
:core:navigation --> :feature:home
:core:navigation --> :feature:onboarding
:core:navigation --> :feature:subscription
:core:navigation --> :feature:chat_list
:core:navigation --> :feature:people
:core:navigation --> :feature:user_profile
:feature:people_list --> :core:ui
:feature:people_list --> :core:di
:feature:people_list --> :core:domain
:feature:people_list --> :core:coroutines
:feature:people_list --> :core:util
:feature:people_list --> :core:analytics
:feature:people_list --> :feature:people_core
:feature:people_core --> :core:database
:feature:people_core --> :core:ui
:feature:people_core --> :core:di
:feature:people_core --> :core:domain
:feature:people_core --> :core:coroutines
:feature:people_core --> :core:util
:feature:people_core --> :core:analytics
:app --> :core:navigation
:feature:people --> :feature:people_list
:feature:people_profile --> :feature:people_core
classDef focus fill:#FA8140,stroke:#fff,stroke-width:2px,color:#fff;
class :core:navigation focus
class :feature:people_list focus
class :feature:people_core focus
How to create the module graph
-
Apply plugin https://github.com/iurysza/module-graph
-
Configure in the root
build.gradle.ktsfile:
moduleGraphConfig {
readmePath.set("${rootDir}/README.md")
heading = "## Module Graph"
orientation.set(Orientation.LEFT_TO_RIGHT) //optional
setStyleByModuleType.set(false)
focusedModulesRegex.set(".*(navigation|home).*")
theme.set(
Theme.BASE(
mapOf(
"primaryTextColor" to "#fff",
"primaryColor" to "#5a4f7c",
"primaryBorderColor" to "#5a4f7c",
"lineColor" to "#f5a623",
"tertiaryColor" to "#40375c",
"fontSize" to "12px",
),
focusColor = "#FA8140"
),
)
}
- Run the following command to generate the module graph and update the README file:
./gradlew createModuleGraph
Author:
<a href="https://github.com/dmitriy-chernysh" target="_blank"> <img src="https://s.gravatar.com/avatar/72c649d298a8f0f088fd0850e19b9147?s=400" width="70" align="left"> </a>Dmitri Chernysh
License:
Copyright 2025 Dmitri Chernysh
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License
