Skip to content
CAI
Software that uses CAICheck a score

pinojs/pino

58.3

Adequate · 1 October 2026

4.1k

lines of production code

JavaScript

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a high-performance JavaScript logging library that provides structured logging capabilities with support for custom levels, child loggers, and data redaction. It features a modular architecture that separates core logging from formatting, utilizing dedicated transports and worker threads for asynchronous output to multiple destinations. The codebase includes extensive tooling for performance benchmarking, comprehensive test coverage for various environments, and automated version synchronization to ensure consistency.

How it got here

2016–2017 — internal refactoring and modularization

5 changes.

This period focused on a major internal restructuring to modernize the library's architecture, including the separation of the CLI into pino-pretty and the introduction of dedicated modules for caller analysis, constants, and deprecations. Concurrently, the project expanded test coverage for browser and core logging behaviors while establishing a new benchmark suite to compare performance against other logging libraries.

2018–2021 — Benchmarking and transport testing

9 changes.

This period focused on establishing comprehensive performance benchmarking utilities to measure the overhead of features like custom levels, child loggers, and redaction. It also involved expanding test coverage for transport pipelines, TypeScript type definitions, and edge cases such as broken pipes and eval-based caller identification.

2022 — test coverage and version synchronization

4 changes.

This period focused on expanding test coverage for edge cases, including objects with null prototypes and various TypeScript transport scenarios. It also introduced automation to synchronize the library's internal version metadata with package.json and added tests to verify runtime version consistency.

Features

New benchmark suite for performance comparison

Added a comprehensive set of benchmark scripts in the \benchmarks/\ directory to measure and compare logging performance. These benchmarks evaluate Pino against Bunyan, Winston, Bole, and debug across various scenarios, including basic logging, child logger creation, deep object handling, long strings, multi-argument interpolation, and multi-stream output.

benchmarks · high confidence

New benchmarking utilities for performance comparison

Added new scripts in benchmarks/utils to automate and document performance benchmarks. The generate-benchmark-doc.js script runs specific benchmarks (basic, object, deep-object) and outputs the results as Markdown for documentation. The runbench.js utility executes various benchmark scenarios (including child loggers and formatters) and displays averaged timing results along with system information. The wrap-log-level.js helper modifies the loglevel library to inject timestamps, enabling fair performance comparisons between Pino and other logging libraries.

benchmarks/utils · high confidence

New examples for basic usage and transport configuration

Added two new example files: \examples/basic.js\ demonstrates standard Pino logging to stdout with human-readable output via pino-pretty, and \examples/transport.js\ shows how to configure pino.transport() to write logs to multiple targets, including a file and pino-pretty, using modern node: imports.

examples · high confidence

Removals

Pino CLI removed in favor of pino-pretty

The \pino\ CLI entry point has been removed. Running the \pino\ command now exits with an error and directs users to use the \pino-pretty\ CLI instead. This change reflects the architectural decision to separate the core logging library from formatting concerns, ensuring the main package remains lightweight while formatting is handled by the dedicated \pino-pretty\ module.

(repo-wide) · high confidence

Behavioural changes

Automated version synchronization between package.json and library metadata

A new build script (build/sync-version.js) has been introduced to automatically keep the library's internal version metadata in sync with the project's package.json. When executed with a specific version argument, the script updates package.json if the versions differ and writes the current version to lib/meta.js, ensuring that the published package and its runtime metadata always reflect the same version number.

build · high confidence

Major internal refactoring and API modernization

The library has undergone a significant internal restructuring to modernize its architecture and improve maintainability. Key changes include the introduction of a new \lib/caller.js\ module for improved stack trace analysis, the extraction of log level definitions into \lib/constants.js\, and the implementation of a dedicated deprecation warning system via \lib/deprecations.js\. The core logging logic has been reorganized, with \lib/proto.js\ now using a factory pattern for prototype creation to fix scoping issues, and \lib/levels.js\ updated to support custom level comparisons and sorting orders. Additionally, \lib/redaction.js\ has been rewritten to use the \@pinojs/redact\ package for more robust path handling, and \lib/transport.js\ now includes enhanced security measures to sanitize \NODE\_OPTIONS\ and prevent infinite worker spawning during preload phases.

lib · high confidence

New internal benchmarks for custom levels, child loggers, and redaction

Added five new internal benchmark scripts in the \benchmarks/internal\ directory to measure performance characteristics of specific logging features. \custom-levels.js\ benchmarks the overhead of using custom log levels and their inheritance in child loggers. \just-pino.bench.js\ and \just-pino-heavy.bench.js\ provide granular performance tests for basic logging, object serialization, string interpolation, and child logger creation across synchronous and asynchronous destinations. \parent-vs-child.bench.js\ specifically measures the cost of nested child logger hierarchies, while \redact.bench.js\ benchmarks the performance impact of redaction configurations, including variations with unsafe mode and asynchronous output.

benchmarks/internal · high confidence

Test coverage

Add TSTyche-based type tests for pino exports and transports; Added Jest test for transport configuration; Added TypeScript test fixtures for transport scenarios; Added comprehensive test suite for transport functionality; Added test fixtures for eval-based caller identification; Added test fixtures for transport and exit behavior; Added test for pretty printing objects with null prototypes; Added test to verify pino version consistency; Added tests for broken pipe handling; Expanded test coverage for browser logger and core logging behaviors.

Dependencies

Pino v10.3.1 release with updated dependencies

Pino has been updated to version 10.3.1, introducing several dependency upgrades that affect runtime behavior and development tooling. Key production dependencies include pino-abstract-transport bumped to v3.0.0, pino-std-serializers to v7.0.0, process-warning to v5.0.0, real-require to v1.0.0, sonic-boom to v4.0.1, and thread-stream to v4.0.0. Development dependencies have also been updated, notably TypeScript to v6.0.2, Jest to v30.0.3, and pino-pretty to v13.0.0.

(dependencies) · 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

Score

  • CAI 63 → 58 (-5.1)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 81 → 81 (+0.0)
  • Architecture 100 → 100 (+0.1)
  • Maturity 56 → 56 (-0.0)
  • Readiness 62 → 46 (-15.7)
  • Security 70 → 75 (+5.4)
  • Performance 82 (new)

Resolved (5)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Documentation: written for insiders (docs/bundling.md)
  • Hotspot: lib/tools.js (lib/tools.js)
  • Off-boarding risk: anonymized user #1

New (13)

  • Hotspot: browser.js (browser.js)
  • No assertions: bindings contains bindings added with setBindings (test/browser-bindings.test.js)
  • No assertions: bindings contains bindings from nested children (test/browser-bindings.test.js)
  • No assertions: bindings contains child bindings (test/browser-bindings.test.js)
  • No assertions: bindings returns a copy of the bindings (test/browser-bindings.test.js)
  • No assertions: bindings returns an empty object on the root logger (test/browser-bindings.test.js)
  • No assertions: child bindings overwrite parent bindings with the same key (test/browser-bindings.test.js)
  • No assertions: child does not inherit bindings set on parent after child creation (test/browser-bindings.test.js)
  • No assertions: child inherits bindings set on parent before child creation (test/browser-bindings.test.js)
  • No assertions: newly set bindings overwrite old bindings (test/browser-bindings.test.js)
  • No assertions: setBindings on child merges with child bindings (test/browser-bindings.test.js)
  • Off-boarding risk: anonymized user #1
  • Scanner failed to run — not a clean result

Changes since last survey

  • 4 commits — 3 feature/other, 1 fixes

By area

  • docs/api.md — 2 commits
  • (root) — 1 commit
  • .github/workflows — 1 commit

Notable commits

  • fix: ci: pin lock-threads to upstream v6.0.2 to fix token validation failure (#2525)
  • change: Add bindings method to browser logger (#2504)
  • change: docs: Note that serializers run on child bindings at creation time (#2518)
  • change: docs: fix the pino-pretty flush explanation after thread-stream#198 (#2524)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

pinojs/pino 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 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 6ba157b1a6727399f9dc01a584d2e08d5094ea57 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.