# Mobile Action Pro

> Escape the tutorial traps and build cross-platform mobile apps!

- URL: https://dantech.academy/en/courses/kotlin-accelerator
- Curriculum: 114 lessons
- Tiếng Việt: https://dantech.academy/courses/kotlin-accelerator.md

No more vibing hell, no more doubting your skills. Own your learning progress with an AI Agent, and keep lifetime access. Each lesson is one topic and ends with a task on your own app. I will help you build a production-ready cross-platform mobile app with senior-level product engineering habits. Indie Builder lessons are in Vietnamese.

## Prerequisites

- Basic Java or Kotlin knowledge
- Familiarity with mobile development tooling
- Desire to write clean, testable code

## Skills

- Clean Architecture with MVVM
- Mobile UI Architecture
- Advanced Coroutines & Flow
- Dependency Injection with Koin
- Unit Testing Strategy
- AI Coding Assistant

## Curriculum

For AI agents: every lesson has a Markdown version at its URL plus `.md`. Free lessons return the full text; lessons for enrolled students return their objectives and outline.

### Indie Builder

#### An Indie Builder's Mindset

a way to decide on your own: which work is worth doing, which can wait, and why.

- [Indie mobile là một nghề](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/01-indie-mindset/lesson-01-indie-is-a-craft.md) (free): 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.
- [Nhịp làm việc bền khi build một mình](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/01-indie-mindset/lesson-02-sustainable-solo-rhythm.md) (free): 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.
- [Đừng chờ đợi tự tin. Bạn đã có đủ để bắt đầu.](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/01-indie-mindset/lesson-03-start-before-you-feel-ready.md): 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.
- [Scope cho một người: cắt đến khi còn một core flow](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/01-indie-mindset/lesson-04-scope-for-one-person.md): 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.
- [App chưa thành công không có nghĩa là bạn thất bại](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/01-indie-mindset/lesson-05-builder-beyond-one-idea.md): 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ể.

#### Choose an Idea and Validate It

one concrete idea checked with real users, and a reason to build it or drop it.

- [Săn niche có sẵn còn vấn đề bỏ ngỏ](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-01-find-an-existing-niche.md): 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.
- [Vấn đề đáng làm và tín hiệu trả tiền](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-02-problem-worth-solving.md) (free): 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.
- [Chọn một ý tưởng bằng hai trục: giá trị và khả năng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-03-pick-one-idea-two-axes.md): 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.
- [Đọc đối thủ qua trang store và review từ 1 đến 3 sao](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-04-read-competitors-on-store.md): Đọ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.
- [Phỏng vấn người dùng mà không bị khen xã giao](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-05-interview-without-compliments.md): 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.
- [Tìm Aha moment của người dùng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/02-find-and-validate-ideas/lesson-06-find-the-aha-moment.md): 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.

#### Design the Experience

the main screens and the states a user will hit, enough to start building.

- [Đừng để người dùng phải hỏi: “Giờ mình đi đâu?”](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-01-navigation-with-intent.md) (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.
- [Onboarding đưa người dùng tới Aha moment nhanh nhất](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-02-onboarding-to-aha.md): 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 đó.
- [Khi nào app được phép ngắt nhịp người dùng?](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-03-interruption-with-intent.md): 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.
- [Chuyển động và rung phản hồi có lý do](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-04-motion-builds-trust.md): 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ú ý.
- [Màn hình dọc, ngang và tablet](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-05-design-beyond-one-screen.md): 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.
- [Notification là một lời mời có lý do](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-06-notifications-with-reason.md): 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.
- [Khi người dùng mất mạng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-07-when-users-go-offline.md): 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.
- [Backup, restore và đổi máy](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/03-design-the-experience/lesson-08-backup-restore-new-phone.md): 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.

#### Build and Ship with the Course Stack

a working build on the course stack, far enough along to submit to a store.

- [Stack cho một người: KMP, Supabase, RevenueCat, Firebase](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-01-stack-for-one-person.md): 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.
- [Feature flag và kill-switch: ship trước, bật sau](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-02-feature-flags-kill-switch.md): 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.
- [Event tracking có chủ đích](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-03-measure-the-promise.md): 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.
- [Crash làm mất niềm tin: theo dõi bằng Android vitals và Xcode Organizer](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-04-a-crash-breaks-trust.md): 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.
- [Tính năng AI cần người chịu trách nhiệm](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-05-ai-needs-accountability.md): 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.
- [Beta: closed testing trên Play và TestFlight](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-06-beta-closed-testing-testflight.md): 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.
- [Phát hành theo giai đoạn trên Play và App Store](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/04-build-and-ship/lesson-07-staged-rollout.md): 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.

#### Get on the Store and Be Found

a store listing: the name, the description, the screenshots and the words people already search.

- [ASO cơ bản: tên app, mô tả ngắn, từ khóa](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-01-aso-basics.md): 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.
- [Store listing: icon, screenshot, video](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-02-store-listing-assets.md): 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.
- [Khai báo dữ liệu trên store: Data safety và App Privacy](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-03-store-data-declarations.md): 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.
- [Trẻ em không phải một thị trường bình thường](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-04-children-are-not-normal-market.md): 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ì.
- [Qua vòng review của App Store và Google Play](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-05-pass-store-review.md): 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.
- [Launch cohort đầu tiên: 50 người đúng thay vì 5.000 người ngẫu nhiên](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/05-get-found-on-stores/lesson-06-first-50-right-users.md): 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ọ.

#### Make Money

a way to charge that matches what the user gets, and a way to tell the purchase went through.

- [Các mô hình kiếm tiền: paid, freemium, subscription, IAP, ads](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-01-app-business-models.md): 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.
- [Thiết kế offer trước khi xây feature](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-02-design-offer-before-features.md): 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.
- [Từ offer sang paywall: mời trả tiền đúng khoảnh khắc](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-03-paywall-after-aha.md): Đặ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õ.
- [Định giá là giả thuyết: gói tháng và gói năm](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-04-price-as-hypothesis.md): 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á.
- [Free trial và ưu đãi giới thiệu](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-05-free-trials-intro-offers.md): 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.
- [Một giao dịch phải đáng tin](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-06-a-purchase-must-hold.md): 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.
- [Vòng đời subscription: gia hạn, grace period, hủy, hoàn tiền](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-07-subscription-lifecycle.md): 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.
- [Đọc tín hiệu doanh thu đầu tiên](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-08-read-first-revenue-signals.md): 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.
- [Doanh thu không được phép phá niềm tin](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-09-revenue-never-breaks-trust.md): 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.
- [Phí store, thuế và nhận tiền](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/06-make-money/lesson-10-store-fees-tax-payouts.md): 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.

#### Keep Users Happy

a way to take feedback, fix where users get stuck, and keep the promise the app already made.

- [Xin đánh giá đúng lúc](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-01-ask-for-ratings.md): 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.
- [Trả lời review công khai](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-02-reply-to-reviews.md): 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.
- [Support khi chỉ có một người](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-03-support-as-one-person.md): 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.
- [Vòng phản hồi: thu, phân loại, đóng vòng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-04-feedback-loop.md): 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 ý.
- [Retention: đọc cohort](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-05-read-retention-cohorts.md): Đọ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.
- [Churn của subscription và win-back](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-06-subscription-churn-winback.md): 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.
- [Bản kê dữ liệu và lời hứa với người dùng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-07-user-data-is-not-free.md): 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.
- [Xóa tài khoản và dữ liệu](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/07-keep-users-happy/lesson-08-account-and-data-deletion.md): 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ị.

#### Grow and Keep Going

a steady update rhythm, numbers that show whether users come back, and the next piece of work already chosen.

- [Phát hành bản cập nhật dựa trên bằng chứng](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-01-ship-evidence-based-update.md): 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.
- [Retro theo giả thuyết: giữ, sửa hay bỏ](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-02-hypothesis-retro.md): 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.
- [Build in public: chia sẻ gì, giữ lại gì](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-03-build-in-public.md): 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.
- [Chi phí vận hành của app một người](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-04-running-costs.md): 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.
- [Giữ app sống lâu: SDK, target API, chính sách mới](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-05-keep-the-app-alive.md): 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.
- [Một app sâu hay nhiều app nhỏ](https://dantech.academy/en/courses/kotlin-accelerator/indie-builder/08-grow-and-sustain/lesson-06-one-deep-app-or-many.md): 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.

### Kotlin Engineer

#### Setup App Running

a ready toolchain, the production app building on your machine and running on iOS: first build, first test, first commit.

- [Install Git, JDK 17, Android Studio And The SDK](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-01-install-android-studio-sdk.md) (free): Set up Git, JDK 17 and the Android tooling you need to clone, open and build the course's Kotlin Multiplatform app.
- [Clone The Repo And Open The KMP Project For The First Time](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-02-clone-repo-open-project.md) (free): Open a real production Kotlin Multiplatform project instead of a toy starter project.
- [Service Account Checklist](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-03-service-account-checklist.md) (free): Know which outside accounts you need and why you need each one.
- [Set Up Supabase SQL, Secrets And Firebase](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-04-configure-local-files-secrets.md) (free): Prepare the backend tables, auth configuration and Firebase Android project you need before the app's first serious run.
- [First Build, Test And Commit](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-05-first-build-test-commit.md) (free): Create your first safe checkpoint before moving on to the architecture.
- [Run The App On iOS (macOS + Xcode)](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-06-run-app-on-ios.md) (free): Run the same Kotlin Multiplatform app on the iOS Simulator with Xcode. Optional lesson; needs a Mac with Apple Silicon.

#### Production App Map Architecture

the app read as a system: module graph, startup, feature discovery, navigation and layer boundaries.

- [Read The Module Graph](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-production-app-map/lesson-01-read-module-graph.md) (free): Read a Kotlin Multiplatform project as a system: modules, dependency direction and source sets.
- [Startup Flow On Android And iOS](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-production-app-map/lesson-02-trace-app-startup.md) (free): Understand which points the app passes through from tapping the icon to the first screen, on both Android and iOS.
- [Feature Registration And Navigation Boundaries](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-production-app-map/lesson-03-understand-feature-discovery.md) (free): Understand how the app knows which features exist through an explicit list, and how it navigates between them without coupling them.
- [Layer Responsibilities And How To Read File Names](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-production-app-map/lesson-04-spot-layer-responsibilities.md) (free): Don't mix UI, business logic and backend code. And learn to guess where a file lives from its name alone.
- [Your First Safe Change](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-production-app-map/lesson-05-make-your-first-change.md) (free): Know what is real and what is mocked, then change the codebase yourself without breaking any boundary.

#### Kotlin Multiplatform Foundations

reading a KMP project: source set, expect/actual or interface + DI, an iOS host with Swift interop, and a shared data stack of Ktor, DataStore, settings and Supabase.

- [Anatomy Of A KMP Project](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-shared-kmp-foundations/lesson-01-kmp-project-anatomy.md) (free): 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.
- [Platform Seams: expect/actual Or Interface + DI](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-shared-kmp-foundations/lesson-02-platform-seams-expect-actual-di.md) (free): 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.
- [iOS Host And Swift Interop](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-shared-kmp-foundations/lesson-03-ios-host-swift-interop.md) (free): 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.
- [The Multiplatform Data Stack](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/01-shared-kmp-foundations/lesson-04-kmp-data-stack.md) (free): 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.

#### Compose UI from State

state-driven Compose screens: immutable UI models, sealed actions, recomposition control, reusable components.

- [Design An Immutable UI Model](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-01-design-immutable-ui-models.md): Model a screen with clear, immutable state, then change the state contract yourself.
- [Manage User Intent With Sealed Actions](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-02-model-user-intent-with-sealed-actions.md): Turn UI events into a clear action vocabulary that you can log and extend yourself to see the payoff.
- [Control Recomposition](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-03-control-recomposition-with-stable-state.md): Why the Menu can skip recomposition: stability and strong skipping.
- [Build A Compose Screen From State](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-04-compose-screens-from-state.md): The route owns the wiring, and the content composable only renders state. And why shouldn't a Toast live in state?
- [Reuse The Theme And UI Components](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-05-reuse-theme-and-ui-components.md): Build UI without breaking consistency, then upgrade and update tokens across the whole app yourself.
- [Compose Multiplatform Resources And Localization](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/02-compose-ui-from-state/lesson-06-compose-multiplatform-resources-i18n.md): 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.

#### State Machine and MVVM

reducer-driven MVVM flows: State/Action/Effect/AsyncOp, ViewModel wiring and side-effect handlers.

- [Why Is A Reducer Useful?](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/03-state-machine-mvvm/lesson-01-understand-why-reducers-help.md): Understand when a reducer beats multi-branch UI logic.
- [Design State, Action, Effect And AsyncOp](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/03-state-machine-mvvm/lesson-02-design-state-action-effect-asyncop.md): Learn the app's state-machine vocabulary through the DRE pattern.
- [Read The Game State Machine's Real Reducer](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/03-state-machine-mvvm/lesson-03-read-game-state-machine.md): Read the real reducer from the Game State Machine, following an action to the new state, one-time effects and follow-up work.
- [Wire The ViewModel To The DRE Store](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/03-state-machine-mvvm/lesson-04-wire-viewmodel-with-store.md): Understand the ViewModel's role in the DRE architecture pattern.
- [Keep Side Effects Outside The Reducer](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/03-state-machine-mvvm/lesson-05-keep-side-effects-outside-reducers.md): Keep navigation, analytics, API calls and snackbars outside pure transitions.

#### Clean Architecture and Integration

use cases, repository boundaries, Supabase auth, remote config and subscription paywalls behind clean boundaries.

- [Use Case: The App's Unit Of Business Logic](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/04-clean-architecture-integration/lesson-01-read-domain-use-cases.md): Why a short function deserves its own class.
- [Domain vs Data: Where Does Logic Belong?](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/04-clean-architecture-integration/lesson-02-separate-repository-contracts-and-data-implementations.md): Why does the data side of one feature need 4 files across 2 different modules?
- [The Clean Architecture Of A Sign-In Tap](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/04-clean-architecture-integration/lesson-03-trace-supabase-auth-flow.md): Trace auth from the button tap to the session, then the profile sync.
- [How You Change The AI Provider With 1 Line Of Code](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/04-clean-architecture-integration/lesson-04-swap-ai-provider-with-one-line.md): With the contract in the right place, switching providers is fast, easy to test, and leaves other modules untouched.
- [Composition Root: Where Providers Are Defined](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/04-clean-architecture-integration/lesson-05-wire-dependencies-at-composition-root.md): 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.

#### Testing, Security, and Release

reducer/ViewModel tests, CI for KMP, build-time secrets, shipping the iOS app and a release readiness decision.

- [Test Reducers And Use Cases](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-01-test-reducers-and-use-cases.md): Start testing where it's fastest and most valuable.
- [Test Flows And ViewModels](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-02-test-flows-and-viewmodels.md): Test state emissions without tapping the UI by hand.
- [Shrink And Protect The Android Release Build](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-03-shrink-and-guard-release-build.md): Why the Android release build isn't the build you tested, and what R8 changes in the app.
- [Protect Secrets In The Build (Android + iOS)](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-04-protect-secrets-at-build-time.md): Learn a practical way to handle mobile secrets, on both Android and iOS.
- [CI For KMP](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-06-ci-for-kmp.md): 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.
- [Ship The iOS App](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-07-ship-ios-app.md): From the iOS project in the repo to a build on TestFlight: configuration, app signing, the secrets check, archiving and uploading.
- [Run The Release Readiness Check](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/05-testing-security-release/lesson-05-run-release-readiness-check.md): 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.

#### Clean Architecture in Depth

four layers and the dependency rule: interface-based design for layers and platform seams, repositories, use cases, managers and mapping between layers.

- [Clean Architecture And The 4-Layer Model](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-01-clean-architecture-overview.md) (free): 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.
- [Gradle Multi-Module Structure](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-03-multi-module-structure.md): Gradle Multi-Module Structure in the Mobile Action Pro course.
- [Interface-Based Design](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-04-interface-based-design.md): Interfaces as boundaries between layers and seams between platforms, and how DI binds interfaces to implementations.
- [Repository Pattern](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-05-repository-pattern.md): Repository Pattern in the Mobile Action Pro course.
- [UseCase Pattern](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-06-usecase-pattern.md): UseCase Pattern in the Mobile Action Pro course.
- [Managers For Complex Orchestration](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-07-manager-pattern.md): Managers For Complex Orchestration in the Mobile Action Pro course.
- [Data Flow Patterns](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-08-data-flow-patterns.md): Data Flow Patterns in the Mobile Action Pro course.
- [Mapping Between Layers](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-11-mapping-layers.md): Mapping Between Layers in the Mobile Action Pro course.
- [Best Practices And Anti-Patterns](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/06-clean-architecture/lesson-12-best-practices.md): Best Practices And Anti-Patterns in the Mobile Action Pro course.

#### Dependency Injection with Koin

module DSL, ViewModel scope, dependency resolution, multi-module wiring, explicit feature registration, a DI graph check on both platforms and tests with Koin.

- [DI And Inversion Of Control](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-01-di-basics.md): Constructor injection, Inversion of Control and the startSharedApp composition root on Android and iOS.
- [Koin Overview (Multiplatform)](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-03-koin-overview.md): Koin in a KMP app: artifacts per module, no Koin in :domain, and one appKoinModules graph for two platforms.
- [Koin DSL: module, single, factory](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-04-koin-dsl-basics.md): Koin DSL with module, single and factory in the Mobile Action Pro course.
- [Koin ViewModel Scope](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-05-koin-viewmodel-scope.md): Koin ViewModel Scope in the Mobile Action Pro course.
- [Dependency Resolution With get()](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-06-dependency-resolution.md): Dependency Resolution with get() in the Mobile Action Pro course.
- [Koin In Multi-Module: appKoinModules And The Core Module](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-07-multi-module-architecture.md): Each Gradle module keeps its own Koin module, appKoinModules assembles the shared part, and QzDispatchers and ScopeQualifier live in foundation modules.
- [Feature Module Pattern](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-09-feature-module-pattern.md): Feature Module Pattern in the Mobile Action Pro course.
- [Explicit Feature Registration](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-10-explicit-feature-registration.md): 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.
- [ViewModel Injection In Routes](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-11-viewmodel-injection-routes.md): ViewModel Injection in Routes in the Mobile Action Pro course.
- [Testing With Koin](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/07-dependency-injection/lesson-12-testing-with-koin.md): Tests that don't need Koin, startKoin/stopKoin hygiene, and AppGraphTest building the whole graph on Android and iOS.

#### Capstone: Migrating an Android App to KMP

the order for migrating an Android app to KMP: commonMain first, platform seams, DataStore keeping the same path, one DI list and a test gate per target.

- [Migrating An Android App To KMP](https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/08-capstone-kmp-migration/lesson-01-migrate-android-app-to-kmp.md): 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.
