56 lessons help you to steer your own app in the right direction.
After you unlockThe plan starts the day you buyOne task a day, each linked straight to its lesson
Completed0/31
01.01Indie mobile là một nghềFreeUp next→ Hiểu nghề indie mobile gồm những việc gì, khác freelance và startup ở đâu, và thứ gì tích lũy lại qua từng app.20 min
01.02Nhịp làm việc bền khi build một mìnhFree→ Hiểu readiness là khả năng giữ nhịp làm việc trong đời sống thật, và chuẩn bị sẵn quy tắc cho những tuần mọi thứ đi lệch.20 min
01.03Đừng chờ đợi tự tin. Bạn đã có đủ để bắt đầu.→ Bắt đầu phiên bản đầu tiên khi đã biết mình giúp ai, giảm nỗi khó chịu nào và làm phần nhỏ nào trước.15 min
01.04Scope cho một người: cắt đến khi còn một core flow→ Viết core flow thành một câu, cắt mọi tính năng không cần cho core flow, và giữ danh sách để sau kèm điều kiện.20 min
01.05App chưa thành công không có nghĩa là bạn thất bại→ Tách kết quả của một app khỏi đánh giá về bản thân, gọi tên giả thuyết chưa đúng và ghi mỗi sai lầm thành một câu về một quyết định cụ thể.20 min
02.01Săn niche có sẵn còn vấn đề bỏ ngỏ→ Tìm ý tưởng trong những nhóm app đã có người cài và người trả tiền, rồi tìm nhóm người hoặc nhu cầu mà các app hiện có phục vụ chưa tốt.20 min
02.02Vấn đề đáng làm và tín hiệu trả tiềnFree→ Nhận ra một vấn đề đáng làm qua người gặp, tình huống lặp lại và dấu vết chi phí, thay vì tin vào lời khen xã giao.20 min
02.03Chọn một ý tưởng bằng hai trục: giá trị và khả năng→ Chấm mỗi ý tưởng trên trục giá trị của vấn đề và trục khả năng thực thi của bạn, rồi chọn ý tưởng cân bằng nhất để làm trước.20 min
02.04Đọc đối thủ qua trang store và review từ 1 đến 3 sao→ Đọc lời hứa trên trang store của đối thủ, hiểu điểm sao được tính thế nào, và gắn nhãn review 1 đến 3 sao để tìm vấn đề lặp lại ở nhiều app.20 min
02.05Phỏng vấn người dùng mà không bị khen xã giao→ Hỏi về những lần cụ thể đã xảy ra thay vì hỏi ý kiến về ý tưởng, ghi lại hành vi và tìm tín hiệu cam kết thay vì lời khen.20 min
02.06Tìm Aha moment của người dùng→ Tìm khoảnh khắc người dùng tự nhận ra dùng app tốt hơn cách cũ, bằng khung Situation, Action, Friction, Relief.15 min
03.01Đừng để người dùng phải hỏi: “Giờ mình đi đâu?”Free→ Chọn cách dẫn đường theo ý định của người dùng, để mỗi điểm đến và mỗi cái tên đều có lý do.20 min
03.02Onboarding đưa người dùng tới Aha moment nhanh nhất→ Rút ngắn đường từ lúc mở app tới lúc người dùng thấy giá trị đầu tiên, và để những thứ app cần xin xuất hiện sau khoảnh khắc đó.20 min
03.03Khi nào app được phép ngắt nhịp người dùng?→ Chọn đúng mức độ ngắt nhịp và viết micro-copy rõ ràng để app bảo vệ sự tập trung của người dùng.20 min
03.04Chuyển động và rung phản hồi có lý do→ Dùng chuyển động, rung phản hồi và hiệu ứng thị giác như tín hiệu sản phẩm: làm rõ điều vừa xảy ra, giữ đúng cảm xúc và không đòi thêm sự chú ý.20 min
03.05Màn hình dọc, ngang và tablet→ Thiết kế theo bối cảnh dùng trên màn hình dọc, ngang và tablet, và hiểu Android 16 thay đổi gì với app khóa hướng màn hình.20 min
03.06Notification là một lời mời có lý do→ Thiết kế notification gắn với điều người dùng quan tâm, xin quyền đúng lúc, và chọn giữa local và push notification.20 min
03.07Khi người dùng mất mạng→ Chia tính năng thành ba vùng theo mức phụ thuộc mạng, giữ core flow chạy được khi offline và báo lỗi mạng bằng lời người dùng hiểu.20 min
03.08Backup, restore và đổi máy→ Kiểm kê dữ liệu app lưu ở đâu, chọn cách để dữ liệu theo người dùng sang máy mới, và nói rõ với người dùng điều gì được giữ lại.20 min
04.01Stack cho một người: KMP, Supabase, RevenueCat, Firebase→ Chọn công nghệ theo những việc app cần làm, và hiểu mỗi dịch vụ có sẵn kéo theo cam kết gì về chi phí, dữ liệu, cập nhật và khả năng rời đi.20 min
04.02Feature flag và kill-switch: ship trước, bật sau→ Phân biệt flag lúc build và flag từ xa, dùng flag từ xa làm kill-switch cho tính năng rủi ro, và tránh các bẫy về giá trị mặc định, độ trễ và bí mật.20 min
04.03Event tracking có chủ đích→ Chọn một bộ event nhỏ để biết người dùng đã chạm tới Aha moment hay bị kẹt ở đâu, với ví dụ từ app quiz của khóa học.20 min
04.04Crash làm mất niềm tin: theo dõi bằng Android vitals và Xcode Organizer→ Xếp hạng crash theo thứ người dùng mất, và theo dõi crash bằng Android vitals và Xcode Organizer trước khi cài thêm SDK.20 min
04.05Tính năng AI cần người chịu trách nhiệm→ Thiết kế tính năng AI nói đúng những gì nó làm, có đường lùi, cho user báo lỗi trong app và gửi ít dữ liệu nhất ra ngoài.20 min
04.06Beta: closed testing trên Play và TestFlight→ Tổ chức một vòng beta có câu hỏi rõ ràng trên Google Play và TestFlight, và đọc đúng yêu cầu chính thức trước khi bắt đầu.20 min
04.07Phát hành theo giai đoạn trên Play và App Store→ Dùng staged rollout của Google Play và phased release của App Store, với tín hiệu viết sẵn để quyết định mở rộng, chờ hay dừng.20 min
05.01ASO cơ bản: tên app, mô tả ngắn, từ khóa→ Viết tên app, subtitle hoặc mô tả ngắn và từ khóa bằng chữ của người dùng, theo đúng cách App Store và Google Play đọc trang store.20 min
05.02Store listing: icon, screenshot, video→ Làm icon, screenshot và video cho trang store sao cho kể đúng app và theo yêu cầu hiện hành của Google Play và App Store.20 min
05.03Khai báo dữ liệu trên store: Data safety và App Privacy→ Khai đúng Data safety trên Google Play và App Privacy trên App Store, kể cả dữ liệu do SDK bên thứ ba thu.20 min
05.04Trẻ em không phải một thị trường bình thường→ Quyết định app có phục vụ trẻ em không, và nếu có thì sản phẩm cùng phần khai báo trên store phải thay đổi những gì.20 min
05.05Qua vòng review của App Store và Google Play→ Chuẩn bị một lần nộp gọn gàng trên App Store và Google Play, và biết cách xử lý khi bị từ chối.20 min
05.06Launch cohort đầu tiên: 50 người đúng thay vì 5.000 người ngẫu nhiên→ Tìm nhóm người dùng đầu tiên ở nơi vấn đề đã được nói thành lời, mời họ dùng thử và đọc được hành vi của họ.20 min
06.01Các mô hình kiếm tiền: paid, freemium, subscription, IAP, ads→ Chọn mô hình kiếm tiền theo việc giá trị app và chi phí của bạn có lặp lại hay không, và theo luật billing của hai store.20 min
06.02Thiết kế offer trước khi xây feature→ Chia offer thành ba lớp Aha, Core và Expansion: giá trị cốt lõi đến trước, premium mở rộng sau.20 min
06.03Từ offer sang paywall: mời trả tiền đúng khoảnh khắc→ Đặt lời mời trả tiền tại chỗ phần miễn phí bắt đầu chật, sau khi người dùng đã thấy giá trị, với nút đóng hiện rõ.20 min
06.04Định giá là giả thuyết: gói tháng và gói năm→ Neo giá gói tháng và gói năm theo cách người dùng đang giải quyết vấn đề, hiển thị giá đúng luật store, và hiểu chuyện gì xảy ra khi đổi giá.20 min
06.05Free trial và ưu đãi giới thiệu→ Hiểu các loại ưu đãi giới thiệu và điều kiện nhận trên hai store, những gì phải hiện trước khi người dùng đăng ký trial, và khi nào nên dùng trial.20 min
06.06Một giao dịch phải đáng tin→ Nhìn giao dịch subscription như bốn lời hứa, biết RevenueCat lo phần nào và phần nào app vẫn phải tự làm: khôi phục, giao dịch đang chờ, danh tính người dùng.20 min
06.07Vòng đời subscription: gia hạn, grace period, hủy, hoàn tiền→ Trả lời đúng câu hỏi người dùng còn được dùng premium không ở mỗi trạng thái của subscription trên Google Play và App Store.20 min
06.08Đọc tín hiệu doanh thu đầu tiên→ Dựng funnel năm bước cho subscription và đọc mỗi khoảng rơi thành một giả định cần kiểm tra, thay vì để phán xét app.20 min
06.09Doanh thu không được phép phá niềm tin→ Nhận diện dark pattern trên paywall và luồng mua, biết store cấm những gì, và khi nào một nguồn doanh thu đáng từ chối.20 min
06.10Phí store, thuế và nhận tiền→ Hiểu đường đi của tiền từ giá người dùng trả tới tài khoản ngân hàng: thuế gián thu, phí store, thuế khấu trừ, chi trả, mà không học thuộc con số nào.20 min
07.01Xin đánh giá đúng lúc→ Xin người dùng chấm sao bằng hộp thoại của hệ thống, vào điểm dừng sau một lần thành công, và tránh những cách hỏi bị store cấm.20 min
07.02Trả lời review công khai→ Trả lời review trên Google Play và App Store đúng chính sách, theo thứ tự ưu tiên, với một cấu trúc ngắn, và quay lại sửa câu trả lời khi lỗi đã được sửa.20 min
07.03Support khi chỉ có một người→ Dựng hệ thống support một người duy trì được: một kênh chính, thông tin điền sẵn, phân loại email, thời gian phản hồi giữ được và câu trả lời mẫu.20 min
07.04Vòng phản hồi: thu, phân loại, đóng vòng→ Gom góp ý từ review, email, bản test và dữ liệu sử dụng về một chỗ, phân loại theo vấn đề, đếm qua nhiều nguồn và báo lại cho người đã góp ý.20 min
07.05Retention: đọc cohort→ Đọc bảng retention theo cohort bằng ba cách, biết lấy số ở Play Console, App Store Connect và Google Analytics, và chọn định nghĩa quay lại theo việc chính của app.20 min
07.06Churn của subscription và win-back→ Phân biệt churn chủ động với churn do lỗi thanh toán, giữ người đã hủy nhưng chưa hết hạn, và dùng công cụ win-back của hai store đúng cách.20 min
07.07Bản kê dữ liệu và lời hứa với người dùng→ Lập bản kê dữ liệu gồm cả SDK và dịch vụ bên ngoài, rồi dùng nó làm nguồn cho privacy policy, lời giải thích trong app, khai báo store và quyền kiểm soát.20 min
07.08Xóa tài khoản và dữ liệu→ Hiểu yêu cầu xóa tài khoản của App Store và Google Play, thiết kế luồng xóa đủ năm bước, và chạy phần xóa ở server với quyền quản trị.20 min
08.01Phát hành bản cập nhật dựa trên bằng chứng→ Biến mỗi bản cập nhật thành một giả thuyết ba phần có tín hiệu chọn trước, chỉ gói một thay đổi cần học trong mỗi bản, và đọc kết quả sau khi phát hành.20 min
08.02Retro theo giả thuyết: giữ, sửa hay bỏ→ Thay câu hỏi thành công hay thất bại bằng một buổi retro theo năm lớp giả thuyết, xếp mỗi giả thuyết vào giữ, sửa, bỏ hoặc chưa đủ dữ liệu.20 min
08.03Build in public: chia sẻ gì, giữ lại gì→ Quyết định có nên build in public, chọn điều đáng chia sẻ, không đăng dữ liệu người dùng hay secret, tuân thủ luật review và dùng link thử nghiệm của store.20 min
08.04Chi phí vận hành của app một người→ Chia chi phí theo thứ làm nó tăng, đọc điều kiện của gói miễn phí, dựng cảnh báo ngân sách và spend cap, và giữ khóa API trả phí ở server.20 min
08.05Giữ app sống lâu: SDK, target API, chính sách mới→ Biết những gì làm app mất khả năng phát hành, từ target API, SDK, privacy manifest tới tài khoản developer, và đặt lịch bảo trì theo tháng, quý, năm.20 min
08.06Một app sâu hay nhiều app nhỏ→ Quyết định giữa đào sâu một app và mở thêm app mới dựa trên bằng chứng retro, và phân biệt đi tiếp có căn cứ với nhảy ý tưởng.20 min
00.01Install Git, JDK 17, Android Studio And The SDKFreeUp next→ Set up Git, JDK 17 and the Android tooling you need to clone, open and build the course's Kotlin Multiplatform app.10 min
00.02Clone The Repo And Open The KMP Project For The First TimeFree→ Open a real production Kotlin Multiplatform project instead of a toy starter project.12 min
00.03Service Account ChecklistFree→ Know which outside accounts you need and why you need each one.14 min
00.04Set Up Supabase SQL, Secrets And FirebaseFree→ Prepare the backend tables, auth configuration and Firebase Android project you need before the app's first serious run.18 min
00.05First Build, Test And CommitFree→ Create your first safe checkpoint before moving on to the architecture.12 min
00.06Run The App On iOS (macOS + Xcode)Free→ Run the same Kotlin Multiplatform app on the iOS Simulator with Xcode. Optional lesson; needs a Mac with Apple Silicon.20 min
01.01Read The Module GraphFree→ Read a Kotlin Multiplatform project as a system: modules, dependency direction and source sets.6 min
01.02Startup Flow On Android And iOSFree→ Understand which points the app passes through from tapping the icon to the first screen, on both Android and iOS.6 min
01.03Feature Registration And Navigation BoundariesFree→ Understand how the app knows which features exist through an explicit list, and how it navigates between them without coupling them.8 min
01.04Layer Responsibilities And How To Read File NamesFree→ Don't mix UI, business logic and backend code. And learn to guess where a file lives from its name alone.7 min
01.05Your First Safe ChangeFree→ Know what is real and what is mocked, then change the codebase yourself without breaking any boundary.10 min
02.01Anatomy Of A KMP ProjectFree→ Look inside a Kotlin Multiplatform module: targets, source sets, the default hierarchy template, the Android plugin for KMP libraries and what can't go in commonMain.15 min
02.02Platform Seams: expect/actual Or Interface + DIFree→ Choose between expect/actual and interface + DI wherever shared code has to call the platform, based on the repo's three expect declarations and its real interface seams.15 min
02.03iOS Host And Swift InteropFree→ How Kotlin becomes an iOS framework, what Swift sees through the Objective-C header, which features are lost crossing the bridge and how Kotlin calls Apple's APIs.18 min
02.04The Multiplatform Data StackFree→ The data layer of a KMP app: one HttpClient with a per-platform engine, supabase-kt, DataStore through a path resolver, and how to choose a storage library.15 min
03.01Design An Immutable UI Model→ Model a screen with clear, immutable state, then change the state contract yourself.10 min
03.02Manage User Intent With Sealed Actions→ Turn UI events into a clear action vocabulary that you can log and extend yourself to see the payoff.10 min
03.03Control Recomposition→ Why the Menu can skip recomposition: stability and strong skipping.8 min
03.04Build A Compose Screen From State→ The route owns the wiring, and the content composable only renders state. And why shouldn't a Toast live in state?12 min
03.05Reuse The Theme And UI Components→ Build UI without breaking consistency, then upgrade and update tokens across the whole app yourself.10 min
03.06Compose Multiplatform Resources And Localization→ Shared resources in Compose Multiplatform: the composeResources folder, each module's Res class, reading strings, images, fonts and files from commonMain, and keeping the Vietnamese version complete with LocaleParityTest.15 min
04.01Why Is A Reducer Useful?→ Understand when a reducer beats multi-branch UI logic.10 min
04.02Design State, Action, Effect And AsyncOp→ Learn the app's state-machine vocabulary through the DRE pattern.10 min
04.03Read The Game State Machine's Real Reducer→ Read the real reducer from the Game State Machine, following an action to the new state, one-time effects and follow-up work.12 min
04.04Wire The ViewModel To The DRE Store→ Understand the ViewModel's role in the DRE architecture pattern.12 min
04.05Keep Side Effects Outside The Reducer→ Keep navigation, analytics, API calls and snackbars outside pure transitions.12 min
05.01Use Case: The App's Unit Of Business Logic→ Why a short function deserves its own class.11 min
05.02Domain vs Data: Where Does Logic Belong?→ Why does the data side of one feature need 4 files across 2 different modules?12 min
05.03The Clean Architecture Of A Sign-In Tap→ Trace auth from the button tap to the session, then the profile sync.11 min
05.04How You Change The AI Provider With 1 Line Of Code→ With the contract in the right place, switching providers is fast, easy to test, and leaves other modules untouched.12 min
05.05Composition Root: Where Providers Are Defined→ You start to see how the code is organized, and you find the one place that knows both the contracts and the implementations, for Android and iOS alike.10 min
06.01Test Reducers And Use Cases→ Start testing where it's fastest and most valuable.5 min
06.02Test Flows And ViewModels→ Test state emissions without tapping the UI by hand.6 min
06.03Shrink And Protect The Android Release Build→ Why the Android release build isn't the build you tested, and what R8 changes in the app.10 min
06.04Protect Secrets In The Build (Android + iOS)→ Learn a practical way to handle mobile secrets, on both Android and iOS.5 min
06.05CI For KMP→ What the repo's CI checks on every pull request, and which parts of the KMP app you still have to check yourself on a Mac.12 min
06.06Ship The iOS App→ From the iOS project in the repo to a build on TestFlight: configuration, app signing, the secrets check, archiving and uploading.15 min
06.07Run The Release Readiness Check→ Run all 3 test steps on both Android and iOS, finish the checklist, and dare to press the button that ships the app to the Store.8 min
07.01Clean Architecture And The 4-Layer ModelFree→ The dependency rule, the four layers UI, ViewModel, Domain and Data mapped onto the repo's real modules, and one game start traced through all four layers.25 min
07.02Gradle Multi-Module Structure→ Gradle Multi-Module Structure in the Mobile Action Pro course.25 min
07.03Interface-Based Design→ Interfaces as boundaries between layers and seams between platforms, and how DI binds interfaces to implementations.25 min
07.04Repository Pattern→ Repository Pattern in the Mobile Action Pro course.25 min
07.05UseCase Pattern→ UseCase Pattern in the Mobile Action Pro course.25 min
07.06Managers For Complex Orchestration→ Managers For Complex Orchestration in the Mobile Action Pro course.25 min
07.07Data Flow Patterns→ Data Flow Patterns in the Mobile Action Pro course.25 min
07.08Mapping Between Layers→ Mapping Between Layers in the Mobile Action Pro course.25 min
07.09Best Practices And Anti-Patterns→ Best Practices And Anti-Patterns in the Mobile Action Pro course.25 min
08.01DI And Inversion Of Control→ Constructor injection, Inversion of Control and the startSharedApp composition root on Android and iOS.25 min
08.02Koin Overview (Multiplatform)→ Koin in a KMP app: artifacts per module, no Koin in :domain, and one appKoinModules graph for two platforms.25 min
08.03Koin DSL: module, single, factory→ Koin DSL with module, single and factory in the Mobile Action Pro course.25 min
08.04Koin ViewModel Scope→ Koin ViewModel Scope in the Mobile Action Pro course.25 min
08.05Dependency Resolution With get()→ Dependency Resolution with get() in the Mobile Action Pro course.25 min
08.06Koin In Multi-Module: appKoinModules And The Core Module→ Each Gradle module keeps its own Koin module, appKoinModules assembles the shared part, and QzDispatchers and ScopeQualifier live in foundation modules.25 min
08.07Feature Module Pattern→ Feature Module Pattern in the Mobile Action Pro course.25 min
08.08Explicit Feature Registration→ Why the repo lists features in AppFeatures.kt instead of using Class.forName, how FeatureRegistry rejects a wrong list, and the tests that keep it correct.25 min
08.09ViewModel Injection In Routes→ ViewModel Injection in Routes in the Mobile Action Pro course.25 min
08.10Testing With Koin→ Tests that don't need Koin, startKoin/stopKoin hygiene, and AppGraphTest building the whole graph on Android and iOS.25 min
09.01Migrating An Android App To KMP→ The repo's real migration order from Android to Kotlin Multiplatform, and how to use the kta-migrate skill to build the same plan for your app.25 min
Kotlin Accelerator Source CodeA modern Android trivia game inspired by Who Wants to Be a Millionaire?.
Built with Kotlin 2.3.0, Jetpack Compose 2025.12.01, Koin 4.1.1, and Supabase 3.2.6 backend for a seamless quiz experience with AI-powered lifelines, leaderboards, and persistent user profiles.
Flutter Cross Platform CodebsaeThe source follows a lightweight MVVM shape. Widgets render state, ViewModels coordinate user actions and async work, and repositories hide local persistence or Supabase details behind small contracts.
NEWNew resources are on the wayUpdated continuouslyNew templates, checklists and source will show up right here.