android-agent-skills
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 7 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
This project provides a collection of 27 predefined rules and instructions designed to help AI coding agents (like Claude Code or Cursor) avoid common Android development errors, specifically regarding Supabase authentication, Hilt, and UI consistency.
Security Assessment
Overall Risk: Low. The tool is essentially a set of prompt guidelines rather than executable software. A scan of 12 files found no dangerous patterns, hardcoded secrets, or dangerous permissions. It does not execute shell commands or make external network requests. The content focuses strictly on Kotlin code generation rules, meaning it does not access or expose sensitive user data.
Quality Assessment
The project is highly active, with its most recent push occurring today. It uses a permissive MIT license and includes a thorough, well-documented README that explains the developer's rationale. However, community visibility and trust are currently very low. With only 7 GitHub stars, the tool has not yet been widely peer-reviewed or battle-tested by a large user base.
Verdict
Safe to use. The rules pose no security threat, though developers should keep in mind that the instructions are highly subjective and come from a single, unvetted author.
27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.
android-agent-skills
I was getting 5× token bills every month building Android apps with AI agents.
Same errors. Same Supabase crashes. Same broken screens.
I fixed it by writing these 27 skills.
Now my bills dropped 5×. FitGenZ AI shipped in 18 days.
The honest story — Seekho AI broke my budget
I'm Piyush. I build Android apps solo using AI agents — Claude Code, Codex, Cursor, Antigravity.
My first serious Android project was Seekho AI — an app that helps Indians find government schemes, exam notifications, and jobs. The idea was solid. The execution was a nightmare.
Every AI session started the same way. I'd describe what I wanted. The agent would start building. And within 20 minutes, I was correcting the same mistakes I'd corrected the session before.
Here's exactly what was happening to my token budget:
The 5 problems that were killing my token budget
Problem 1: Every screen looked different from the last one
The agent had no memory of how I built screen 1 when it started screen 2. Different spacing on every card. fontSize = 18.sp here, fontSize = 20.sp there. Color(0xFF1A1A2E) in one file, Color(0xFF161622) in the next. Modifier.padding(12.dp) on this screen, Modifier.padding(16.dp) on that one.
By the time I had 8 screens, the app looked like it was designed by 8 different people. I'd spend the first 15-20 minutes of every new session re-explaining my color palette, my spacing, my card style. Every. Single. Session.
Token waste: easily 800-1200 tokens per session just re-establishing visual context.
Problem 2: Supabase auth broke in production, not in dev
This one cost me a week and probably ₹3,000 in tokens trying to debug it.
The agent kept writing this:
// What agents write without the supabase-android skill
val client = createSupabaseClient(url, anonKey) {
install(Auth) // ← persistSession defaults to true
}
val user = client.auth.currentUserOrNull() // ← returns null after hot restart
Everything looked fine in development. The moment Seekho AI users tried to call an Edge Function with their JWT, they got UnauthorizedRestException. Every time.
I described the error to the agent. It wrote a fix. The fix introduced a different bug. I described that. It fixed that. Three sessions of back-and-forth, hundreds of messages, just to discover one missing flag:
// The actual fix — one line
install(Auth) {
persistSession = false // ← without this, getUser() returns null
}
Token waste: 3 full debugging sessions that shouldn't have happened.
Problem 3: Hilt compile errors that the agent couldn't read
Dagger error messages are famously cryptic. The agent would write @Provides where @Binds was needed, put a @Singleton-scoped dependency inside a narrower scope, or forget @AndroidEntryPoint on an Activity. The Dagger compile error would come back as 40 lines of incomprehensible text.
The agent's response was to try a fix. Usually wrong. Try another fix. Still wrong. Third try, sometimes right. Sometimes it introduced a new error instead.
For Seekho AI, I had 6 Hilt modules. Getting them right took approximately 4 debugging cycles each.
Token waste: 200-400 tokens per Hilt error that should have been avoided with the right pattern upfront.
Problem 4: kapt instead of ksp — every single time
Without fail, every new project the agent would write:
// What agents write without the gradle skill
plugins {
kotlin("kapt") // ← 2× slower than ksp, deprecated
}
kapt(libs.hilt.compiler)
kapt(libs.room.compiler)
I'd catch it. Fix it. Next session, same thing. It wasn't learning because I wasn't teaching it systematically. So every new module = one kapt→ksp fix cycle.
Problem 5: collectAsState() instead of collectAsStateWithLifecycle()
This one doesn't just waste tokens — it wastes battery. The agent kept writing code that collected Flows even when the app was backgrounded. I'd explain the correct API. It'd write it right for that session. Next session: wrong again.
The token math
By month 3 of building Sarkari Khozo, I did a rough calculation:
| Repeating waste per session | Avg tokens | Sessions/month |
|---|---|---|
| Re-explaining color/spacing system | ~1,000 | 20 |
| Debugging Supabase auth from scratch | ~2,500 | 3 |
| Fixing Hilt errors that should've been right | ~400 | 8 |
| kapt→ksp correction cycle | ~200 | 10 |
| collectAsState → lifecycle fix | ~150 | 15 |
| Wrong UiState pattern (no loading/error/empty states) | ~800 | 12 |
That's roughly 50,000+ tokens/month in pure waste. Not building new features. Just correcting the same mistakes over and over because the agent had no memory of the right patterns.
My billing was 5× what it should have been. I hit token limit alerts constantly. I started dreading opening the project.
The fix — FitGenZ AI shipped in 18 days, 5× lower bills
After Sarkari Khozo taught me what was broken, I spent 2 weeks writing down every pattern the agent needed to know — as skills it could read automatically.
Then I started FitGenZ AI — a Gen-Z fitness app with AI food tracking, calorie goals, streak tracking, and an AI coach. Way more complex than Sarkari Khozo.
It shipped in 18 days. My billing dropped by 5×.
Not because I got faster. Because the agent stopped making the same mistakes.
The first session, instead of re-explaining my design system, I just built. The agent read design-system and applied the right spacing, the right typography, the right surface colors automatically.
When I integrated Supabase auth, it worked first try. No UnauthorizedRestException. No 3-session debugging spiral.
When I set up Hilt, the modules were right. @Binds where it should be @Binds. ksp in every build file.
When I needed StateFlow collected in the UI, it wrote collectAsStateWithLifecycle(). Without being asked.
Every screen looked like it belonged in the same app. Because the design tokens were consistent across every composable.
Install in 30 seconds
🤖 If you're an AI agent — self-install
Paste the right instruction into your agent and it will install everything automatically:
Claude Code:
Fetch and follow: https://raw.githubusercontent.com/piyushverma0/android-agent-skills/main/.claude/INSTALL.md
OpenAI Codex:
Fetch and follow: https://raw.githubusercontent.com/piyushverma0/android-agent-skills/main/.codex/INSTALL.md
Cursor:
Fetch and follow: https://raw.githubusercontent.com/piyushverma0/android-agent-skills/main/.cursor/INSTALL.md
Antigravity:
Fetch and follow: https://raw.githubusercontent.com/piyushverma0/android-agent-skills/main/.antigravity/INSTALL.md
Any other agent:
Fetch https://raw.githubusercontent.com/piyushverma0/android-agent-skills/main/AGENTS.md
and follow the installation instructions for your platform.
👨💻 Developer — CLI
# Global install — all 27 skills, all your Android projects
npx android-agent-skills install --global
# Just this project
npx android-agent-skills install
# Specific skills only
npx android-agent-skills install --skills design-system,supabase-android,hilt-di
# For a specific agent
npx android-agent-skills install --agent claude-code
npx android-agent-skills install --agent codex
npx android-agent-skills install --agent cursor
npx android-agent-skills install --agent '*'
# Update
npx android-agent-skills update
🔧 Manual — no tools needed
git clone --depth=1 https://github.com/piyushverma0/android-agent-skills.git
# Copy to your agent — pick one
cp -r android-agent-skills/skills/* ~/.claude/skills/ # Claude Code (global)
cp -r android-agent-skills/skills/* .claude/skills/ # Claude Code (project)
cp -r android-agent-skills/skills/* ~/.codex/skills/ # Codex
cp -r android-agent-skills/skills/* ~/.cursor/skills/ # Cursor
cp -r android-agent-skills/skills/* .github/skills/ # Copilot / universal
📂 Install paths by agent
| Agent | Global | Project |
|---|---|---|
| Claude Code | ~/.claude/skills/ |
.claude/skills/ |
| OpenAI Codex | ~/.codex/skills/ |
.codex/skills/ |
| Cursor | ~/.cursor/skills/ |
.cursor/skills/ |
| Antigravity | ~/.antigravity/skills/ |
.antigravity/skills/ |
| GitHub Copilot | — | .github/skills/ |
| Gemini CLI | ~/.gemini/skills/ |
.gemini/skills/ |
| Windsurf | ~/.windsurf/skills/ |
.windsurf/skills/ |
| OpenCode | ~/.config/opencode/skill/ |
.opencode/skill/ |
✅ Verify it worked
Open a new session and type:
Add Supabase auth with email/password to my Android app
The agent should automatically apply supabase-android + hilt-di + android-architecture — writing persistSession = false, the correct getUser(jwt) pattern, a Hilt module with @Binds, and a sealed AuthState — without you explaining any of it.
What these skills fix — the real problems
🔴 Design inconsistency — the silent token killer
Without the design-system skill, agents write this across your codebase:
// Screen 1 — HomeScreen.kt
Text("Title", fontSize = 20.sp, color = Color(0xFF1A1A2E))
Card(modifier = Modifier.padding(12.dp))
// Screen 2 — ProfileScreen.kt (different session)
Text("Title", fontSize = 18.sp, color = Color(0xFF161622)) // slightly different!
Card(modifier = Modifier.padding(16.dp)) // different padding!
// Screen 3 — SettingsScreen.kt (yet another session)
Text("Title", fontSize = 22.sp, fontWeight = FontWeight.Bold)
Box(modifier = Modifier.padding(14.dp)) // 14dp?? where did this come from
Every session starts with zero visual memory. The agent doesn't know what your last screen looked like.
With design-system, the agent reads these tokens once and applies them everywhere:
// Every screen, every session — consistent
Text("Title", style = MaterialTheme.typography.titleLarge)
AppCard { content() } // always the same padding, shape, surface color
Spacer(Modifier.height(Spacing.md)) // always 16dp
No re-explaining. No inconsistent screens. No cleanup pass at the end.
🔴 Supabase UnauthorizedRestException — the production crash
Without supabase-android, agents write this:
// Looks fine in dev, breaks in production
val client = createSupabaseClient(url, anonKey) {
install(Auth) // persistSession = true by default
}
// After hot restart: currentUserOrNull() returns null
// JWT passed to Edge Function: UnauthorizedRestException
Your users see crashes. You spend hours debugging. The agent tries 3 different fixes before finding the right one.
With supabase-android, the agent writes this the first time:
// Correct — no debugging session needed
val client = createSupabaseClient(url, anonKey) {
install(Auth) {
persistSession = false // required when passing JWT to Edge Functions
}
}
val user = client.auth.getUser(jwt) // pass jwt directly
🔴 Hilt compile errors — the 3-try debugging loop
Without hilt-di, agents write:
// ❌ @Provides where @Binds is needed — slower, causes issues
@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {
@Provides @Singleton
fun provideRepo(impl: ItemRepositoryImpl): ItemRepository = impl
}
// ❌ Wrong scope — Singleton injected into ActivityScoped = Dagger crash
@ActivityScoped
class SomeViewModel @Inject constructor(
private val repo: ItemRepository // @Singleton — scope mismatch
)
With hilt-di, the agent writes it right the first time:
// ✅ @Binds — correct, efficient, no scope mismatch
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds @Singleton
abstract fun bindRepo(impl: ItemRepositoryImpl): ItemRepository
}
🔴 kapt in 2026 — the slow build loop
Without gradle, agents still write kapt in 2026:
// ❌ Every session, every new module
plugins { kotlin("kapt") }
kapt(libs.hilt.compiler)
kapt(libs.room.compiler)
// Builds 2× slower. Deprecated. Causes issues with newer Kotlin.
With gradle:
// ✅ Always ksp — first time, every time
plugins { alias(libs.plugins.ksp) }
ksp(libs.hilt.compiler)
ksp(libs.room.compiler)
🔴 Missing UiState states — the invisible crash
Without compose-ui, agents write:
// ❌ No loading state, no error state, no empty state
@Composable
fun HomeScreen(viewModel: HomeViewModel = hiltViewModel()) {
val items by viewModel.items.collectAsState() // ← wrong API, no lifecycle
LazyColumn {
items(items) { ItemCard(it) }
}
// What shows while items are loading? Nothing. Blank screen.
// What shows if loading fails? Nothing. Blank screen.
// What shows if items list is empty? Nothing. Blank screen.
}
With compose-ui:
// ✅ Every state handled, correct API
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
when (uiState) {
is Loading -> AppLoadingScreen()
is Empty -> AppEmptyScreen("No items yet", "Add your first item to get started")
is Success -> ItemList(uiState.items)
is Error -> AppErrorScreen(uiState.message, onRetry = viewModel::load)
}
🔴 Room without migrations — silent data loss
Without room-database, agents write:
// ❌ destroys user data on every schema change
Room.databaseBuilder(context, AppDatabase::class.java, "db")
.fallbackToDestructiveMigration() // ← wipes database when schema changes
.build()
With room-database:
// ✅ Explicit migrations — user data is safe
Room.databaseBuilder(context, AppDatabase::class.java, "db")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
.build()
🔴 No tests — the Play Store rejection risk
Without android-testing, agents ship with zero tests. Play Store doesn't reject you for this directly, but your crash rate will be high enough to trigger policy review. Also: every refactor breaks something and you don't know it until users report it.
With android-testing, the agent writes FakeItemRepository, MainDispatcherRule, and ViewModel tests alongside the feature — not as an afterthought.
The 27 skills — what each one does
Tier 1 — Foundation (fixes the most expensive mistakes)
| Skill | What it fixes | Where it applies |
|---|---|---|
android-setup |
Wrong SDK versions, kapt instead of ksp, no version catalog |
build.gradle.kts, settings.gradle.kts, libs.versions.toml |
compose-ui |
Missing UiState states, collectAsState() instead of lifecycle-aware, Scaffold padding ignored |
Every @Composable screen file |
android-architecture |
DTOs leaking to UI, ViewModel calling Room directly, no Result<T> |
ViewModel.kt, Repository.kt, UseCase.kt |
hilt-di |
@Provides vs @Binds, scope errors, Dagger compile errors |
Every @Module, @HiltViewModel, @AndroidEntryPoint |
kotlin-patterns |
GlobalScope, !! operator, wrong dispatcher, var in data class |
Any .kt file with coroutines or Flow |
Tier 2 — UI System (consistency across every screen)
| Skill | What it fixes | Where it applies |
|---|---|---|
design-system |
Different spacing/colors/typography per screen, no dark mode, hardcoded values | AppTheme.kt, DesignTokens.kt, every component |
adaptive-ui |
No NavigationSuiteScaffold, broken layouts on different screen sizes |
Every screen, AppNavHost.kt |
material3 |
Wrong M3 APIs, M2 components mixed in, drop shadows instead of tonal elevation | Any M3 component usage |
compose-navigation |
String routes, no type safety, broken back navigation | Routes.kt, AppNavHost.kt |
compose-animation |
No skeleton loading, no transition animations, tween(300) for everything |
Any animated screen |
Tier 3 — Data Layer (no more production crashes)
| Skill | What it fixes | Where it applies |
|---|---|---|
room-database |
fallbackToDestructiveMigration, no @Upsert, kapt for Room compiler |
@Entity, @Dao, @Database files |
retrofit |
Non-suspend functions, untyped errors, hardcoded base URL | ApiService.kt, NetworkModule.kt |
datastore |
SharedPreferences in new code, multiple instances, no corruption handler |
UserPreferencesRepository.kt |
offline-first |
UI showing network response directly, no cache fallback, no retry | Repository sync logic |
Tier 4 — Platform Features
| Skill | What it fixes | Where it applies |
|---|---|---|
supabase-android |
UnauthorizedRestException, persistSession bug, wrong JWT pattern |
SupabaseModule.kt, auth code |
firebase |
No BoM, missing .await(), no offline persistence |
FirebaseModule.kt, Firestore queries |
permissions |
No rationale dialog, permanent deny not handled | Any permission request screen |
notifications |
Channel not created, wrong PendingIntent flags |
NotificationHelper.kt |
camerax |
ImageProxy not closed, wrong executor |
Camera screen, QR scanner |
biometrics |
BiometricPrompt in Composable, wrong flags |
MainActivity.kt biometric setup |
Tier 5 — Quality & Security
| Skill | What it fixes | Where it applies |
|---|---|---|
android-testing |
No tests, no MainDispatcherRule, runBlocking in tests |
Every *Test.kt file |
performance |
List<T> instead of stable list, computation in composition |
@Stable/@Immutable annotations |
security |
API keys in BuildConfig, plain SharedPreferences for tokens |
SecureStorage.kt, build config |
accessibility |
Missing contentDescription, no semantics |
Semantics modifiers on Composables |
gradle |
Versions hardcoded, kapt, no build cache |
All build.gradle.kts files |
Tier 6 — Release
| Skill | What it fixes | Where it applies |
|---|---|---|
ci-cd-android |
No test automation, APK instead of AAB, credentials in code | .github/workflows/ci.yml |
play-store-release |
isDebuggable = true, no Data Safety form, wrong targetSdk |
Release build config |
How skills work — no prompting needed
Each skill has a description field with exact trigger keywords. The agent matches them automatically when it reads your task.
You type: "Add Supabase login to my app"
Agent sees: supabase-android → matches "Auth, persistSession, getUser(jwt)"
hilt-di → matches "@HiltViewModel, @Module"
android-architecture → matches "ViewModel, UiState, Repository"
Agent loads: All three skills
Agent writes: persistSession = false, correct JWT flow, @Binds Hilt module,
sealed AuthState, no UnauthorizedRestException — first try
Context cost — 27 skills in context, minimal impact
Level 1 (always active): skill name + description ≈ 50 tokens each
Level 2 (loads on trigger): full SKILL.md ≈ 2,000 tokens
Level 3 (loads on demand): references/ ≈ 500-1,500 tokens
All 27 skills at level 1 = ~1,350 tokens total — a rounding error in your context window. The full rules only load when triggered.
Manual invoke
/supabase-android # Claude Code
/hilt-di
/android-testing
# Or in a prompt:
"Using the design-system skill, create a consistent card for this screen"
Skill file structure
skills/<skill-name>/
├── SKILL.md ← agent reads this on trigger
│ rules + ✅ correct code + ❌ wrong code + anti-patterns
├── metadata.json ← version, SDK targets
├── rules/ ← individual rule source files
└── references/ ← deep-dive files loaded only when needed
└── topic.md ← e.g., hilt-testing.md, supabase-auth-patterns.md
Contributing
These skills fix real mistakes from real projects. If you've built an Android app with AI and hit a recurring mistake that's not covered here — write the skill.
git clone https://github.com/piyushverma0/android-agent-skills
cd android-agent-skills
mkdir -p skills/your-skill-name/rules
mkdir -p skills/your-skill-name/references
# Write SKILL.md following the format in AGENTS.md
# Every rule needs: ✅ correct, ❌ wrong, "Common Mistakes" section
git checkout -b feat/your-skill-name
git commit -m "feat(your-skill-name): add skill"
git push && open PR
Skills I need most:room-paging · maps-compose · in-app-purchase · widgets-glance · media3-player · mlkit-text-recognition · workmanager-advanced · bluetooth-le
See CONTRIBUTING.md for format requirements.
Updates
npx android-agent-skills update
# Manual
git clone --depth=1 https://github.com/piyushverma0/android-agent-skills.git /tmp/aas \
&& cp -r /tmp/aas/skills/* ~/.claude/skills/ \
&& rm -rf /tmp/aas
License
MIT.
Built by Piyush Verma.
Solo Android builder from Banda, UP.
I got tired of 5× token bills. So I fixed the problem.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found