by dpconde
Claude Code skill for building modern Android apps following best practices.
# Add to your Claude Code skills
git clone https://github.com/dpconde/claude-android-skillBuild Android applications following Google's official architecture guidance, as demonstrated in the NowInAndroid reference app.
| Task | Reference File | |------|----------------| | Project structure & modules | modularization.md | | Architecture layers (UI, Domain, Data) | architecture.md | | Jetpack Compose patterns | compose-patterns.md | | Gradle & build configuration | gradle-setup.md | | Testing approach | testing.md |
Creating a new project?
→ Read modularization.md for project structure
→ Use templates in assets/templates/
Adding a new feature?
→ Create feature module with api and impl submodules
→ Follow patterns in architecture.md
Building UI screens? → Read compose-patterns.md → Create Screen + ViewModel + UiState
Setting up data layer? → Read data layer section in architecture.md → Create Repository + DataSource + DAO
A production-ready skill that enables Claude Code to build Android applications following Google's official architecture guidance and best practices from the NowInAndroid reference app.
This skill provides Claude with comprehensive knowledge of modern Android development patterns, including:
Clone this repository into your Claude Code skills directory:
git clone https://github.com/dpconde/claude-android-skill.git
Claude Code will automatically detect and load the skill when you work on Android projects.
The skill automatically activates when you request Android-related tasks. Simply ask Claude to:
Claude will follow the patterns and best practices defined in this skill.
No comments yet. Be the first to share your thoughts!
┌─────────────────────────────────────────┐
│ UI Layer │
│ (Compose Screens + ViewModels) │
├─────────────────────────────────────────┤
│ Domain Layer │
│ (Use Cases - optional, for reuse) │
├─────────────────────────────────────────┤
│ Data Layer │
│ (Repositories + DataSources) │
└─────────────────────────────────────────┘
app/ # App module - navigation, scaffolding
feature/
├── featurename/
│ ├── api/ # Navigation keys (public)
│ └── impl/ # Screen, ViewModel, DI (internal)
core/
├── data/ # Repositories
├── database/ # Room DAOs, entities
├── network/ # Retrofit, API models
├── model/ # Domain models (pure Kotlin)
├── common/ # Shared utilities
├── ui/ # Reusable Compose components
├── designsystem/ # Theme, icons, base components
├── datastore/ # Preferences storage
└── testing/ # Test utilities
feature:myfeature:api module with navigation keyfeature:myfeature:impl module with:
MyFeatureScreen.kt - Composable UIMyFeatureViewModel.kt - State holderMyFeatureUiState.kt - Sealed interface for statesMyFeatureNavigation.kt - Navigation setupMyFeatureModule.kt - Hilt DI module@HiltViewModel
class MyFeatureViewModel @Inject constructor(
private val myRepository: MyRepository,
) : ViewModel() {
val uiState: StateFlow<MyFeatureUiState> = myRepository
.getData()
.map { data -> MyFeatureUiState.Success(data) }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = MyFeatureUiState.Loading,
)
fun onAction(action: MyFeatureAction) {
when (action) {
is MyFeatureAction.ItemClicked -> handleItemClick(action.id)
}
}
}
sealed interface MyFeatureUiState {
data object Loading : MyFeatureUiState
data class Success(val items: List<Item>) : MyFeatureUiState
data class Error(val message: String) : MyFeatureUiState
}
@Composable
internal fun MyFeatureRoute(
onNavigateToDetail: (String) -> Unit,
viewModel: MyFeatureViewModel = hiltViewModel(),
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
MyFeatureScreen(
uiState = uiState,
onAction = viewModel::onAction,
onNavigateToDetail = onNavigateToDetail,
)
}
@Composable
internal fun MyFeatureScreen(
uiState: MyFeatureUiState,
onAction: (MyFeatureAction) -> Unit,
onNavigateToDetail: (String) -> Unit,
) {
when (uiState) {
is MyFeatureUiState.Loading -> LoadingIndicator()
is MyFeatureUiState.Success -> ContentList(uiState.items, onAction)
is MyFeatureUiState.Error -> ErrorMessage(uiState.message)
}
}
interface MyRepository {
fun getData(): Flow<List<MyModel>>
suspend fun updateItem(id: String, data: MyModel)
}
internal class OfflineFirstMyRepository @Inject constructor(
private val localDataSource: MyDao,
private val networkDataSource: MyNetworkApi,
) : MyRepository {
override fun getData(): Flow<List<MyModel>> =
localDataSource.getAll().map { entities ->
entities.map { it.toModel() }
}
override suspend fun updateItem(id: String, data: MyModel) {
localDataSource.upsert(data.toEntity())
}
}
// Gradle version catalog (libs.versions.toml)
[versions]
kotlin = "1.9.x"
compose-bom = "2024.x.x"
hilt = "2.48"
room = "2.6.x"
coroutines = "1.7.x"
[libraries]
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
Use convention plugins in build-logic/ for consistent configuration:
AndroidApplicationConventionPlugin - App modulesAndroidLibraryConventionPlugin - Library modulesAndroidFeatureConventionPlugin - Feature modulesAndroidComposeConventionPlugin - Compose setupAndroidHiltConventionPlugin - Hilt setupSee gradle-setup.md for complete build configuration.
claude-android-skill/
├── SKILL.md # Main skill definition and quick reference
├── references/ # Detailed documentation
│ ├── architecture.md # UI, Domain, Data layers patterns
│ ├── compose-patterns.md # Jetpack Compose best practices
│ ├── gradle-setup.md # Build configuration & convention plugins
│ ├── modularization.md # Multi-module project structure
│ └── testing.md # Testing strategies and patterns
├── assets/
│ └── templates/ # Project templates
│ ├── libs.versions.toml.template
│ └── settings.gradle.kts.template
└── scripts/
└── generate_feature.py # Feature module generator script
This skill teaches Claude to follow these key Android development principles:
| Topic | File | Description | |-------|------|-------------| | Architecture | architecture.md | MVVM pattern, layers, repositories, use cases | | Compose UI | compose-patterns.md | Screens, state hoisting, side effects, theming | | Build Setup | ...