https://github.com/danielpassos/unveil
Unveil is a developer panel for Kotlin Multiplatform apps. Swipe right to left, and see everything your app is doing under the hood
https://github.com/danielpassos/unveil
cmp compose compose-multiplatform debug devtools kmp
Last synced: 20 days ago
JSON representation
Unveil is a developer panel for Kotlin Multiplatform apps. Swipe right to left, and see everything your app is doing under the hood
- Host: GitHub
- URL: https://github.com/danielpassos/unveil
- Owner: danielpassos
- License: apache-2.0
- Created: 2026-03-24T23:49:08.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-03-27T22:04:57.000Z (about 1 month ago)
- Last Synced: 2026-03-28T04:11:35.726Z (about 1 month ago)
- Topics: cmp, compose, compose-multiplatform, debug, devtools, kmp
- Language: Kotlin
- Homepage:
- Size: 369 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README

> *The hidden side of your app, one swipe away.*
[](https://github.com/danielpassos/unveil/actions/workflows/gradle.yml)
[](https://search.maven.org/search?q=g:me.passos.libs.unveil)
[](https://kotlinlang.org/multiplatform/)
[](https://kotlinlang.org/compose-multiplatform/)
[](https://opensource.org/licenses/Apache-2.0)
---
## Why Unveil
Every app has two faces.
The one your users see β polished, intentional, pixel-perfect.
And the one underneath β network calls, logs, flags, navigation, state.
That second face is where bugs live.
That second face is what QA sees.
That second face is what you debug every day.
**Unveil makes it visible.**
A single swipe.
Everything is there.
And when you're done β it's gone.
---
## β¨ What You Get
- π₯ Trigger crashes on demand
- π± Device and environment info
- π Stream and filter logs
- π§ Visualize navigation state
- π Inspect network requests in real time
All inside your app.
No external tools. No rebuilds.
---
## β‘ Quick Start
```kotlin
Unveil.configure {
register(NetworkPlugin(...))
register(LogPlugin(...))
}
if (BuildConfig.DEBUG) Unveil.enable()
@Composable
fun App() {
UnveilHost(enabled = Unveil.isEnabled) {
AppNavHost()
}
}
```
Thatβs it.
---
## π§© Plugin System
Unveil is not a tool.
Itβs a **platform for tools**.
Everything is a plugin.
```kotlin
Unveil.configure {
register(NetworkPlugin(...))
register(LogPlugin(...))
}
```
And when you need flexibility:
```kotlin
Unveil.register(SomePlugin())
```
No coupling. No assumptions. Just composition.
---
## π Architecture
- **Zero impact on your app**
`UnveilHost` wraps your UI. Nothing else changes.
- **Zero overhead when disabled**
No UI. No gestures. No background work.
- **Zero dependency on your stack**
No Material. No DI. No navigation library.
- **Fully modular**
Core knows nothing about features.
---
## π¦ Installation
Unveil is modular.
Start with the core, then add only the plugins you need.
---
### Core
```toml
[versions]
unveil = "current_version"
[libraries]
unveil-core = { module = "me.passos.libs.unveil:unveil-core", version.ref = "unveil" }
```
```kotlin
commonMain.dependencies {
implementation(libs.unveil.core)
}
```
---
### Add plugins
Pick the features you need:
```toml
unveil-crash = { module = "me.passos.libs.unveil:unveil-crash", version.ref = "unveil" }
unveil-deviceinfo = { module = "me.passos.libs.unveil:unveil-deviceinfo", version.ref = "unveil" }
unveil-logs = { module = "me.passos.libs.unveil:unveil-logs", version.ref = "unveil" }
unveil-navigation = { module = "me.passos.libs.unveil:unveil-navigation", version.ref = "unveil" }
unveil-network = { module = "me.passos.libs.unveil:unveil-network", version.ref = "unveil" }
```
```kotlin
commonMain.dependencies {
implementation(libs.unveil.logs)
implementation(libs.unveil.network)
}
```
---
### Add adapters
Adapters connect Unveil to your stack:
```toml
unveil-logs-kermit = { module = "me.passos.libs.unveil:unveil-logs-kermit", version.ref = "unveil" }
unveil-network-ktor = { module = "me.passos.libs.unveil:unveil-network-ktor", version.ref = "unveil" }
unveil-navigation-compose = { module = "me.passos.libs.unveil:unveil-navigation-compose", version.ref = "unveil" }
```
---
### Full setup (copy & paste)
Want everything?
```toml
unveil-core = { module = "me.passos.libs.unveil:unveil-core", version.ref = "unveil" }
unveil-crash = { module = "me.passos.libs.unveil:unveil-crash", version.ref = "unveil" }
unveil-deviceinfo = { module = "me.passos.libs.unveil:unveil-deviceinfo", version.ref = "unveil" }
unveil-logs = { module = "me.passos.libs.unveil:unveil-logs", version.ref = "unveil" }
unveil-logs-kermit = { module = "me.passos.libs.unveil:unveil-logs-kermit", version.ref = "unveil" }
unveil-navigation = { module = "me.passos.libs.unveil:unveil-navigation", version.ref = "unveil" }
unveil-navigation-compose = { module = "me.passos.libs.unveil:unveil-navigation-compose", version.ref = "unveil" }
unveil-network = { module = "me.passos.libs.unveil:unveil-network", version.ref = "unveil" }
unveil-network-ktor = { module = "me.passos.libs.unveil:unveil-network-ktor", version.ref = "unveil" }
```
---
### Available modules
| Category | Modules |
|------------|--------------------------------------------------|
| Core | `unveil-core` |
| Crash | `unveil-crash` |
| Device | `unveil-deviceinfo` |
| Logs | `unveil-logs`, `unveil-logs-kermit` |
| Navigation | `unveil-navigation`, `unveil-navigation-compose` |
| Network | `unveil-network`, `unveil-network-ktor` |
---
### Requirements
`unveil-core` requires:
- `compose.ui`
- `compose.animation`
- `compose.material3`
- `androidx.activity:activity-compose` (Android only)
---
## π§ͺ Example Plugin
```kotlin
class MyPlugin : UnveilPlugin {
override val id = "my_plugin"
override val title = "My Plugin"
override val icon = UnveilIcon.Emoji("π§")
@Composable
override fun Content(scope: UnveilPanelScope) {
// Build anything you want
}
}
```
---
## π Adapters
Unveil is stack-agnostic.
Each integration point is defined as an interface.
You can use a built-in adapter or provide your own implementation.
### Built-in adapters
| Integration | Interface | Adapter |
|-------------|----------------------|------------------------------|
| Logs | `LogSink` | Kermit |
| Network | `NetworkInterceptor` | Ktor |
| Navigation | `NavigationObserver` | Compose Navigation |
Using OkHttp? Timber? Voyager?
Implement the interface β itβs a handful of methods.
---
## π± Platforms
| Platform | Support |
|---------|----|
| Android | β
|
| iOS | β
|
| Desktop | π² |
---
## π§ Philosophy
Unveil is not a debug panel.
Itβs **observability inside your UI**.
---
## π License
Apache 2.0