{"id":50744143,"url":"https://github.com/abdo-essam/aelog","last_synced_at":"2026-06-10T19:01:20.270Z","repository":{"id":350524984,"uuid":"1207078104","full_name":"abdo-essam/AELog","owner":"abdo-essam","description":"AELog is an in-app debugging overlay for Kotlin Multiplatform — inspect logs, network traffic, and analytics events without leaving your app","archived":false,"fork":false,"pushed_at":"2026-06-08T22:37:49.000Z","size":4670,"stargazers_count":1,"open_issues_count":9,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T00:20:34.833Z","etag":null,"topics":["android","android-library","interceptor","kmp-library","kotlin","kotlin-library","kotlin-multiplatform","library","okhttp3"],"latest_commit_sha":null,"homepage":"https://abdo-essam.github.io/AELog/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abdo-essam.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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},"funding":{"github":"abdo-essam"}},"created_at":"2026-04-10T14:51:46.000Z","updated_at":"2026-06-08T22:37:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/abdo-essam/AELog","commit_stats":null,"previous_names":["abdo-essam/aedevlens","abdo-essam/aelogs","abdo-essam/aelog"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/abdo-essam/AELog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abdo-essam%2FAELog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abdo-essam%2FAELog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abdo-essam%2FAELog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abdo-essam%2FAELog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abdo-essam","download_url":"https://codeload.github.com/abdo-essam/AELog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abdo-essam%2FAELog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34165482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["android","android-library","interceptor","kmp-library","kotlin","kotlin-library","kotlin-multiplatform","library","okhttp3"],"created_at":"2026-06-10T19:01:19.420Z","updated_at":"2026-06-10T19:01:20.264Z","avatar_url":"https://github.com/abdo-essam.png","language":"Kotlin","funding_links":["https://github.com/sponsors/abdo-essam"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"website/img/lens_logo.svg\" width=\"38\" height=\"38\" alt=\"AELog Logo\" style=\"vertical-align: middle; margin-right: 10px;\" /\u003eAELog\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eExtensible on-device dev tools for Kotlin Multiplatform\u003c/strong\u003e\n  \u003cbr /\u003e\n  An in-app debugging overlay for KMP — inspect logs, network traffic, and analytics events with a beautiful Compose UI. No external tools needed.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://central.sonatype.com/artifact/io.github.abdo-essam/ae-log-logs\"\u003e\n    \u003cimg src=\"https://img.shields.io/maven-central/v/io.github.abdo-essam/ae-log-logs?style=flat-square\u0026color=BF3547\" alt=\"Maven Central\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/abdo-essam/AELog/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/abdo-essam/AELog/ci.yml?branch=main\u0026style=flat-square\" alt=\"CI\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/abdo-essam/AELog\"\u003e\n    \u003cimg src=\"https://img.shields.io/codecov/c/github/abdo-essam/AELog?style=flat-square\u0026color=00B894\" alt=\"Code Coverage\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://kotlin.github.io/binary-compatibility-validator/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/API-stable-blue?style=flat-square\" alt=\"API Stability\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/abdo-essam/AELog?style=flat-square\" alt=\"License\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://kotlinlang.org\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Kotlin-2.2.0-7F52FF?style=flat-square\u0026logo=kotlin\" alt=\"Kotlin\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#-installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#-quick-start\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#-plugins\"\u003ePlugins\u003c/a\u003e •\n  \u003ca href=\"#-custom-plugins\"\u003eCustom Plugins\u003c/a\u003e •\n  \u003ca href=\"https://abdo-essam.github.io/AELog/\"\u003eDocumentation\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"website/img/aelog_logs.png\" width=\"190\" alt=\"Logs Plugin\" /\u003e\n  \u0026nbsp;\n  \u003cimg src=\"website/img/aelog_network.png\" width=\"190\" alt=\"Network Plugin\" /\u003e\n  \u0026nbsp;\n  \u003cimg src=\"website/img/aelog_analytics.png\" width=\"190\" alt=\"Analytics Plugin\" /\u003e\n  \u0026nbsp;\n  \u003cimg src=\"website/img/aelog_crashes.png\" width=\"190\" alt=\"Crashes Plugin\" /\u003e\n\u003c/p\u003e\n\n## ✨ Features\n\n| Feature | Description |\n|---------|-------------|\n| 🔍 **Log Inspector** | Search, filter, and copy logs with syntax-highlighted JSON |\n| 🌐 **Network Viewer** | HTTP request/response inspection with method badges |\n| 📊 **Analytics Tracker** | Monitor analytics events in real-time |\n| 💥 **Crash Reporter** | Capture and persist fatal and non-fatal exceptions on device |\n| 🎨 **Beautiful UI** | Material3 design with light/dark mode support |\n| 🧩 **Plugin System** | Extend with custom debug panels through modular dependencies |\n| 📱 **Adaptive Layout** | Bottom sheet on phones, dialog on tablets |\n| 🔌 **Zero Release Overhead**| Disable with a single flag — no runtime cost |\n| 🍎 **Multiplatform** | Android, iOS, Desktop (JVM), Web (WASM) |\n\n## 📦 Installation\n\nAELog is fully modularized. **Add only the dependencies you need.** Every plugin module carries its dependencies transitively, so you never need to import `ae-log-core` manually.\n\n### 1. Version Catalog (Recommended)\n\nAdd the following to your `gradle/libs.versions.toml`:\n\n```toml\n[versions]\naelog = \"1.1.7\"\n\n[libraries]\naelog-logs             = { module = \"io.github.abdo-essam:ae-log-logs\",           version.ref = \"aelog\" }\naelog-network-ktor     = { module = \"io.github.abdo-essam:ae-log-network-ktor\",   version.ref = \"aelog\" }\naelog-network-okhttp   = { module = \"io.github.abdo-essam:ae-log-network-okhttp\", version.ref = \"aelog\" }\naelog-analytics        = { module = \"io.github.abdo-essam:ae-log-analytics\",      version.ref = \"aelog\" }\naelog-crashes          = { module = \"io.github.abdo-essam:ae-log-crashes\",        version.ref = \"aelog\" }\n```\n\n### 2. Gradle Setup\n\nAdd the required dependencies to your target source sets in `build.gradle.kts`:\n\n```kotlin\n// build.gradle.kts (shared module)\nkotlin {\n    sourceSets {\n        commonMain.dependencies {\n            // Pick only what you need (each carries core transitively)\n            implementation(libs.aelog.logs)\n            implementation(libs.aelog.network.ktor)\n            implementation(libs.aelog.analytics)\n            implementation(libs.aelog.crashes)\n        }\n        androidMain.dependencies {\n            // Add only if your Android target uses OkHttp\n            implementation(libs.aelog.network.okhttp)\n        }\n    }\n}\n```\n\n---\n\n📖 See the [Full Installation Guide](https://abdo-essam.github.io/AELog/) for direct dependency coordinates and details on transitive inclusions.\n\n## 🚀 Quick Start\n\n### 1. Zero-Config (Automatic Setup)\nAELog features **zero-config auto-initialisation** on Android! Just add the Gradle dependencies for the plugins you want, and AELog automatically boots up with sensible defaults when your app launches. **No setup, configuration, or initialization code is required.**\n\n### 2. Drop in the Overlay\n\n#### For Compose Apps (Android \u0026 iOS)\nAdd `AELogOverlay()` as a **sibling** anywhere in your root composable — no wrapping required. By default, the floating notch trigger is disabled (`showNotch = false`), allowing you to control visibility programmatically via custom developer gestures or buttons:\n\n```kotlin\n@Composable\nfun App() {\n    // Renders the overlay container in the background\n    AELogOverlay() \n    \n    MaterialTheme {\n        Scaffold(\n            floatingActionButton = {\n                FloatingActionButton(onClick = { AELog.show() }) {\n                    Icon(Icons.Default.BugReport, contentDescription = \"Open Inspector\")\n                }\n            }\n        ) {\n            YourAppContent()\n        }\n    }\n}\n```\n\nTo **disable the library in release builds**, set:\n```kotlin\nAELog.isEnabled = BuildConfig.DEBUG\n```\n\nTo **enable the floating notch trigger** on the edge of the screen:\n```kotlin\nAELogOverlay(showNotch = true)\n```\n\n### 4. Log — primary API (`AELog`)\n\n`AELog` is a discoverable object modelled after Android's built-in `Log` class.\nJust type `AELog.` and the IDE lists every method — no extension hunting required:\n\n```kotlin\nAELog.log.v(\"Auth\", \"Token checked\")\nAELog.log.d(\"Auth\", \"Token refreshed\")\nAELog.log.i(\"HomeScreen\", \"App launched!\")\nAELog.log.w(\"Auth\", \"Session expiring soon\")\nAELog.log.e(\"Database\", \"Failed to clear cache\", exception) // stack trace auto-appended\nAELog.log.wtf(\"Auth\", \"Unexpected state\")\n```\n\n\u003e All calls are **silent no-ops** if the library hasn't initialized yet — safe to call from shared modules before app startup.\n\n#### Auto-tag — no tag required (recommended)\n\nOmit the tag and AELog derives it from the caller's class name automatically. No repetition, no overhead:\n\n```kotlin\nAELog.log.d(\"Token refreshed\")          // tag → \"AuthViewModel\"\nAELog.log.i(\"App launched!\")             // tag → \"HomeScreen\"\nAELog.log.e(\"Failed to clear cache\", t)  // tag → \"Database\"\n```\n\n```kotlin\n// Network, Analytics \u0026 Crashes APIs\nAELog.network.logRequest(method = \"GET\", url = \"https://api.example.com/users\")\nAELog.network.logResponse(url = \"https://api.example.com/users\", statusCode = 200)\nAELog.analytics.logEvent(\"item_added_to_cart\", properties = mapOf(\"id\" to \"123\"))\n\n// Capture non-fatal exceptions manually\ntry {\n    performDangerousWork()\n} catch (t: Throwable) {\n    AELog.crashes.recordNonFatal(t)\n}\n```\n\n### 🌐 Network Interceptors\n\nAELog provides first-class interceptors for OkHttp and Ktor.\n\n#### Security (Header Exclusion)\nBoth interceptors are **secure by default**. They automatically exclude sensitive headers like `Authorization` and `Cookie` to prevent credentials from appearing in logs.\n\n```kotlin\n// OkHttp\nval interceptor = AELogOkHttpInterceptor(\n    excludeHeaders = setOf(\"X-Sensitive-Header\") // Extends default exclusions\n)\n\n// Ktor\nval client = HttpClient {\n    install(AELogKtorInterceptor) {\n        excludeHeaders = setOf(\"X-Api-Key\")\n    }\n}\n```\n\n#### Body Truncation (OOM Prevention)\nTo prevent memory issues when inspecting large payloads (e.g., file uploads), bodies are automatically truncated (default 250 KB).\n\n```kotlin\nAELogOkHttpInterceptor(\n    maxRequestBodyBytes = 500_000,  // 500 KB limit\n    maxResponseBodyBytes = 1_000_000 // 1 MB limit\n)\n```\n\n#### Ktor Response Body Capture\nBy default, Ktor response streams can only be read once. To enable non-destructive inspection of response bodies:\n1. **Install DoubleReceive**: It is highly recommended to install the `DoubleReceive` plugin in your `HttpClient`.\n2. **Integrated Fallback**: AELog will attempt to capture the body using Ktor's internal stream handlers. If `DoubleReceive` is not installed, this may consume the stream—ensure your app logic is compatible or use the recommended plugin.\n\n```kotlin\nval client = HttpClient {\n    install(DoubleReceive) // Recommended for Network Plugin\n    install(AELogKtorInterceptor)\n}\n```\n\n### 5. Open AELog\n\nThree ways to open the inspector:\n1. Tap the **floating notch** at the top of the screen (Dynamic Island-style)\n2. Programmatically from anywhere: `AELog.show()` / `AELog.hide()`\n3. Wire it to any custom trigger (shake gesture, debug menu button, etc.)\n\n## 🔨 Custom Plugins\n\nCreate your own debug panel (e.g., a Database Inspector or Feature Flags toggler) in 3 steps:\n\n```kotlin\nclass FeatureFlagsPlugin : UIPlugin {\n    override val name = \"Flags\"\n    override val icon: @Composable () -\u003e Unit = { Icon(Icons.Default.Flag, contentDescription = null) }\n\n    // Optional: Live badge count shown on the tab (omit if not needed)\n    private val _badgeCount = MutableStateFlow(0)\n    override val badgeCount: StateFlow\u003cInt\u003e = _badgeCount\n\n    @Composable\n    override fun Content(modifier: Modifier) {\n        // Your Compose UI here (owns the entire panel layout)\n        LazyColumn(modifier = modifier) {\n            items(flags) { flag -\u003e\n                FlagRow(flag)\n            }\n        }\n    }\n}\n\n// Install your custom plugin alongside the auto-registered ones\nAELog.install(FeatureFlagsPlugin())\n```\n\n📖 See the [Custom Plugins Guide](https://abdo-essam.github.io/AELog/custom-plugins) for the full API reference.\n\n## 🔗 Logging Integrations\n\nAELog works with **any** logging library. Just forward logs to the static `AELog.log` methods:\n\n```kotlin\n// Forward logs using the static shorthands directly\nAELog.log.i(\"MyTag\", \"Something happened\")\nAELog.log.e(\"Database\", \"Failed to clear cache\", exception)\n```\n\n📖 See the [Logging Integrations Guide](https://abdo-essam.github.io/AELog/integrations) for adapter examples (Kermit, Napier, Timber, SLF4J).\n\n## 🏗️ Architecture\n\nThe SDK follows an encapsulated `Model-Store-API-UI` pattern, making plugins 100% reactive, modular, and thread-safe.\n\n```mermaid\ngraph TD\n    subgraph UI [\"UI Layer\"]\n        OV[\"AELogOverlay()\\n(Popup — zero wrapping)\"]\n    end\n\n    subgraph Core [\"Core — ae-log-core\"]\n        AE[\"AELog\\n(singleton engine)\"]\n    end\n\n    subgraph Plugins [\"Plugins (optional, loaded on demand)\"]\n        direction LR\n        LP1[\"LogPlugin\\nae-log-logs\"]\n        NP[\"NetworkPlugin\\nae-log-network\"]\n        AP[\"AnalyticsPlugin\\nae-log-analytics\"]\n        CP[\"CrashPlugin\\nae-log-crashes\"]\n    end\n\n    subgraph Storage [\"Data Layer (StateFlow — thread-safe)\"]\n        direction LR\n        LS[(\"LogStorage\")]\n        NS[(\"NetworkStorage\")]\n        AS[(\"AnalyticsStorage\")]\n        CS[(\"CrashStorage\")]\n    end\n\n    subgraph Interceptors [\"Auto-interceptors (optional)\"]\n        direction LR\n        KI[\"KtorInterceptor\\nae-log-network-ktor\"]\n        OI[\"OkHttpInterceptor\\nae-log-network-okhttp\"]\n    end\n\n    OV --\u003e AE\n    AE --\u003e LP1\n    AE --\u003e NP\n    AE --\u003e AP\n    AE --\u003e CP\n    LP1 --\u003e LS\n    NP --\u003e NS\n    AP --\u003e AS\n    CP --\u003e CS\n    KI --\u003e NP\n    OI --\u003e NP\n```\n\n## 🤝 Contributing\n\nContributions are welcome! Please read the [Contributing Guide](CONTRIBUTING.md) first.\n\n```bash\ngit clone https://github.com/abdo-essam/AELog.git\ncd AELog\n./gradlew build\n./gradlew allTests\n```\n\n## 📄 License\n\n```text\nCopyright 2026 Abdo Essam\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n```\n\n## 💖 Acknowledgements\n\n- Jetpack Compose — UI toolkit\n- Kotlin Multiplatform — Cross-platform framework\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabdo-essam%2Faelog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabdo-essam%2Faelog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabdo-essam%2Faelog/lists"}