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)