{"id":35205266,"url":"https://github.com/matheus-corregiari/arch-lumber","last_synced_at":"2026-01-25T20:25:57.733Z","repository":{"id":329454162,"uuid":"1119680658","full_name":"matheus-corregiari/arch-lumber","owner":"matheus-corregiari","description":"Type-safe, multiplatform logging for Kotlin — inspired by Timber, built for KMP.","archived":false,"fork":false,"pushed_at":"2026-01-18T01:42:30.000Z","size":730,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-18T07:15:41.947Z","etag":null,"topics":["kmp","kotlin","kotlin-multiplatform","logging","timber"],"latest_commit_sha":null,"homepage":"https://matheus-corregiari.github.io/arch-lumber/","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/matheus-corregiari.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":"2025-12-19T17:03:09.000Z","updated_at":"2026-01-18T03:31:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/matheus-corregiari/arch-lumber","commit_stats":null,"previous_names":["matheus-corregiari/arch-lumber"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/matheus-corregiari/arch-lumber","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheus-corregiari%2Farch-lumber","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheus-corregiari%2Farch-lumber/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheus-corregiari%2Farch-lumber/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheus-corregiari%2Farch-lumber/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matheus-corregiari","download_url":"https://codeload.github.com/matheus-corregiari/arch-lumber/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheus-corregiari%2Farch-lumber/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28757909,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T20:20:48.599Z","status":"ssl_error","status_checked_at":"2026-01-25T20:20:31.796Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["kmp","kotlin","kotlin-multiplatform","logging","timber"],"created_at":"2025-12-29T13:39:35.551Z","updated_at":"2026-01-25T20:25:57.728Z","avatar_url":"https://github.com/matheus-corregiari.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌲 Lumber – A Lightweight Logging Library for Kotlin Multiplatform\n\n#### Version\n\n[![Maven Central][badge-maven]][link-maven] · [![LICENSE][badge-license]][link-license]\n\n---\n\n#### Platforms\n\n![Android][badge-android] · ![Apple][badge-apple] · ![JVM][badge-jvm] · ![JS][badge-js] · ![WASM][badge-wasm]\n\n---\n\n#### Quality\n\n![Lint][badge-lint] · ![Test][badge-test] · ![Coverage][badge-coverage]\n\n---\n\nA flexible, type-safe, and multiplatform logging library inspired\nby [Timber](https://github.com/JakeWharton/timber).  \nLumber brings a **simple API**, **prebuilt DebugOaks**, and **extensibility** for your Kotlin\nMultiplatform projects.\n\nToo see more, take a look at the [documentation](/docs/api/lumber/index.md).\n\n\u003e Special thanks to Jake Wharton for the inspiration and making Timber the go-to logging library for\n\u003e Android.\n\n---\n\n## 📑 Table of Contents\n\n* [Features](#-features)\n* [Installation](#-installation)\n* [Usage](#-usage)\n    * [1. Plant a DebugOak](#1-plant-a-DebugOak)\n    * [2. Log messages](#2-log-messages)\n    * [3. Manage Oaks](#3-manage-oaks)\n* [Prebuilt DebugOaks](#-prebuilt-oaks)\n* [Custom Oaks](#-custom-oaks)\n* [API Reference](#-api-reference)\n* [License](#-license)\n\n---\n\n## 🏷️ Features\n\n* **Kotlin Multiplatform Ready**\n* **Multiple Log Levels** — `Verbose`, `Debug`, `Info`, `Warn`, `Error`, `Assert`.\n* **Prebuilt DebugOaks** — Drop-in defaults per target:\n    * Android → Logcat\n    * Apple → ANSI colored `println`\n    * JS/WASM → Native `console.*` (browser or Node.js/wasm runtime)\n    * JVM → ANSI colored `println`\n* **Composable System** — Plant one or many Oaks (`ConsoleOak`, `FileOak`, custom).\n* **Thread-Safe** — Safe for concurrent logging.\n* **Inspired by [Timber](https://github.com/JakeWharton/timber)** — Similar ergonomics, extended for\n  KMP.\n\n---\n\n## 🚀 Installation\n\nAdd Lumber to your Gradle build:\n\n```kotlin\n// Kotlin DSL\ndependencies {\n    implementation(\"io.github.matheus-corregiari:arch-lumber:\u003clatest-version\u003e\")\n}\n````\n\n```groovy\n// Groovy\ndependencies {\n    implementation 'io.github.matheus-corregiari:arch-lumber:\u003clatest-version\u003e'\n}\n````\n\n---\n\n## 💡 Usage\n\n### 1. Plant a DebugOak\n\n```kotlin\nLumber.plant(DebugOak())\n```\n\n### 2. Log messages\n\n```kotlin\nLumber.verbose(\"Verbose details\")\nLumber.debug(\"Debugging info\")\nLumber.info(\"Initialization complete\")\nLumber.warn(\"This might need attention\")\nLumber.error(message = \"Something failed!\", error = Exception(\"Boom\"))\nLumber.wtf(\"Critical failure!\", Exception(\"Should never happen\"))\n```\n\n### 3. Manage Oaks\n\n```kotlin\nval console = ConsoleOak()\nLumber.plant(console)\n\n// Remove one oak\nLumber.uproot(console)\n\n// Or clear all oaks\nLumber.uprootAll()\n```\n\n---\n\n## 🌲 Prebuilt Oaks\n\n| Target    | Implementation | Backend                              |\n|-----------|----------------|--------------------------------------|\n| Android   | `DebugOak`     | `android.util.Log` (Logcat)          |\n| Apple     | `DebugOak`     | `println` with ANSI colors           |\n| JS (IR)   | `DebugOak`     | Native `console.log/info/warn/error` |\n| WASM (IR) | `DebugOak`     | Native `console.log/info/warn/error` |\n| JVM       | `DebugOak`     | `println` with ANSI colors           |\n\n---\n\n## 🛠️ Custom Oaks\n\nExtend `Lumber.Oak` for your own logging:\n\n```kotlin\nclass ConsoleOak : Lumber.Oak() {\n    override fun log(level: Level, tag: String?, message: String, error: Throwable?) {\n        println(\"$level: [$tag] $message\")\n    }\n}\n```\n\nPlant it like this:\n\n```kotlin\nLumber.plant(ConsoleOak(), FileOak())\nLumber.debug(\"Logged to console and file\")\n```\n\n---\n\n## 📚 API Reference\n\n### `Lumber` – static API\n\n| Method                      | Description                                |\n|-----------------------------|--------------------------------------------|\n| `plant(vararg oaks: Oak)`   | Add logging oaks                           |\n| `uproot(oak: Oak)`          | Remove a specific oak                      |\n| `uprootAll()`               | Remove all oaks                            |\n| `tag(tag: String)`          | Set a custom tag for the next log          |\n| `quiet(enabled: Boolean)`   | Enable/disable quiet mode for the next log |\n| `maxLogLength(length: Int)` | Set a custom log length for the next log   |\n| `maxTagLength(length: Int)` | Set a custom tag length for the next log   |\n\n### `Lumber.Level`\n\n| Level   | Purpose                          |\n|---------|----------------------------------|\n| Verbose | Detailed logs, tracing/debugging |\n| Debug   | Debugging information            |\n| Info    | Informational messages           |\n| Warn    | Warnings, potential issues       |\n| Error   | Errors and exceptions            |\n| Assert  | Critical failures (WTF)          |\n\n---\n\n## 📄 License\n\nThis module is released under the **Apache 2.0 License**.\nSee [LICENSE](LICENSE) for details.\n\n---\n\n## Coverage detail charts\n\n### Sunburst\n\n\u003e The inner-most circle is the entire project, moving away from the center are folders then,\n\u003e finally, a single file. The size and color of each slice is representing the number of statements\n\u003e and the coverage, respectively.\n[![codecov](https://codecov.io/gh/matheus-corregiari/arch-lumber/graphs/sunburst.svg?token=P977R4GMUO)](https://codecov.io/gh/matheus-corregiari/arch-lumber)\n\n### Grid\n\n\u003e Each block represents a single file in the project. The size and color of each block is\n\u003e represented by the number of statements and the coverage, respectively.\n[![codecov](https://codecov.io/gh/matheus-corregiari/arch-lumber/graphs/tree.svg?token=P977R4GMUO)](https://codecov.io/gh/matheus-corregiari/arch-lumber)\n\n### Icicle\n\n\u003e The top section represents the entire project. Proceeding with folders and finally individual\n\u003e files. The size and color of each slice is representing the number of statements and the coverage,\n\u003e respectively.\n[![codecov](https://codecov.io/gh/matheus-corregiari/arch-lumber/graphs/icicle.svg?token=P977R4GMUO)](https://codecov.io/gh/matheus-corregiari/arch-lumber)\n\n---\n\n[link-maven]: https://search.maven.org/artifact/io.github.matheus-corregiari/arch-lumber\n\n[link-ci]: https://github.com/matheus-corregiari/arch-lumber/actions/workflows/generate-tag.yml\n\n[link-license]: /LICENSE\n\n[badge-android]: http://img.shields.io/badge/-android-6EDB8D.svg?style=flat\n\n[badge-apple]: http://img.shields.io/badge/-apple-000000.svg?style=flat\n\n[badge-js]: http://img.shields.io/badge/-js-F7DF1E.svg?style=flat\n\n[badge-wasm]: http://img.shields.io/badge/-wasm-654FF0.svg?style=flat\n\n[badge-jvm]: http://img.shields.io/badge/-jvm-DB413D.svg?style=flat\n\n[badge-maven]: https://img.shields.io/maven-central/v/io.github.matheus-corregiari/arch-lumber.svg\n\n[badge-license]: https://img.shields.io/github/license/matheus-corregiari/arch-lumber\n\n[badge-coverage]: https://codecov.io/gh/matheus-corregiari/arch-lumber/branch/master/graph/badge.svg?token=P977R4GMUO\n\n[badge-lint]: https://github.com/matheus-corregiari/arch-lumber/actions/workflows/lint.yml/badge.svg\n\n[badge-test]: https://github.com/matheus-corregiari/arch-lumber/actions/workflows/coverage.yml/badge.svg\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatheus-corregiari%2Farch-lumber","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatheus-corregiari%2Farch-lumber","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatheus-corregiari%2Farch-lumber/lists"}