android-data-layer
Data layer patterns for Android/KMP - data sources, repositories, DTOs, mappers, Room entities, Ktor HttpClient, safe call helpers, token storage, and…
Skill by kvithayathil
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/kvithayathil-android-data-layer
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: data, writing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/android-data-layer
What's inside
- Skill name
android-data-layer- Description
- Data layer patterns for Android/KMP - data sources, repositories, DTOs, mappers, Room entities, Ktor HttpClient, safe call helpers, token storage, and offline-first. Use this skill whenever writing or reviewing a data source or repository, creating DTOs or Room entities, writing mappers, setting up the Ktor HttpClient, handling network errors, or implementing token refresh. Trigger on phrases like "create a repository", "create a data source", "add a DAO", "Ktor client", "write a mapper", "DTO", "Room entity", "network call", "token storage", or "offline-first".
- License
- AGPL-3.0
- Instructions
- 171 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Android / KMP Data Layer
## Error Handling
This skill uses `Result<T, E>`, `DataError`, and the extension helpers defined in the **android-error-handling** skill. Refer to that skill for the full `Result` wrapper, `DataError` sealed interface, and `map`/`onSuccess`/`onFailure`/`asEmptyResult` extensions.
---
## Data Source vs Repository
- **Data source** — accesses a single data source (local DB, remote API, file system). Most classes in the data layer are data sources.
- **Repository** — combines multiple data sources (e.g., a remote API + a local DB for offline-first). Only use the term "repository" when the class genuinely coordinates multiple sources.
```kotlin
// Single source → data source
interface NoteLocalDataSource {
suspend fun getNotes(): Result<List<Note>, DataError.Local>
suspend fun insertNote(note: Note): EmptyResult<DataError.Local>
}
interface NoteRemoteDataSource {
suspend fun fetchNotes(): Result<List<Note>, DataError.Network>
}
// Multiple sources → repository
interface NoteRepository {
suspend fun getNotes(): Result<List<Note>, DataError>
suspend fun sync(): EmptyResult<DataError>
}
```
## Domain Layer Contracts
- Pure Kotlin — no Android/framework imports.
- Contains: domain models, data source/repository **interfaces**, error types.
- **Every data source or repository used by a ViewModel must have an interface in `domain`** — enforces that `presentation` never depends on `data`, and enables testing.
---
## DTOs and Domain Models
- Always separate: DTOs (data layer) ↔ Domain Models (domain layer).
- Domain models never go directly into Room entities or Ktor request/response bodies.
- Mappers are simple extension functions living in the data layer alongside the DTO:
```kotlin
fun NoteDto.toNote(): Note = Note(id = id, title = title, ...)
fun Note.toNoteDto(): NoteDto = NoteDto(id = id, title = title, ...)
fun NoteEntity.toNote(): Note = ...
fun Note.toNoteEntity(): NoteEntity = ...
```
---
## Implementations
Name implementations for what makes them unique — never suffix with `Impl`.
### Data source (single source)
```kotlin
class RoomNoteDataSource(private val dao: NoteDao) : NoteLocalDataSource {
override suspend fun getNotes(): Result<List<Note>, DataError.Local> {
return try {
Result.Success(dao.getAllNotes().map { it.toNote() })
} catch (e: Exception) {
Result.Error(DataError.Local.UNKNOWN)
}
}
}
```
### Repository (multiple sources)
```kotlin
class OfflineFirstNoteRepository(
private val localDataSource: NoteLocalDataSource,
private val remoteDataSource: NoteRemoteDataSource
) : NoteRepository {
override suspend fun getNotes(): Result<List<Note>, DataError> {
return remoteDataSource.fetchNotes()
.onSuccess { notes -> localDataSource.insertAll(notes) }
.onFailure { localDataSource.getNotes() }
}
}
```
Use names like `RoomNoteDataSource`, `KtorNoteDataSource`, `OfflineFirstNoteRepository`. The name should tell you what the class wraps or how it behaves.
---
## Ktor — HttpClient Factory (`core:data`)
Configure the client once. Accept the engine externally so tests can swap in a mock engine:
```kotlin
object HttpClientFactory {
fun create(engine: HttpClientEngine): HttpClient = HttpClient(engine) {
install(ContentNegotiation) { json() }
install(Auth) {
bearer {
loadTokens { /* load from DataStore */ }
refreshTokens { /* call refresh endpoint, save new tokens */ }
}
}
install(Logging) { logger = Logger.DEFAULT; level = LogLevel.ALL }
defaultRequest { contentType(ContentType.Application.Json) }
}
}
```
Inject `HttpClient` via Koin. For KMP, use the platform default engine.
---
## Ktor — Safe Call Helpers (`core:data`)
Use `safeCall` / `responseToResult` helpers and typed extension functions (`HttpClient.get`, `HttpClient.post`, `HttpClient.delete`) to keep data source call sites clean and uniform. See the **android-error-handling** skill for the full implementation of these helpers.From kvithayathil/agent-resources, AGPL-3.0.
More from kvithayathil/agent-resources
- 0.544score
design-an-interface
mattpocock
Generate multiple radically different interface designs for a module using parallel sub-agents.
SkillAFreshness: AClaude Code +9 - 0.539score
grill-me
mattpocock
Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree.
SkillAFreshness: AClaude Code +9 - 0.479score
modern-git-patterns
kvithayathil
Use when working with git commands, planning git workflows, advising on git best practices, or needing version-aware git guidance.
SkillCFreshness: CClaude Code +9 - 0.414score
android-layouts
kvithayathil
Android layout best practices for XML/Views and Jetpack Compose.
SkillDFreshness: DClaude Code +9 - 0.414score
design-md
kvithayathil
Create, consume, and validate DESIGN.md files — the open format for describing visual identity to coding agents.
SkillDFreshness: DClaude Code +9 - 0.410score
provenance-tracking
kvithayathil
Ensures every remote-installed skill has a references/ folder citing its upstream source and can be checked for updates against that source.
SkillDFreshness: DClaude Code +9 - 0.409score
android-error-handling
kvithayathil
Generic Result wrapper, error types, and extension helpers for Android/KMP - Result<T, E>, DataError, EmptyResult, map, onSuccess, onFailure.
SkillDFreshness: DClaude Code +9 - 0.409score
android-module-structure
kvithayathil
Module layout, dependency rules, and Gradle convention plugins for Android and Kotlin Multiplatform (KMP) projects.
SkillDFreshness: DClaude Code +9 - 0.409score
android-navigation
kvithayathil
Type-safe Compose Navigation for Android/KMP - route objects, feature nav graphs, cross-feature callbacks, and wiring in :app.
SkillDFreshness: DClaude Code +9 - 0.409score
android-presentation-mvi
kvithayathil
MVI presentation layer for Android/KMP - State, Action, Event, ViewModel, Root/Screen composable split, UI models, UiText error mapping, and process death…
SkillDFreshness: DClaude Code +9 - 0.409score
android-di-koin
kvithayathil
Koin dependency injection setup for Android/KMP - module definitions per layer, ViewModel injection, assembling modules in :app, and koinViewModel() in…
SkillDFreshness: DClaude Code +9 - 0.409score
android-testing
kvithayathil
Testing patterns for Android/KMP - ViewModel unit tests with JUnit5, Turbine, AssertK, UnconfinedTestDispatcher, fake repositories, SavedStateHandle, and…
SkillDFreshness: DClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- Apr 14, 2026 (6 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- AGPL-3.0
- Repository
- github.com/kvithayathil/agent-resources
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from kvithayathil
- 0.479score
modern-git-patterns
kvithayathil
Use when working with git commands, planning git workflows, advising on git best practices, or needing version-aware git guidance.
SkillCFreshness: CClaude Code +9 - 0.414score
design-md
kvithayathil
Create, consume, and validate DESIGN.md files — the open format for describing visual identity to coding agents.
SkillDFreshness: DClaude Code +9 - 0.414score
android-layouts
kvithayathil
Android layout best practices for XML/Views and Jetpack Compose.
SkillDFreshness: DClaude Code +9 - 0.410score
provenance-tracking
kvithayathil
Ensures every remote-installed skill has a references/ folder citing its upstream source and can be checked for updates against that source.
SkillDFreshness: DClaude Code +9 - 0.409score
android-di-koin
kvithayathil
Koin dependency injection setup for Android/KMP - module definitions per layer, ViewModel injection, assembling modules in :app, and koinViewModel() in…
SkillDFreshness: DClaude Code +9 - 0.409score
android-error-handling
kvithayathil
Generic Result wrapper, error types, and extension helpers for Android/KMP - Result<T, E>, DataError, EmptyResult, map, onSuccess, onFailure.
SkillDFreshness: DClaude Code +9
Cite this page
android-data-layer skill. Agent Mart. https://agentmart.dev/skills/kvithayathil-android-data-layer (last updated 2026-10-24)