{"id":25715098,"url":"https://github.com/cosminmihumdc/ktormonitor","last_synced_at":"2026-04-18T20:06:03.379Z","repository":{"id":276648203,"uuid":"922598038","full_name":"CosminMihuMDC/KtorMonitor","owner":"CosminMihuMDC","description":"Powerful tool to monitor Ktor Client requests and responses, making it easier to debug and analyze network communication.","archived":false,"fork":false,"pushed_at":"2026-01-18T16:14:01.000Z","size":97026,"stargazers_count":186,"open_issues_count":1,"forks_count":16,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-19T00:36:36.669Z","etag":null,"topics":["android","android-library","client","http","ios","jvm","jvm-library","kotlin","kotlin-multiplatform","ktor","ktor-client","ktor-plugin","linux","macos","proxy","wasm","windows"],"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/CosminMihuMDC.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"CosminMihuMDC"}},"created_at":"2025-01-26T16:29:25.000Z","updated_at":"2026-01-18T16:06:08.000Z","dependencies_parsed_at":"2025-05-20T12:07:17.732Z","dependency_job_id":null,"html_url":"https://github.com/CosminMihuMDC/KtorMonitor","commit_stats":null,"previous_names":["cosminmihumdc/ktormonitor"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/CosminMihuMDC/KtorMonitor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CosminMihuMDC%2FKtorMonitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CosminMihuMDC%2FKtorMonitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CosminMihuMDC%2FKtorMonitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CosminMihuMDC%2FKtorMonitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CosminMihuMDC","download_url":"https://codeload.github.com/CosminMihuMDC/KtorMonitor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CosminMihuMDC%2FKtorMonitor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28601279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T09:39:28.479Z","status":"ssl_error","status_checked_at":"2026-01-20T09:38:10.511Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["android","android-library","client","http","ios","jvm","jvm-library","kotlin","kotlin-multiplatform","ktor","ktor-client","ktor-plugin","linux","macos","proxy","wasm","windows"],"created_at":"2025-02-25T13:34:40.365Z","updated_at":"2026-04-18T20:06:03.371Z","avatar_url":"https://github.com/CosminMihuMDC.png","language":"Kotlin","funding_links":["https://github.com/sponsors/CosminMihuMDC","https://www.buymeacoffee.com/cosminmihu"],"categories":[],"sub_categories":[],"readme":"[![Maven Central](https://img.shields.io/maven-central/v/ro.cosminmihu.ktor/ktor-monitor-logging?logo=apachemaven\u0026label=Maven%20Central\u0026link=https://search.maven.org/artifact/ro.cosminmihu.ktor/ktor-monitor-logging/)](https://search.maven.org/artifact/ro.cosminmihu.ktor/ktor-monitor-logging)\n[![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?label=Licence\u0026logo=lintcode\u0026logoColor=white\u0026color=#3DA639)](https://github.com/CosminMihuMDC/KtorMonitor/blob/main/LICENSE)\n[![Platforms](https://img.shields.io/badge/Platforms-Android%20+%20iOS%20+%20JVM%20+%20Wasm%20+%20Js-brightgreen?logo=kotlin\u0026logoColor=white\u0026color=8d69e0)](https://cosminmihumdc.github.io/KtorMonitor)\n[![Slack](https://img.shields.io/badge/Slack-kotlinlang-4A164B?logo=sololearn\u0026logoColor=white)](https://kotlinlang.slack.com/archives/C0AB9GA32H0)\n[![JetBrains Klibs.io](https://img.shields.io/badge/JetBrains-klibs.io-4284F3?logo=jetbrains\u0026logoColor=white)](https://klibs.io/project/CosminMihuMDC/KtorMonitor)\n[![Documentation](https://img.shields.io/badge/Docs-gray?logo=readthedocs\u0026logoColor=white)](https://cosminmihumdc.github.io/KtorMonitor)\n[![API](https://img.shields.io/badge/API-gray?logo=codersrank\u0026logoColor=white)](https://cosminmihumdc.github.io/KtorMonitor/api)\n[![GitHub stars](https://img.shields.io/github/stars/CosminMihuMDC/KtorMonitor)](https://github.com/CosminMihuMDC/KtorMonitor)\n[![GitHub forks](https://img.shields.io/github/forks/CosminMihuMDC/KtorMonitor)](https://github.com/CosminMihuMDC/KtorMonitor/fork)\n\n# \u003cimg src=\"./extra/ktor_monitor_ic_launcher.svg\" width=\"35\"/\u003e KtorMonitor\nPowerful tool to monitor [Ktor Client](https://ktor.io/) and [OkHttp](https://square.github.io/okhttp/) requests and responses, making it easier to debug and analyze network communication.\n\n\u003cimg src=\"extra/readme/ktormonitor.png\" alt=\"ktormonitor\"/\u003e\n\n## ✨ Features\n\n*   🌐**Ktor Network Monitoring**: Real-time interception and logging of [Ktor Client](https://ktor.io/) traffic.\n*   🌐**OkHttp Network Monitoring**: Real-time interception and logging of [OkHttp](https://square.github.io/okhttp/) traffic.\n*   📱**Kotlin Multiplatform (KMP)**: Full support for **Android**, **iOS**, **Desktop (JVM)**, **Wasm**, and **JS**.\n*   🛠️**Highly Configurable**: Customize retention periods, content length limits, and notification behavior.\n*   🔒**Security First**: Redact sensitive headers (e.g., *Authorization*).\n*   📂**Data Export**: Save request/response details to local files for easier debugging or sharing.\n*   🎨**Rich Previews**: Built-in viewers for *JSON*, *XML*, *HTML*, *CSS*, *Form Data*, *Image* (*JPG*, *PNG*, *SVG*, *GIF*, *WEBP*).\n*   📡**SSE \u0026 WebSockets**: Track one-way streams (*SSE*) and bidirectional traffic (*WebSockets*).\n*   🛡️**Production Safe**: No-Op version to ensure monitoring code is excluded from your production builds.\n\n## 📦 Setup (Kotlin Multiplatform) for [Ktor Client](https://ktor.io/)\n\n### \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/6/6b/Gradle_logo.svg\" width=\"100\"/\u003e\n\n```kotlin\nkotlin {\n    sourceSets {\n        commonMain.dependencies {\n            implementation(\"ro.cosminmihu.ktor:ktor-monitor-logging:1.10.3\")\n        }\n    }\n}\n```\n\n**For Release Builds (No-Op)**\n\nTo isolate KtorMonitor from release builds, use the `ktor-monitor-logging-no-op` variant. This ensures the monitor code is not included in production artifact.\n\n```kotlin\nkotlin {\n    sourceSets {\n        commonMain.dependencies {\n            implementation(\"ro.cosminmihu.ktor:ktor-monitor-logging-no-op:1.10.3\")\n        }\n    }\n}\n```\n\n## 📦 Setup (Android only) for [Ktor Client](https://ktor.io/)\n\n### \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/6/6b/Gradle_logo.svg\" width=\"100\"/\u003e\n\n```kotlin\ndependencies {\n    debugImplementation(\"ro.cosminmihu.ktor:ktor-monitor-logging:1.10.3\")\n    releaseImplementation(\"ro.cosminmihu.ktor:ktor-monitor-logging-no-op:1.10.3\")\n}\n```\n\nFor ***Android minSdk \u003c 26***, [Core Library Desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) is required.\n\n### \u003cimg src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/Ktor_icon.png\" width=\"30\"/\u003e Install Ktor Client Plugin\n\n```kotlin\nHttpClient {\n\t\n    install(KtorMonitorLogging) {  \n        sanitizeHeader { header -\u003e header == \"Authorization\" }  \n        filter { request -\u003e !request.url.host.contains(\"cosminmihu.ro\") }  \n        showNotification = true  \n        retentionPeriod = RetentionPeriod.OneHour\n        maxContentLength = ContentLength.Default\n    }\n}\n```\n\n- ```sanitizeHeader``` - sanitize sensitive headers to avoid their values appearing in the logs\n- ```filter``` - filter logs for calls matching a predicate.\n- ```showNotification``` - Keep track of latest requests and responses into notification. Default is **true**. Android and iOS only. Notifications permission needs to be granted.\n- ```retentionPeriod``` - The retention period for the logs. Default is **1h**.\n- ```maxContentLength``` - The maximum length of the content that will be logged. After this, body will be truncated. Default is **250_000**. To log the entire body use ```ContentLength.Full```.\n\n## 📦 Setup (Android \u0026 JVM only) for [OkHttp](https://square.github.io/okhttp/)\n\n### \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/6/6b/Gradle_logo.svg\" width=\"100\"/\u003e\n\n```kotlin\ndependencies {\n    debugImplementation(\"`ro.cosminmihu.ktor:ktor-monitor-okhttp-interc`eptor:1.10.3\")\n    debugImplementation(\"ro.cosminmihu.ktor:ktor-monitor-okhttp-interceptor-no-op:1.10.3\")\n}\n```\n\nFor ***Android minSdk \u003c 26***, [Core Library Desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) is required.\n\n### \u003cimg src=\"https://pw-renderer-production-c.squarecdn.com/6d6a21f1ace5b8a7c93127a6f77087418f6ac596/_svelte/favicon.ico\" width=\"30\" style=\"background:#eee;\"/\u003e Install OkHttp Interceptor\n\n```kotlin\nOkHttpClient.Builder()\n    .addNetworkInterceptor(\n        KtorMonitorInterceptor {\n            sanitizeHeader { header -\u003e header == \"Authorization\" }\n            filter { request -\u003e !request.url.host.contains(\"cosminmihu.ro\") }\n            showNotification = true\n            retentionPeriod = RetentionPeriod.OneHour\n            maxContentLength = ContentLength.Default\n        }\n    )\n    .build()\n```\n\n- ```sanitizeHeader``` - sanitize sensitive headers to avoid their values appearing in the logs\n- ```filter``` - filter logs for calls matching a predicate.\n- ```showNotification``` - Keep track of latest requests and responses into notification. Default is **true**. Android and iOS only. Notifications permission needs to be granted.\n- ```retentionPeriod``` - The retention period for the logs. Default is **1h**.\n- ```maxContentLength``` - The maximum length of the content that will be logged. After this, body will be truncated. Default is **250_000**. To log the entire body use ```ContentLength.Full```.\n\n## 🧩 Integration\n\nAdd the UI component to your application based on your targeted platform.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCompose Multiplatform (Common)\u003c/b\u003e\u003c/summary\u003e\n\n* Use ```KtorMonitor``` Composable\n\n```kotlin\n@Composable\nfun Composable() {\n    KtorMonitor()\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAndroid\u003c/b\u003e\u003c/summary\u003e\n\n- If ```showNotifcation = true``` and **android.permission.POST_NOTIFICATIONS** is granted, the library will display a notification showing a summary of ongoing KTOR activity. Tapping on the notification launches the full ```KtorMonitor```.\n- Apps can optionally use the ```KtorMonitor()``` Composable directly into own Composable code.\n- For ***Android minSdk \u003c 26***, [Core Library Desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) is required.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eiOS\u003c/b\u003e\u003c/summary\u003e\n\n* If ```showNotifcation = true``` and notification permission is granted, the library will display a notification showing a summary of ongoing KTOR activity.\n\n* Use ```KtorMonitorViewController```\n\n```kotlin\nfun MainViewController() = KtorMonitorViewController()\n```\n\n```swift\nstruct KtorMonitorView: UIViewControllerRepresentable {\n    func makeUIViewController(context: Context) -\u003e UIViewController {\n        MainViewControllerKt.MainViewController()\n    }\n\n    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}\n}\n\nstruct ContentView: View {\n    var body: some View {\n        KtorMonitorView()\n                .ignoresSafeArea()\n    }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDesktop (Compose)\u003c/b\u003e\u003c/summary\u003e\n\n* Use ```KtorMonitorWindow``` Composable\n\n```kotlin\nfun main() = application {\n\n    var showKtorMonitor by rememberSaveable { mutableStateOf(false) }\n    KtorMonitorWindow(\n        onCloseRequest = { showKtorMonitor = false },\n        show = showKtorMonitor\n    )\n\n}\n```\n\n* Use ```KtorMonitorWindow``` Composable with ```KtorMonitorMenuItem```\n\n```kotlin\nfun main() = application {\n\n    var showKtorMonitor by rememberSaveable { mutableStateOf(false) }\n    Tray(\n        icon = painterResource(Res.drawable.ic_launcher),\n        menu = {\n            KtorMonitorMenuItem { showKtorMonitor = true }\n        }\n    )\n\n    KtorMonitorWindow(\n        show = showKtorMonitor,\n        onCloseRequest = { showKtorMonitor = false }\n    )\n\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDesktop (Swing)\u003c/b\u003e\u003c/summary\u003e\n\n* Use ```KtorMonitorPanel``` Swing Panel\n\n```kotlin\nfun main() = application {\n\n    SwingUtilities.invokeLater {\n        val frame = JFrame()\n        frame.add(KtorMonitorPanel, BorderLayout.CENTER)\n        frame.isVisible = true\n    }\n\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWasm / Js\u003c/b\u003e\u003c/summary\u003e\n\n* Web targets require a few additional webpack steps.\n\n```kotlin\nkotlin {\n    sourceSets {\n        webMain.dependencies {\n            implementation(devNpm(\"copy-webpack-plugin\", \"9.1.0\"))\n        }\n    }\n}\n```\n\n```javascript\n// {project}/webpack.config.d/sqljs.js\nconfig.resolve = {\n    fallback: {\n        fs: false,\n        path: false,\n        crypto: false,\n    }\n};\n\nconst CopyWebpackPlugin = require('copy-webpack-plugin');\nconfig.plugins.push(\n    new CopyWebpackPlugin({\n        patterns: [\n            '../../node_modules/sql.js/dist/sql-wasm.wasm'\n        ]\n    })\n);\n```\n\n```kotlin\nComposeViewport {\n    App()\n}\n```\n\u003c/details\u003e\n\n## ✍️ Feedback\n\nFound a bug or have a feature request? [File an issue](https://github.com/CosminMihuMDC/KtorMonitor/issues/new).\n\n## 🙌 Acknowledgments\n\n[![Kotlin](https://img.shields.io/badge/2.3.20-white?logo=kotlin\u0026logoColor=white\u0026color=7F52FF)](http://kotlinlang.org)\n[![Compose Multiplatform](https://img.shields.io/badge/1.11.0-white?logo=jetpackcompose\u0026logoColor=white\u0026color=4284F3)](https://www.jetbrains.com/lp/compose-multiplatform)\n[![Android](https://img.shields.io/badge/Android%2017-white?logo=android\u0026logoColor=white\u0026color=34A853)](https://developer.android.com/about/versions/16)\n[![Ktor](https://img.shields.io/badge/3.4.2-white?logo=ktor\u0026logoColor=white\u0026color=087CFA)](https://ktor.io)\n[![SQLDelight](https://img.shields.io/badge/2.3.2-white?logo=sqlite\u0026logoColor=white\u0026color=003B57)](https://sqldelight.github.io/sqldelight)\n\nCommunity discussions on Slack — join us in the [#ktormonitor](https://kotlinlang.slack.com/archives/C0AB9GA32H0) channel.\n\u003cbr\u003e\nDocumentation is available at [KtorMonitor Documentation](https://cosminmihumdc.github.io/KtorMonitor).\n\u003cbr\u003e\nAPI is available at [KtorMonitor API](https://cosminmihumdc.github.io/KtorMonitor/api).\n\u003cbr\u003e\nKtorMonitor is available also on JetBrains' [klibs.io](https://klibs.io/project/CosminMihuMDC/KtorMonitor).\n\u003cbr\u003e\n\u003cbr\u003e\nSome parts of this project are reusing ideas that are originally coming from [Chucker](https://github.com/ChuckerTeam/chucker).\n\u003cbr\u003e\nThanks to ChuckerTeam for Chucker!\n\u003cbr\u003e\nThanks to JetBrains for Ktor and Kotlin!\n\u003cbr\u003e\n\u003cbr\u003e\nMedium article: [Ktor Monitor](https://medium.com/@cosmin.mihu/ktormonitor-debug-and-analyze-ktor-client-network-traffic-411c66061baf)\n\n## 💸 Sponsors\nKtorMonitor is maintained and improved during nights, weekends and whenever team has free time. If you use KtorMonitor in your project, please consider sponsoring us.\n\nYou can sponsor us by clicking [\u003cspan style=\"color:#bf3989\"\u003e♥ Sponsor\u003c/span\u003e](https://github.com/sponsors/CosminMihuMDC).\n\u003cbr\u003e\n\u003ca href=\"https://www.buymeacoffee.com/cosminmihu\" target=\"_blank\"\u003e\u003cimg src=\"https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\" alt=\"Buy Me A Coffee\" style=\"height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;\" \u003e\u003c/a\u003e\n\n## 🙏🏻 Credits\n\nKtorMonitor is brought to you by these [contributors](https://github.com/CosminMihuMDC/KtorMonitor/graphs/contributors).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcosminmihumdc%2Fktormonitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcosminmihumdc%2Fktormonitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcosminmihumdc%2Fktormonitor/lists"}