{"id":2307,"date":"2026-03-23T23:30:14","date_gmt":"2026-03-24T07:30:14","guid":{"rendered":"https:\/\/www.yoonhuh.com\/blog\/?p=2307"},"modified":"2026-03-23T23:52:28","modified_gmt":"2026-03-24T07:52:28","slug":"gamecollection-vibecoding-an-android-app-with-cursor","status":"publish","type":"post","link":"https:\/\/www.yoonhuh.com\/blog\/gamecollection-vibecoding-an-android-app-with-cursor\/","title":{"rendered":"Game Collection: Vibecoding an Android App with Cursor"},"content":{"rendered":"<p class=\"isSelectedEnd\">I recently put together a new Android project called <a href=\"https:\/\/github.com\/huhx0015\/GameCollection\"><strong>Game Collection<\/strong><\/a>, built using <a href=\"https:\/\/cursor.com\/get-started?utm_source=google_paid&amp;utm_campaign=[Search]%20[Brand]%20[EN]%20[US_CA_NZ_IE_GB_AU]%20[Broad]%20[Max%20Conv]%20[Subscribes]%20Brand%20Value%20Based%20Bidding&amp;utm_term=cursor%20ai&amp;utm_medium=paid&amp;utm_content=798371281179&amp;cc_platform=google&amp;cc_campaignid=23656700841&amp;cc_adgroupid=195242436478&amp;cc_adid=798371281179&amp;cc_keyword=cursor%20ai&amp;cc_matchtype=b&amp;cc_device=c&amp;cc_network=g&amp;cc_placement=&amp;cc_location=9032086&amp;cc_adposition=&amp;gad_source=1&amp;gad_campaignid=23656700841&amp;gbraid=0AAAABAkdGgQ628j1pEP93V6iRPE9CzCfi&amp;gclid=Cj0KCQjw7IjOBhDyARIsAFzrWQyTgqYrtsX8Z4kj5XQgtVRH_i-uQFixagB5HVAil6c6FMI9QY55IiEaArJDEALw_wcB\">Cursor<\/a> and its agentic AI workflow capabilities.<\/p>\n<div style=\"width: 1170px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-2307-1\" width=\"1170\" height=\"2535\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/webm\" src=\"https:\/\/www.yoonhuh.com\/blog\/wp-content\/uploads\/2026\/03\/GameCollection_Demo.webm?_=1\" \/><a href=\"https:\/\/www.yoonhuh.com\/blog\/wp-content\/uploads\/2026\/03\/GameCollection_Demo.webm\">https:\/\/www.yoonhuh.com\/blog\/wp-content\/uploads\/2026\/03\/GameCollection_Demo.webm<\/a><\/video><\/div>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">This started as a simple idea: build a lightweight app to browse video games using the <a href=\"https:\/\/www.igdb.com\/\">IGDB (Internet Game Database)<\/a>. But more importantly, it became an experiment\u2014how far can modern AI tools go if you give them a <em>well-structured plan<\/em>?<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f4a1; The Idea<\/h2>\n<p class=\"isSelectedEnd\">At its core, <strong>Game Collection<\/strong> is a simple app:<\/p>\n<ul>\n<li class=\"isSelectedEnd\">Users can browse games by platform, view detailed information (cover art, summaries, screenshots), and save titles to a personal collection stored locally on-device.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">Nothing too crazy from a product standpoint, but that wasn\u2019t really the point.<\/p>\n<p class=\"isSelectedEnd\">The real goal was to explore whether an AI-assisted workflow could produce something that <em>feels closer to a structured production-style Android app<\/em>, not just a quick prototype with &#8220;spaghetti code&#8221;.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f916; Vibecoding with a Plan<\/h2>\n<p class=\"isSelectedEnd\">For this project, I used <strong>Cursor\u2019s Plan mode<\/strong> with the <strong>Composer 2 Fast model<\/strong>.<\/p>\n<p class=\"isSelectedEnd\">Instead of jumping straight into prompts, I took a step back and approached this like I would any real project. I defined:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">The architecture (Clean Architecture + MVI)<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">The tech stack (Compose, Room, Hilt, Retrofit, Coroutines, StateFlow)<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">The modular structure<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">The user flows and navigation<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">Expectations around testability and separation of concerns<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">In other words, I didn\u2019t just ask AI to \u201cbuild an app\u201d, I gave it a detailed <strong>blueprint<\/strong>.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f9f1; Building on AndroidBooster<\/h2>\n<p class=\"isSelectedEnd\">To get things going, I used my <strong>Android Booster<\/strong> project as the foundation:<\/p>\n<p class=\"isSelectedEnd\">&#x1f517; <a href=\"https:\/\/github.com\/huhx0015\/AndroidBooster\">https:\/\/github.com\/huhx0015\/AndroidBooster<\/a><\/p>\n<p class=\"isSelectedEnd\">This already includes a modular setup, shared architecture patterns, and a set of \u201cClaude skills\u201d that help guide AI toward consistent implementations.<\/p>\n<p class=\"isSelectedEnd\">From there, Game Collection was essentially layered on top, focused purely on the feature set.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x26a1; 30 Minutes Later\u2026<\/h2>\n<p class=\"isSelectedEnd\">After feeding the full plan into Cursor and reviewing its execution strategy, I let it run.<\/p>\n<p class=\"isSelectedEnd\">About <strong>30 minutes later<\/strong>, the app was\u2026 basically there.<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">Navigation flows were wired up<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">IGDB integration (including Twitch auth) was working<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">Compose screens were generated<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">Room database was hooked up<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">State and data flow followed MVI-style patterns<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">Not perfect, but surprisingly complete.<\/p>\n<p class=\"isSelectedEnd\">I\u2019d estimate about <strong>95% of the intended functionality was implemented in that first pass<\/strong>.<\/p>\n<p class=\"isSelectedEnd\">There were a few rough edges that needed follow-up prompts and some manual fixes, but nothing major.<\/p>\n<p class=\"isSelectedEnd\">Honestly, this was the most surprising part.<\/p>\n<p class=\"isSelectedEnd\">This is the kind of scaffolding + feature work that would normally take <strong>several hours (5+ easily)<\/strong> to get into a solid state. Seeing it come together in under an hour, <em>while still respecting architectural constraints, <\/em>was pretty wild.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f3d7;&#xfe0f; What I Found Interesting<\/h2>\n<p class=\"isSelectedEnd\">A few things stood out while working on this:<\/p>\n<p class=\"isSelectedEnd\"><strong>1. Structure matters more than ever<\/strong><br \/>\nAI is only as good as the constraints you give it. Because the plan was explicit about architecture, modularization, and patterns, the output actually followed those guidelines surprisingly well.<\/p>\n<p class=\"isSelectedEnd\"><strong>2. This isn\u2019t just \u201ccode generation\u201d<\/strong><br \/>\nIt felt less like autocomplete and more like collaborating with an engineer who:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">understands high-level direction<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">executes quickly<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">occasionally needs correction<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\"><strong>3. The role of the developer is shifting<\/strong><br \/>\nInstead of writing everything line-by-line, the focus becomes:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">defining systems<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">reviewing implementations<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">fixing edge cases<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">guiding iteration<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f9e9; Architecture at a Glance<\/h2>\n<p class=\"isSelectedEnd\">Even though this was an experiment, I still wanted the app to follow a production-style structure:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\"><strong>app<\/strong> \u2192 Compose UI, navigation, ViewModels<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\"><strong>core<\/strong> \u2192 Entities, use cases, repository interfaces<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\"><strong>core<\/strong> \u2192 IGDB + Twitch integration, repositories<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\"><strong>core<\/strong> \u2192 Room + DAOs<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\"><strong>core<\/strong> \u2192 Shared MVI contracts<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\"><strong>core<\/strong> \u2192 Shared utilities and bindings<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">The goal wasn\u2019t just to make it work, but to make it <em>scalable and maintainable<\/em>.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f510; Getting It Running<\/h2>\n<p class=\"isSelectedEnd\">If you want to try it out, you\u2019ll need IGDB access via Twitch:<\/p>\n<ol start=\"1\" data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">Create a Twitch developer application<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">Add your credentials to a <code dir=\"ltr\">keys.properties<\/code> file:<\/p>\n<\/li>\n<\/ol>\n<pre dir=\"ltr\"><code dir=\"ltr\">twitch.client.id=&lt;YOUR_CLIENT_ID&gt;\r\ntwitch.client.secret=&lt;YOUR_CLIENT_SECRET&gt;<\/code><\/pre>\n<p class=\"isSelectedEnd\">More details here:<br \/>\n&#x1f517; <a href=\"https:\/\/api-docs.igdb.com\/#getting-started\">https:\/\/api-docs.igdb.com\/#getting-started<\/a><\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f680; Final Thoughts<\/h2>\n<p class=\"isSelectedEnd\">This project ended up being less about the app itself and more about the process.<\/p>\n<p class=\"isSelectedEnd\">What stood out most was how effective AI can be when paired with:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p class=\"isSelectedEnd\">clear architecture<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">strong constraints<\/p>\n<\/li>\n<li>\n<p class=\"isSelectedEnd\">and a well-defined plan<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"isSelectedEnd\">It\u2019s not replacing the developer, but it\u2019s definitely changing how we build.<\/p>\n<p class=\"isSelectedEnd\">And honestly, it makes experimenting with new ideas <em>a lot faster<\/em>.<\/p>\n<div contenteditable=\"false\">\n<hr \/>\n<\/div>\n<h2>&#x1f517; Check It Out<\/h2>\n<p class=\"isSelectedEnd\">If you\u2019re interested, you can find the project here:<\/p>\n<p><a href=\"https:\/\/github.com\/huhx0015\/GameCollection\">https:\/\/github.com\/huhx0015\/GameCollection<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently put together a new Android project called Game Collection, built using Cursor and its agentic AI workflow capabilities. &nbsp; This started as a simple idea: build a lightweight app to browse video games using the IGDB (Internet Game Database). But more importantly, it became an experiment\u2014how far can<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[534],"tags":[580,28,577,583,589,581,591,590,588],"class_list":["post-2307","post","type-post","status-publish","format-standard","hentry","category-coding","tag-agentic-ai","tag-android","tag-android-app","tag-claude","tag-clean-architecture","tag-cursor","tag-igdb","tag-mvi","tag-vibecoding"],"_links":{"self":[{"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/posts\/2307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/comments?post=2307"}],"version-history":[{"count":12,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/posts\/2307\/revisions"}],"predecessor-version":[{"id":2320,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/posts\/2307\/revisions\/2320"}],"wp:attachment":[{"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/media?parent=2307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/categories?post=2307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yoonhuh.com\/blog\/wp-json\/wp\/v2\/tags?post=2307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}