JakeWharton/timber
62.8
Adequate · 25 September 2026
1.6k
lines of production code
Kotlin
with Java
4
measurements over time
What this system is
This system is the Timber logging library, a Kotlin-based tool for Android and Kotlin Multiplatform projects that provides a structured API for logging via pluggable Tree implementations. It includes a dedicated lint module to detect incorrect usage patterns and enforce best practices, alongside a sample application demonstrating integration with ViewBinding and crash reporting. The project has been modernized to a Gradle build system with comprehensive test coverage and ABI stability checks.
How it got here
2013 — Gradle migration and Kotlin rewrite
5 changes.
The project overhauled its build infrastructure by migrating from Maven to Gradle, introducing version catalogs and configuring the library as a Kotlin multiplatform module. Concurrently, the codebase was rewritten in Kotlin, removing legacy interfaces and built-in logging implementations in favor of explicit Tree planting. The sample application was updated to demonstrate these changes using ViewBinding and custom lint rules for crash reporting.
2015–2019 — Build infrastructure and test coverage
3 changes.
The project updated its Gradle wrapper to version 9.7.1 to improve build reliability and dependency resolution. Significant effort was dedicated to expanding test coverage, including new Kotlin tests for the WrongTimberUsageDetector and comprehensive tests for Timber's null handling and tree management logic.
2021–2025 — Kotlin Multiplatform migration and tooling updates
4 changes.
The project refactored the Timber logging library to support Kotlin Multiplatform by moving common API definitions to a shared module and implementing platform-specific backends. Concurrently, the lint detection tools were rewritten in Kotlin to ensure compatibility with modern Android Studio versions, and API stability checks were established through signature files and ProGuard rule updates.
Removals
Removal of legacy Timber interface and built-in DEBUG/PROD implementations
The legacy \timber.log.Timber\ interface, which previously provided static \DEBUG\ and \PROD\ singleton instances for automatic tag inference and silent logging, has been removed. This change eliminates the built-in logging implementations, requiring users to explicitly plant custom \Tree\ instances to handle log output.
timber/src/main · high confidence
Behavioural changes
Added Kotlin API signature file for Timber
A new API signature file (timber.api) has been added for the Android module, defining the public surface of the timber.log.Timber class and its associated types (Tree, DebugTree, Forest). This file captures the current public API, including logging methods (d, e, i, v, w, wtf), tree management (plant, uproot, uprootAll), and helper methods (tag, treeCount, forest), ensuring ABI stability checks can be performed against this specific set of public members.
timber/api · high confidence
Added consumer ProGuard keep rules for Timber
A new consumer keep rules file (consumer-keep-rules.pro) has been added to the Timber module to suppress warnings related to the org.jetbrains.annotations package, ensuring cleaner builds for consumers using ProGuard or R8.
timber · high confidence
Lint checks rewritten in Kotlin with updated registration mechanism
The Timber lint detector (WrongTimberUsageDetector) has been converted from Java to Kotlin, and the issue registration has been migrated to the modern IssueRegistry API using AutoService. This ensures the lint checks remain compatible with newer versions of Android Studio and the Lint framework, while preserving existing detection logic for incorrect Timber usage.
timber-lint/src/main · high confidence
Project build and release infrastructure overhaul
The project has transitioned to a Gradle-based build system, introducing the Gradle wrapper (gradlew/gradlew.bat) and an .editorconfig for consistent code formatting (UTF-8, LF line endings, 2-space indentation). The legacy Maven-based release process and checkstyle configuration have been removed, replaced by a new RELEASING.md guide for managing versions and publishing artifacts to Sonatype. Additionally, the README has been updated to reflect the library's rewrite in Kotlin (version 5.x), new embedded lint rules, and updated dependency instructions.
(repo-wide) · high confidence
Sample app replaces Dagger/ButterKnife with direct Timber integration and crash reporting
The sample application has been refactored to remove its dependency on Dagger and ButterKnife for dependency injection and view binding. Instead, the app now directly initializes Timber in the Application class, conditionally planting a DebugTree in debug builds and a new CrashReportingTree in production. This CrashReportingTree forwards non-debug logs to a new FakeCrashLibrary, providing a concrete example of how to integrate Timber with crash reporting services without external DI frameworks.
timber-sample/src/main/java/com/example/timber · high confidence
Timber logging library restructured for Kotlin Multiplatform support
The Timber logging library has been refactored to support Kotlin Multiplatform projects. The common API definitions, including the \Timber\ class and its \Tree\ abstraction for logging methods (v, d, i, w, e, wtf, log), have been moved to \commonMain\. An Android-specific implementation of the \Tree\ class, which delegates logging calls to the native Android \Log\ API, has been added in \androidMain\. This change enables developers to use the same Timber API across different platforms while leveraging platform-specific logging backends.
timber/src/androidMain · high confidence
Updated sample app to use ViewBinding and added lint violation examples
The sample application has been refactored to replace ButterKnife with Android ViewBinding, updating DemoActivity to inflate layouts via generated binding classes and handle clicks through the View.OnClickListener interface. Additionally, new JavaLintActivity and KotlinLintActivity demos have been introduced to showcase various Timber lint warnings (such as LogNotTimber, StringFormatInTimber, and TimberArgCount), allowing users to see how the linter identifies incorrect usage patterns in both Java and Kotlin.
timber-sample/src/main/java/com/example/timber/ui · high confidence
Test coverage
Added Kotlin tests for WrongTimberUsageDetector; Added test coverage for Timber's null handling and tree management.
Dependencies
Migrate build system from Maven to Gradle with version catalogs
The project has replaced its Maven-based build configuration with a Gradle setup, removing the root pom.xml and individual module pom.xml files. This change introduces a version catalog (gradle/libs.versions.toml) to manage dependencies, setting the Android Gradle Plugin to 9.4.0, Kotlin to 2.4.20, and compileSdk to 36. The build now uses the Tapmoc plugin for ABI validation and compatibility checks, and the timber module is configured as a Kotlin multiplatform library.
(dependencies) · high confidence
Update Gradle wrapper to version 9.7.1
The Gradle wrapper configuration has been updated to use Gradle version 9.7.1. This change ensures that the project builds using this specific distribution, which includes updated network timeout and retry settings for more reliable dependency resolution.
gradle · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 41 → 63 (+22.2)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 96 → 93 (-3.2)
- Architecture 94 → 100 (+5.9)
- Maturity 50 → 55 (+5.3)
- Readiness 25 → 52 (+27.7)
- Security 39 → 83 (+44.4)
Resolved (18)
- Coverage not measured — test suite did not build
- Dimension evaluation failed
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Medium: security finding (details withheld)
- No artifact signing
- No exposed public API
- No tests found
- Test reliability not included
- Unpinned build actions
New (18)
- ClassTooLong: WrongTimberUsageDetector (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no project overview (README.md)
- Documentation: no usage examples (README.md)
- FileTooLong: lint/WrongTimberUsageDetector.kt (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- MethodTooLong: WrongTimberUsageDetector.checkFormatArguments (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- Orphaned files with no living knowledge
- TodoComment (timber-sample/src/main/java/com/example/timber/FakeCrashLibrary.java)
- TodoComment (timber-sample/src/main/java/com/example/timber/FakeCrashLibrary.java)
- TodoComment (timber-sample/src/main/java/com/example/timber/FakeCrashLibrary.java)
- Workflow token permissions not restricted
- WrongTimberUsageDetector.checkExceptionLogging (cognitive 20) (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- WrongTimberUsageDetector.checkFormatArguments (cognitive 28) (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- WrongTimberUsageDetector.checkFormatArguments (cyclomatic 65) (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- WrongTimberUsageDetector.getFormatArgumentCount (cognitive 23) (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
- WrongTimberUsageDetector.getStringArgumentTypes (cognitive 20) (timber-lint/src/main/java/timber/lint/WrongTimberUsageDetector.kt)
Changes since last survey
- 20 commits — 20 feature/other, 0 fixes
By area
- .github/workflows — 10 commits
- gradle/libs.versions.toml — 7 commits
- gradle/wrapper — 2 commits
- .github/renovate.json5 — 1 commit
Notable commits
- change: Extend shared Renovate config (#655)
- change: Pin dependencies (#656)
- change: Update AGP (#652)
- change: Update AGP (#665)
- change: Update Gradle to v9.7.0 (#649)
- change: Update Gradle to v9.7.1 (#651)
- change: Update JamesIves/github-pages-deploy-action action to v3.7.1 (#663)
- change: Update JamesIves/github-pages-deploy-action action to v4 (#664)
- change: Update actions/checkout action to v7.0.1 (#657)
- change: Update actions/setup-java action to v6 (#653)
- change: Update actions/setup-java action to v6.0.1 (#669)
- change: Update dependency com.diffplug.spotless:spotless-plugin-gradle to v8.10.0 (#650)
- change: Update dependency com.diffplug.spotless:spotless-plugin-gradle to v8.10.1 (#654)
- change: Update dependency com.diffplug.spotless:spotless-plugin-gradle to v8.10.2 (#666)
- change: Update dependency org.jetbrains.kotlin:kotlin-gradle-plugin to v2.4.20 (#667)
- change: Update dependency org.robolectric:robolectric to v4.17 (#670)
- change: Update ffurrer2/extract-release-notes action to v3.1.0 (#659)
- change: Update gradle/actions action to v6.3.0 (#660)
- change: Update softprops/action-gh-release action to v3.0.2 (#658)
- change: Update softprops/action-gh-release action to v3.0.3 (#661)
Architecture
- Containers 0 added · 0 removed · contexts 1 added · 0 removed · edges 0 added · 0 removed
Added bounded contexts (1)
- timber
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
JakeWharton/timber was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 55b54775e7ecc003efb75116de7721048483a56f — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.