{"id":48457604,"url":"https://github.com/danielpassos/unveil","last_synced_at":"2026-04-07T00:02:06.527Z","repository":{"id":347428141,"uuid":"1191115657","full_name":"danielpassos/unveil","owner":"danielpassos","description":"Unveil is a developer panel for Kotlin Multiplatform apps. Swipe right to left, and see everything your app is doing under the hood","archived":false,"fork":false,"pushed_at":"2026-03-27T22:04:57.000Z","size":378,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T04:11:35.726Z","etag":null,"topics":["cmp","compose","compose-multiplatform","debug","devtools","kmp"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielpassos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-24T23:49:08.000Z","updated_at":"2026-03-27T22:01:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/danielpassos/unveil","commit_stats":null,"previous_names":["danielpassos/unveil"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/danielpassos/unveil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpassos%2Funveil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpassos%2Funveil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpassos%2Funveil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpassos%2Funveil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielpassos","download_url":"https://codeload.github.com/danielpassos/unveil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpassos%2Funveil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31494177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmp","compose","compose-multiplatform","debug","devtools","kmp"],"created_at":"2026-04-07T00:01:59.610Z","updated_at":"2026-04-07T00:02:06.518Z","avatar_url":"https://github.com/danielpassos.png","language":"Kotlin","readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo_dark.svg\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"Unveil\" width=\"420\"\u003e\n\u003c/picture\u003e\n\n\u003cbr/\u003e\n\n\u003e *The hidden side of your app, one swipe away.*\n\n\u003cbr/\u003e\n\n[![Build](https://img.shields.io/github/actions/workflow/status/danielpassos/unveil/gradle.yml)](https://github.com/danielpassos/unveil/actions/workflows/gradle.yml)\n[![Maven Central](https://img.shields.io/maven-central/v/me.passos.libs.unveil/unveil-core)](https://search.maven.org/search?q=g:me.passos.libs.unveil)\n[![KMP](https://img.shields.io/badge/Kotlin-Multiplatform-blue.svg)](https://kotlinlang.org/multiplatform/)\n[![Compose](https://img.shields.io/badge/Compose-Multiplatform-green.svg)](https://kotlinlang.org/compose-multiplatform/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n\u003c/div\u003e\n\n---\n\n## Why Unveil\n\nEvery app has two faces.\n\nThe one your users see — polished, intentional, pixel-perfect.\nAnd the one underneath — network calls, logs, flags, navigation, state.\n\nThat second face is where bugs live.\nThat second face is what QA sees.\nThat second face is what you debug every day.\n\n**Unveil makes it visible.**\n\nA single swipe.\nEverything is there.\n\nAnd when you're done — it's gone.\n\n---\n\n## ✨ What You Get\n\n- 💥 Trigger crashes on demand\n- 📱 Device and environment info\n- 📋 Stream and filter logs\n- 🧭 Visualize navigation state\n- 🌐 Inspect network requests in real time\n\nAll inside your app.\nNo external tools. No rebuilds.\n\n---\n\n## ⚡ Quick Start\n\n```kotlin\nUnveil.configure {\n    register(NetworkPlugin(...))\n    register(LogPlugin(...))\n}\n\nif (BuildConfig.DEBUG) Unveil.enable()\n\n@Composable\nfun App() {\n    UnveilHost(enabled = Unveil.isEnabled) {\n        AppNavHost()\n    }\n}\n```\n\nThat’s it.\n\n---\n\n## 🧩 Plugin System\n\nUnveil is not a tool.\n\nIt’s a **platform for tools**.\n\nEverything is a plugin.\n\n```kotlin\nUnveil.configure {\n    register(NetworkPlugin(...))\n    register(LogPlugin(...))\n}\n```\n\nAnd when you need flexibility:\n\n```kotlin\nUnveil.register(SomePlugin())\n```\n\nNo coupling. No assumptions. Just composition.\n\n---\n\n## 🏗 Architecture\n\n- **Zero impact on your app**\n  `UnveilHost` wraps your UI. Nothing else changes.\n\n- **Zero overhead when disabled**\n  No UI. No gestures. No background work.\n\n- **Zero dependency on your stack**\n  No Material. No DI. No navigation library.\n\n- **Fully modular**\n  Core knows nothing about features.\n\n---\n\n## 📦 Installation\n\nUnveil is modular.\n\nStart with the core, then add only the plugins you need.\n\n---\n\n### Core\n\n```toml\n[versions]\nunveil = \"current_version\"\n\n[libraries]\nunveil-core = { module = \"me.passos.libs.unveil:unveil-core\", version.ref = \"unveil\" }\n```\n\n```kotlin\ncommonMain.dependencies {\n    implementation(libs.unveil.core)\n}\n```\n\n---\n\n### Add plugins\n\nPick the features you need:\n\n```toml\nunveil-crash  = { module = \"me.passos.libs.unveil:unveil-crash\", version.ref = \"unveil\" }\nunveil-deviceinfo = { module = \"me.passos.libs.unveil:unveil-deviceinfo\", version.ref = \"unveil\" }\nunveil-logs = { module = \"me.passos.libs.unveil:unveil-logs\", version.ref = \"unveil\" }\nunveil-navigation = { module = \"me.passos.libs.unveil:unveil-navigation\", version.ref = \"unveil\" }\nunveil-network = { module = \"me.passos.libs.unveil:unveil-network\", version.ref = \"unveil\" }\n```\n\n```kotlin\ncommonMain.dependencies {\n    implementation(libs.unveil.logs)\n    implementation(libs.unveil.network)\n}\n```\n\n---\n\n### Add adapters\n\nAdapters connect Unveil to your stack:\n\n```toml\nunveil-logs-kermit = { module = \"me.passos.libs.unveil:unveil-logs-kermit\", version.ref = \"unveil\" }\nunveil-network-ktor = { module = \"me.passos.libs.unveil:unveil-network-ktor\", version.ref = \"unveil\" }\nunveil-navigation-compose  = { module = \"me.passos.libs.unveil:unveil-navigation-compose\", version.ref = \"unveil\" }\n```\n\n---\n\n### Full setup (copy \u0026 paste)\n\nWant everything?\n\n```toml\nunveil-core = { module = \"me.passos.libs.unveil:unveil-core\", version.ref = \"unveil\" }\n\nunveil-crash = { module = \"me.passos.libs.unveil:unveil-crash\", version.ref = \"unveil\" }\nunveil-deviceinfo = { module = \"me.passos.libs.unveil:unveil-deviceinfo\", version.ref = \"unveil\" }\n\nunveil-logs = { module = \"me.passos.libs.unveil:unveil-logs\", version.ref = \"unveil\" }\nunveil-logs-kermit = { module = \"me.passos.libs.unveil:unveil-logs-kermit\", version.ref = \"unveil\" }\n\nunveil-navigation = { module = \"me.passos.libs.unveil:unveil-navigation\", version.ref = \"unveil\" }\nunveil-navigation-compose = { module = \"me.passos.libs.unveil:unveil-navigation-compose\", version.ref = \"unveil\" }\n\nunveil-network = { module = \"me.passos.libs.unveil:unveil-network\", version.ref = \"unveil\" }\nunveil-network-ktor = { module = \"me.passos.libs.unveil:unveil-network-ktor\", version.ref = \"unveil\" }\n```\n\n---\n\n### Available modules\n\n| Category   | Modules                                          |\n|------------|--------------------------------------------------|\n| Core       | `unveil-core`                                    |\n| Crash      | `unveil-crash`                                   |\n| Device     | `unveil-deviceinfo`                              |\n| Logs       | `unveil-logs`, `unveil-logs-kermit`              |\n| Navigation | `unveil-navigation`, `unveil-navigation-compose` |\n| Network    | `unveil-network`, `unveil-network-ktor`          |\n\n---\n\n### Requirements\n\n`unveil-core` requires:\n\n- `compose.ui`\n- `compose.animation`\n- `compose.material3`\n- `androidx.activity:activity-compose` (Android only)\n\n---\n\n## 🧪 Example Plugin\n\n```kotlin\nclass MyPlugin : UnveilPlugin {\n    override val id = \"my_plugin\"\n    override val title = \"My Plugin\"\n    override val icon = UnveilIcon.Emoji(\"🔧\")\n\n    @Composable\n    override fun Content(scope: UnveilPanelScope) {\n        // Build anything you want\n    }\n}\n```\n\n---\n\n## 🔌 Adapters\n\nUnveil is stack-agnostic.\n\nEach integration point is defined as an interface.\nYou can use a built-in adapter or provide your own implementation.\n\n### Built-in adapters\n\n| Integration | Interface            | Adapter                      |\n|-------------|----------------------|------------------------------|\n| Logs        | `LogSink`            | Kermit                       |\n| Network     | `NetworkInterceptor` | Ktor                         |\n| Navigation  | `NavigationObserver` | Compose Navigation           |\n\nUsing OkHttp? Timber? Voyager?\nImplement the interface — it’s a handful of methods.\n\n---\n\n## 📱 Platforms\n\n| Platform | Support |\n|---------|----|\n| Android | ✅  |\n| iOS     | ✅  |\n| Desktop | 🔲 |\n\n---\n\n## 🧠 Philosophy\n\nUnveil is not a debug panel.\n\nIt’s **observability inside your UI**.\n\n---\n\n## 📄 License\n\nApache 2.0\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpassos%2Funveil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielpassos%2Funveil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpassos%2Funveil/lists"}