Hau is a Kotlin Multiplatform UI toolkit for building elegant, responsive, and customizable chat applications.
It demonstrates how to architect cross‑platform UIs using Compose Multiplatform, with clean MVVM patterns, mock data, and live previews.
-
🎨 Themes & Color Schemes
Light, Dark, and custom accent themes with easy extension for brand‑specific styling. -
💬 Chat Detail Screens
Dialog‑based message bubbles (pill‑shaped, frosted, rounded).
Support for text, emoji, and media messages. -
🧠 State Handling with ViewModels
MVVM architecture using Kotlin coroutines and Flow.
Reactive UI updates and previewable states. -
📂 Repositories with Mock Data
Prebuilt mock datasets for testing and demos.
Easily swappable with real backend (Firebase, REST, GraphQL). -
🧭 Navigation System
Type‑safe sealed routes with@Serializable.
Bottom navigation bar with frosted glass effect.
Nested navigation: ChatList → ChatDetail → Settings → Sub‑screens.
Hau/
├── composeApp/
│ ├── src/
│ │ ├── commonMain/ # Shared UI and logic
│ │ ├── androidMain/ # Android-specific code
│ │ ├── jsMain/ # JS target for web
│ │ ├── jvmMain/ # Desktop target
│ │ ├── wasmJsMain/ # WebAssembly target
│ │ └── webMain/ # Web-specific overrides
│ └── build/ # Compiled artifacts
├── gradle/
│ ├── wrapper/
│ └── libs.versions.toml
├── .idea/ .gradle/ .kotlin/ # IDE and build configs
├── README.md
├── build.gradle.kts
├── settings.gradle.kts
└── local.properties
Hau defines all navigation destinations as a sealed interface NavDestinaton with @Serializable routes. This ensures type safety and easy deep‑linking.
@Serializable
sealed interface NavDestinaton { val routePattern: String }
@Serializable data object CHAT : NavDestinaton { override val routePattern = "CHAT" }
@Serializable data class DETAIL(val chatId: String) : NavDestinaton { override val routePattern = "DETAIL" }
@Serializable data object SETTINGS : NavDestinaton { override val routePattern = "SETTINGS" }val bottomNavItems = listOf(
BottomNavItem(Icons.Outlined.Forum, Icons.Default.Forum, Routes.CHAT),
BottomNavItem(Icons.Outlined.Stream, Icons.Filled.Stream, Routes.MEMORIES),
BottomNavItem(Icons.Outlined.Call, Icons.Filled.Call, Routes.CALLS),
BottomNavItem(Icons.Outlined.Settings, Icons.Filled.Settings, Routes.SETTINGS)
)CHAT→ Chat list with click to detailDETAIL(chatId)→ Specific chat detailCHANNEL_DETAIL(channelId)→ Group/channel detailMEMORIES→ Memory channelsCALLS→ Call historySETTINGS→ Settings root- Sub‑settings: Privacy, Messaging, Notifications, Storage, Language, Help, Invite, Passkeys, Email, Delete Account, Request Info, Avatar, Account
VIDEO_CALL,AUDIO_CALL,SCHEDULE_CALL→ Call flows
- IntelliJ IDEA or Android Studio
- Kotlin Multiplatform plugin
- JDK 17+
./gradlew :composeApp:assembleDebug./gradlew :composeApp:run./gradlew :composeApp:wasmJsBrowserDevelopmentRun./gradlew :composeApp:jsBrowserDevelopmentRunval viewModel = ChatViewModel(repository = MockChatRepository())
ChatDetailScreen(
viewModel = viewModel,
theme = HauTheme.Dark
)We welcome contributions from the community!
To get started:
- Fork the repository
- Create a feature branch
- Submit a pull request
Check out our issue templates and contribution guide.
MIT License © 2026 Mugumya Ali
- Kotlin Multiplatform Docs (kotlinlang.org in Bing) (bing.com in Bing)
- Jetpack Compose Multiplatform (jetbrains.com in Bing) (bing.com in Bing)
- Hau GitHub Repository
.png?alt=media&token=e4c4ca08-37f0-4dd3-8a9b-ea9f91cbd734)
.png?alt=media&token=5c226a5f-af93-4533-bb81-62aa3723c6f3)
.png?alt=media&token=fb83872b-a613-4ca8-9878-a46b4ba9cb1a)
.png?alt=media&token=4521fe09-b97f-40b9-9e11-fddf6e3f39e4)
.png?alt=media&token=a8ca5e5c-89c4-41c2-805b-a34ea474bf57)
.png?alt=media&token=0da5fc98-667c-47af-a52e-ec9446dc7621)
.png?alt=media&token=b9478e33-a7fa-4e41-809d-7926013a670a)
.png?alt=media&token=bed64675-b604-41bf-9e9b-d5835d65d6bd)
.png?alt=media&token=b2baf796-b20b-4417-9270-ec2020ae5f04)