
Lightweight, customizable toast-style notifications with timed, persistent, dismissible and clickable behaviors, swipe gestures, animated transitions, and flexible visual customization via slots and host config.
Lightweight, customizable toast-style notifications for Compose Multiplatform.
Koasty gives Compose Multiplatform applications a shared notification API across Android, iOS, desktop, and web. Show a short message from common code, let Koasty handle its lifetime and dismissal, and customize the visuals when your product needs a distinct style.
[!NOTE] Koasty is in early development. The API may change before the first stable release. Feedback, bug reports, and contributions are welcome.
| Platform | Target |
|---|---|
| Android | android |
| iOS devices | iosArm64 |
| iOS Simulator on Apple Silicon | iosSimulatorArm64 |
| Desktop | jvm |
| Web |
js and wasmJs
|
Koasty is configured for publication under:
commonMain.dependencies {
implementation("io.github.deference3:koasty:0.0.1")
}If that version has not yet been published to Maven Central, include this repository as a project dependency while developing locally:
// settings.gradle.kts
include(":koasty")// Your Compose Multiplatform module
kotlin {
sourceSets {
commonMain.dependencies {
implementation(project(":koasty"))
}
}
}Create and remember one KoastManager, then place KoastyProvider around your application content. The provider renders notifications above its content.
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.deference.koasty.KoastManager
import com.deference.koasty.KoastyProvider
@Composable
fun App() {
val koastManager = remember { KoastManager() }
KoastyProvider(koastManager = koastManager) {
Button(
onClick = {
koastManager.show(
title = "Saved",
message = "Your changes are ready."
)
}
) {
Text("Show koast")
}
}
}The manager exposes focused methods for common notification behavior:
// Disappears automatically after 3.5 seconds by default.
koastManager.show("Uploaded", "Your image is now available.")
// Custom duration.
koastManager.show(
title = "Connected",
duration = 5.seconds //accepts kotlin Duration
)
// Remains until swiped away or dismissed in code.
koastManager.showUntilDismissed(
title = "You're offline",
message = "Some features may be unavailable."
)
// Can only be dismissed in code.
koastManager.showPersistent(
title = "Uploading",
message = "Please keep the app open."
)
koastManager.dismiss()Clickable notifications are supported as well:
koastManager.showClickable(
title = "Update available",
message = "Tap to view the release notes.",
onClick = { openReleaseNotes() }
)Use KoastyHostConfig to adapt the default notification to your design system:
KoastyProvider(
koastManager = koastManager,
config = KoastyHostConfig(
containerColor = MaterialTheme.colorScheme.inverseSurface,
contentColor = MaterialTheme.colorScheme.inverseOnSurface,
shape = RoundedCornerShape(16.dp),
shadowElevation = 12.dp,
horizontalSwipeEnabled = true,
swipeUpEnabled = true
)
) {
AppContent()
}You can also provide leading content while retaining Koasty's standard layout and behavior:
KoastyProvider(
koastManager = koastManager,
leadingContent = { koast ->
Text(text = "●")
}
) {
AppContent()
}For complete visual control, pass koastContent and render the current KoastRequest yourself.
Clone the repository and use the included Gradle wrapper:
# Android
./gradlew :androidApp:assembleDebug
# Desktop
./gradlew :desktopApp:run
# Web (Wasm)
./gradlew :webApp:wasmJsBrowserDevelopmentRun
# Web (JavaScript)
./gradlew :webApp:jsBrowserDevelopmentRunFor iOS, open iosApp/iosApp.xcodeproj in Xcode and run the application from there.
On Windows, replace ./gradlew with gradlew.bat.
./gradlew :koasty:buildNative Apple binaries must be built on macOS.
koasty/ Compose Multiplatform library
shared/ Shared UI for the sample applications
androidApp/ Android sample entry point
desktopApp/ Desktop sample entry point
webApp/ JavaScript and Wasm sample entry points
iosApp/ iOS sample entry point
Contributions of all sizes are welcome.
main.For larger API or behavior changes, open an issue first so the design can be discussed before implementation.
Koasty is distributed under the Apache License 2.0. See the repository license for details.
Built with 💖 for Kotlin Multiplatform / Compose Multiplatform .
Lightweight, customizable toast-style notifications for Compose Multiplatform.
Koasty gives Compose Multiplatform applications a shared notification API across Android, iOS, desktop, and web. Show a short message from common code, let Koasty handle its lifetime and dismissal, and customize the visuals when your product needs a distinct style.
[!NOTE] Koasty is in early development. The API may change before the first stable release. Feedback, bug reports, and contributions are welcome.
| Platform | Target |
|---|---|
| Android | android |
| iOS devices | iosArm64 |
| iOS Simulator on Apple Silicon | iosSimulatorArm64 |
| Desktop | jvm |
| Web |
js and wasmJs
|
Koasty is configured for publication under:
commonMain.dependencies {
implementation("io.github.deference3:koasty:0.0.1")
}If that version has not yet been published to Maven Central, include this repository as a project dependency while developing locally:
// settings.gradle.kts
include(":koasty")// Your Compose Multiplatform module
kotlin {
sourceSets {
commonMain.dependencies {
implementation(project(":koasty"))
}
}
}Create and remember one KoastManager, then place KoastyProvider around your application content. The provider renders notifications above its content.
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.deference.koasty.KoastManager
import com.deference.koasty.KoastyProvider
@Composable
fun App() {
val koastManager = remember { KoastManager() }
KoastyProvider(koastManager = koastManager) {
Button(
onClick = {
koastManager.show(
title = "Saved",
message = "Your changes are ready."
)
}
) {
Text("Show koast")
}
}
}The manager exposes focused methods for common notification behavior:
// Disappears automatically after 3.5 seconds by default.
koastManager.show("Uploaded", "Your image is now available.")
// Custom duration.
koastManager.show(
title = "Connected",
duration = 5.seconds //accepts kotlin Duration
)
// Remains until swiped away or dismissed in code.
koastManager.showUntilDismissed(
title = "You're offline",
message = "Some features may be unavailable."
)
// Can only be dismissed in code.
koastManager.showPersistent(
title = "Uploading",
message = "Please keep the app open."
)
koastManager.dismiss()Clickable notifications are supported as well:
koastManager.showClickable(
title = "Update available",
message = "Tap to view the release notes.",
onClick = { openReleaseNotes() }
)Use KoastyHostConfig to adapt the default notification to your design system:
KoastyProvider(
koastManager = koastManager,
config = KoastyHostConfig(
containerColor = MaterialTheme.colorScheme.inverseSurface,
contentColor = MaterialTheme.colorScheme.inverseOnSurface,
shape = RoundedCornerShape(16.dp),
shadowElevation = 12.dp,
horizontalSwipeEnabled = true,
swipeUpEnabled = true
)
) {
AppContent()
}You can also provide leading content while retaining Koasty's standard layout and behavior:
KoastyProvider(
koastManager = koastManager,
leadingContent = { koast ->
Text(text = "●")
}
) {
AppContent()
}For complete visual control, pass koastContent and render the current KoastRequest yourself.
Clone the repository and use the included Gradle wrapper:
# Android
./gradlew :androidApp:assembleDebug
# Desktop
./gradlew :desktopApp:run
# Web (Wasm)
./gradlew :webApp:wasmJsBrowserDevelopmentRun
# Web (JavaScript)
./gradlew :webApp:jsBrowserDevelopmentRunFor iOS, open iosApp/iosApp.xcodeproj in Xcode and run the application from there.
On Windows, replace ./gradlew with gradlew.bat.
./gradlew :koasty:buildNative Apple binaries must be built on macOS.
koasty/ Compose Multiplatform library
shared/ Shared UI for the sample applications
androidApp/ Android sample entry point
desktopApp/ Desktop sample entry point
webApp/ JavaScript and Wasm sample entry points
iosApp/ iOS sample entry point
Contributions of all sizes are welcome.
main.For larger API or behavior changes, open an issue first so the design can be discussed before implementation.
Koasty is distributed under the Apache License 2.0. See the repository license for details.
Built with 💖 for Kotlin Multiplatform / Compose Multiplatform .