diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts
new file mode 100644
index 0000000..a0e3907
--- /dev/null
+++ b/feature/auth/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.auth"
+}
diff --git a/feature/auth/src/main/AndroidManifest.xml b/feature/auth/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/auth/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthScreen.kt b/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthScreen.kt
new file mode 100644
index 0000000..f4e5b5f
--- /dev/null
+++ b/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.auth
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val AUTH_ROUTE = "auth"
+
+@Composable
+fun AuthScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Auth")
+ }
+}
diff --git a/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthViewModel.kt b/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthViewModel.kt
new file mode 100644
index 0000000..a229a6a
--- /dev/null
+++ b/feature/auth/src/main/kotlin/com/mingyuan/android_client/feature/auth/AuthViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.auth
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class AuthViewModel @Inject constructor() : ViewModel()
diff --git a/feature/checkin/build.gradle.kts b/feature/checkin/build.gradle.kts
new file mode 100644
index 0000000..6a4620a
--- /dev/null
+++ b/feature/checkin/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.checkin"
+}
diff --git a/feature/checkin/src/main/AndroidManifest.xml b/feature/checkin/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/checkin/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinScreen.kt b/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinScreen.kt
new file mode 100644
index 0000000..43e26b7
--- /dev/null
+++ b/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.checkin
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val CHECKIN_ROUTE = "checkin"
+
+@Composable
+fun CheckinScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Check-in")
+ }
+}
diff --git a/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinViewModel.kt b/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinViewModel.kt
new file mode 100644
index 0000000..ec6ab51
--- /dev/null
+++ b/feature/checkin/src/main/kotlin/com/mingyuan/android_client/feature/checkin/CheckinViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.checkin
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class CheckinViewModel @Inject constructor() : ViewModel()
diff --git a/feature/course/build.gradle.kts b/feature/course/build.gradle.kts
new file mode 100644
index 0000000..0e53b29
--- /dev/null
+++ b/feature/course/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.course"
+}
diff --git a/feature/course/src/main/AndroidManifest.xml b/feature/course/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/course/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseScreen.kt b/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseScreen.kt
new file mode 100644
index 0000000..3b99c88
--- /dev/null
+++ b/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.course
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val COURSE_ROUTE = "course"
+
+@Composable
+fun CourseScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Course")
+ }
+}
diff --git a/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseViewModel.kt b/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseViewModel.kt
new file mode 100644
index 0000000..e3f3a98
--- /dev/null
+++ b/feature/course/src/main/kotlin/com/mingyuan/android_client/feature/course/CourseViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.course
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class CourseViewModel @Inject constructor() : ViewModel()
diff --git a/feature/feedback/build.gradle.kts b/feature/feedback/build.gradle.kts
new file mode 100644
index 0000000..ab0baab
--- /dev/null
+++ b/feature/feedback/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.feedback"
+}
diff --git a/feature/feedback/src/main/AndroidManifest.xml b/feature/feedback/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/feedback/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackScreen.kt b/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackScreen.kt
new file mode 100644
index 0000000..1360896
--- /dev/null
+++ b/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.feedback
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val FEEDBACK_ROUTE = "feedback"
+
+@Composable
+fun FeedbackScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Feedback")
+ }
+}
diff --git a/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackViewModel.kt b/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackViewModel.kt
new file mode 100644
index 0000000..23f3fd0
--- /dev/null
+++ b/feature/feedback/src/main/kotlin/com/mingyuan/android_client/feature/feedback/FeedbackViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.feedback
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class FeedbackViewModel @Inject constructor() : ViewModel()
diff --git a/feature/plan/build.gradle.kts b/feature/plan/build.gradle.kts
new file mode 100644
index 0000000..7d8af3c
--- /dev/null
+++ b/feature/plan/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.plan"
+}
diff --git a/feature/plan/src/main/AndroidManifest.xml b/feature/plan/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/plan/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanScreen.kt b/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanScreen.kt
new file mode 100644
index 0000000..e1e92cf
--- /dev/null
+++ b/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.plan
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val PLAN_ROUTE = "plan"
+
+@Composable
+fun PlanScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Plan")
+ }
+}
diff --git a/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanViewModel.kt b/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanViewModel.kt
new file mode 100644
index 0000000..5a6ad24
--- /dev/null
+++ b/feature/plan/src/main/kotlin/com/mingyuan/android_client/feature/plan/PlanViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.plan
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class PlanViewModel @Inject constructor() : ViewModel()
diff --git a/feature/profile/build.gradle.kts b/feature/profile/build.gradle.kts
new file mode 100644
index 0000000..d1123e0
--- /dev/null
+++ b/feature/profile/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.profile"
+}
diff --git a/feature/profile/src/main/AndroidManifest.xml b/feature/profile/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/profile/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileScreen.kt b/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileScreen.kt
new file mode 100644
index 0000000..262ffb0
--- /dev/null
+++ b/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.profile
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val PROFILE_ROUTE = "profile"
+
+@Composable
+fun ProfileScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Profile")
+ }
+}
diff --git a/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileViewModel.kt b/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileViewModel.kt
new file mode 100644
index 0000000..a755662
--- /dev/null
+++ b/feature/profile/src/main/kotlin/com/mingyuan/android_client/feature/profile/ProfileViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.profile
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class ProfileViewModel @Inject constructor() : ViewModel()
diff --git a/feature/survey/build.gradle.kts b/feature/survey/build.gradle.kts
new file mode 100644
index 0000000..f4e21f8
--- /dev/null
+++ b/feature/survey/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ alias(libs.plugins.mcl.android.feature)
+}
+
+android {
+ namespace = "com.mingyuan.android_client.feature.survey"
+}
diff --git a/feature/survey/src/main/AndroidManifest.xml b/feature/survey/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8072ee0
--- /dev/null
+++ b/feature/survey/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyScreen.kt b/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyScreen.kt
new file mode 100644
index 0000000..4985db6
--- /dev/null
+++ b/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyScreen.kt
@@ -0,0 +1,18 @@
+package com.mingyuan.android_client.feature.survey
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+
+/** Navigation route for this feature, referenced by the app-level NavHost. */
+const val SURVEY_ROUTE = "survey"
+
+@Composable
+fun SurveyScreen(modifier: Modifier = Modifier) {
+ Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+ Text(text = "Survey")
+ }
+}
diff --git a/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyViewModel.kt b/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyViewModel.kt
new file mode 100644
index 0000000..78f4333
--- /dev/null
+++ b/feature/survey/src/main/kotlin/com/mingyuan/android_client/feature/survey/SurveyViewModel.kt
@@ -0,0 +1,8 @@
+package com.mingyuan.android_client.feature.survey
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class SurveyViewModel @Inject constructor() : ViewModel()