I Built a 100+ File Android App Using Only Vibe Coding with Kiro
What happens when you try to build a complex Android app entirely through conversation with an AI? I decided to find out using Kiro, an AI-powered IDE.
The goal: Build a production-quality personal assistant app with voice commands, finance tracking, location-based reminders, and home screen widgets โ without writing boilerplate manually.
What I Built
Smart Calendar โ an AI-powered Android assistant that combines:
- ๐ค Voice-first chat interface with natural language understanding
- ๐ Custom "Kiro" wake word detection
- ๐ฐ Finance tracking with AI-powered SMS parsing
- ๐ Location-based reminders using geofencing
- โ Tasks, alarms, and recurring reminders
- ๐ฑ Three home screen widgets
- ๐ฌ Floating chat bubble overlay
The result: 100+ Kotlin files, 8 database tables, Jetpack Compose UI, and features I'd normally spend weeks implementing.
How Kiro Changed My Approach
1. Spec-Driven Development
Instead of jumping into code, I described features in plain English. Kiro's spec system breaks this into:
- Requirements โ what the feature should do
- Design โ how it should work technically
- Tasks โ step-by-step implementation checklist
This forced me to think through features before coding, catching design issues early.
2. Vibe Coding
Traditional development: Google โ Stack Overflow โ copy โ adapt โ debug โ repeat.
Vibe coding with Kiro: "I want wake word detection that listens for 'Kiro' and triggers voice input."
Kiro generated the AudioRecord implementation, threshold detection, and SpeechRecognizer handoff. I reviewed, tweaked, and moved on.
3. Incremental Complexity
I started with a basic reminder app. Each session added a layer:
- Session 1: Basic reminders
- Session 5: Voice input
- Session 10: Location geofencing
- Session 15: Finance tracking with SMS parsing
- Session 20: Home screen widgets
The app grew organically through conversation.
Code Example: Wake Word Detection
Here's what Kiro generated for the wake word service:
class WakeWordService : Service() {
private var audioRecord: AudioRecord? = null
private val sampleRate = 16000
private val bufferSize = AudioRecord.getMinBufferSize(
sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT
)
private fun startListening() {
audioRecord = AudioRecord(
MediaRecorder.AudioSource.MIC,
sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize
)
// Audio level detection triggers SpeechRecognizer
// which checks for wake word variants:
// "Kiro", "Kyro", "Kero", "Cairo", "Kira"
}
}
I described what I wanted. Kiro handled the Android audio APIs I'd otherwise spend hours researching.
What Worked Well
โ Rapid prototyping โ Features that would take days took hours
โ Consistent architecture โ Kiro maintained patterns across 100+ files
โ Learning accelerator โ I learned Android APIs through generated code
โ Documentation built-in โ Specs serve as living documentation
What Required Iteration
โ ๏ธ Complex state management โ Sometimes needed manual refinement
โ ๏ธ Edge cases โ AI handles happy paths well; edge cases need guidance
โ ๏ธ Platform quirks โ Android-specific gotchas (like exact alarm permissions) required explicit prompting
The Numbers
| Metric | Value |
|---|---|
| Kotlin files | 100+ |
| Database tables | 8 |
| Lines of code | ~15,000 |
| Development approach | 90% vibe coding, 10% specs |
| Time saved | Estimated 60-70% |
Try It Yourself
The full source is available on GitHub. Clone it, explore the .kiro/specs/ folder to see how features were planned, and try extending it with your own vibe-coded features.
Final Thoughts
Kiro didn't replace my development skills โ it amplified them. I still made architectural decisions, reviewed code, and debugged issues. But the tedious parts? The boilerplate, the API lookups, the repetitive patterns? Those became conversations.
If you're curious about AI-assisted development, give vibe coding a try. Start small, iterate, and see how complex you can go.
Built for the Kiroween Hackathon โ Frankenstein Category
"Speak it. Track it. Never forget it."
Top comments (0)