http4s/blaze
48.4
Weak · 20 September 2026
18k
lines of production code
Scala
with Java
1
measurement over time
What this system is
This system is the Blaze HTTP engine, a high-performance, asynchronous networking backend for the http4s framework that implements HTTP/1.1 and WebSocket protocols. It provides a configurable client and server architecture featuring connection pooling, strict RFC compliance, and support for SSL/TLS and mutual authentication. The codebase focuses on low-level pipeline management, efficient byte buffering, and robust error handling, while explicitly deprecating its unmaintained HTTP/2 implementation.
How it got here
2013–2014 — Blaze engine development and scaffolding
22 changes.
This period established the project's foundational infrastructure, including build configuration and development tooling, while introducing the core Blaze HTTP engine. Significant work focused on implementing the NIO1 and NIO2 channel layers, refactoring the pipeline API, and adding a robust HTTP client with connection pooling. The examples were modernized to demonstrate these new capabilities, including SSL authentication and streaming, while legacy Play-based implementations were removed.
2015–2018 — HTTP/1.1 parser rewrite and WebSocket support
15 changes.
This period focused on rewriting the HTTP/1.1 parser in Java for stricter validation and performance, while introducing a new WebSocket implementation with ping/pong support. The work also included refactoring connection handling and response writing utilities, adding comprehensive test coverage for these components, and deprecating the unmaintained HTTP/2 server support.
2019–2021 — Blaze HTTP client and server refactoring
14 changes.
This period focused on a comprehensive refactoring of the Blaze HTTP client and server modules, introducing improved connection pooling, stricter HTTP/1.1 compliance, and better resource management. The work included adding Scala 2.11, 2.12, and 2.13 compatibility shims, migrating to MUnit for testing, and establishing reproducible build environments via Nix. Extensive test suites were added to verify client concurrency, server security, and utility correctness.
2022 — Blaze client optimization and demo expansion
4 changes.
The Blaze HTTP client internals were refactored to leverage Scala 2.13's native parasitic execution context, improving performance for fire-and-forget tasks. Concurrently, comprehensive demo applications were added for both client and server sides, illustrating multipart uploads, streaming, authentication, and OAuth2 integration.
Features
Add Nix package definition with pinned Nixpkgs and configurable Java runtime
A new Nix package set (nix/pkgs.nix) is introduced that imports a pinned version of Nixpkgs from GitHub and configures the SBT build tool to use a specific Java runtime (passed as an argument). This allows users to build the project using a reproducible, pinned Nix environment with a customizable Java version.
nix · high confidence
Add SSL client authentication example
The examples now include an SSL client authentication demonstration. A new EchoServer example utilizes a dedicated ExampleKeystore helper to configure an SSLContext that requires client certificates, allowing users to see how to enforce mutual TLS authentication in a Blaze server.
examples/src/main/scala/org/http4s/blaze · high confidence
Add connection monitoring capabilities to the pipeline
Introduces a new \ConnectionMonitor\ abstract class and a \BasicConnectionMonitor\ implementation within the \org.http4s.blaze.pipeline.stages.monitors\ package. This allows users to track basic connection metrics, including the number of live connections, inbound bytes, and outbound bytes, by injecting a \ServerStatusStage\ into the socket pipeline builder.
core/src/main/scala/org/http4s/blaze/pipeline/stages/monitors · high confidence
Add http4s Blaze demo server with file, auth, and GitHub endpoints
This change introduces a new demo server application in the \examples/src/main/scala/com/example/http4s/blaze/demo/server\ directory. It provides a complete HTTP server implementation using http4s and the Blaze engine, exposing several endpoints: file directory listing and storage, hex-encoded name responses, simulated timeouts, and multipart file uploads. It also includes authentication features via Basic Auth and a GitHub OAuth2 integration flow. The server is wired together via a \Module\ that combines these services with middleware like GZip and AutoSlash, and is launched via \Server.scala\ on port 8080.
examples/src/main/scala/com/example/http4s/blaze/demo/server · high confidence
Add utility traits and helpers for HTTP header handling and disconnect management
This change introduces two new utility components in the HTTP server module. The \HeaderLike\ trait provides a generic interface for packing and unpacking header representations, including an implicit implementation for tuple-based headers to simplify header creation and access. Additionally, the \NormalDisconnect\ object is added as a helper to identify and filter out expected disconnection errors, such as EOF and timeouts, allowing the server to handle these cases gracefully without treating them as unexpected failures.
http/src/main/scala/org/http4s/blaze/http/util · high confidence
Added HTTP client demo examples for multipart and streaming
New demo files have been added to the HTTP4s Blaze client examples: MultipartClient.scala demonstrates how to construct and send multipart form requests (including file uploads) using the Blaze client, while StreamClient.scala shows how to stream HTTP responses and process the body as a character stream. These examples provide reference implementations for common client-side patterns.
examples/src/main/scala/com/example/http4s/blaze/demo/client · high confidence
Added local HTTP benchmarking scripts
Added a new shell script (scripts/dowrklocal) and a Lua script (scripts/pipeline.lua) to facilitate local performance testing of the HTTP server. The pipeline script configures the wrk benchmarking tool to send pipelined requests to the /plaintext endpoint, allowing developers to easily measure server throughput and latency locally.
scripts · high confidence
Configurable logging for examples via Logback
The examples module now includes dedicated Logback configuration files (logback.xml and logback-test.xml) that enable console logging with a detailed timestamp, thread, and level pattern. The production configuration defaults to INFO level, while the test configuration allows the root log level to be overridden via the LOGBACK\_ROOT\_LEVEL environment variable, providing users with consistent and customizable logging output for the example applications.
examples/src/main/resources · high confidence
Initial project scaffolding and configuration
The repository is initialized with essential project infrastructure, including a Nix flake for development environment provisioning, a .mergify.yml file to automate pull request labeling by module, and comprehensive configuration for code formatting (scalafmt) and linting (scalafix). The project also includes a README describing the blaze HTTP server/client backends, a Code of Conduct, and an Apache 2.0 license file.
(repo-wide) · high confidence
Introduce NIO2-based asynchronous channel implementation
This change adds a new NIO2 implementation for the Blaze channel layer, introducing \ByteBufferHead\ for handling asynchronous socket I/O and \ClientChannelFactory\ for establishing TCP connections. The new client factory supports configurable channel options, a connect timeout (defaulting to infinite), and a custom scheduler, while maintaining binary compatibility with older constructors. This provides an alternative asynchronous networking backend alongside the existing NIO1 implementation.
core/src/main/scala/org/http4s/blaze/channel/nio2 · high confidence
Introduce core Blaze utility primitives
Added a new set of internal utility classes in the \org.http4s.blaze.util\ package to support the Blaze HTTP engine. This includes a lightweight, lock-free \Actor\ model for message passing, a \SerialExecutionContext\ for guaranteed sequential task execution, and a thread-local \trampoline\ execution context to reduce context-switching overhead. The update also introduces \BufferTools\ for efficient \ByteBuffer\ manipulation, \ReadPool\ for inbound data queuing, \BasicThreadFactory\ for thread management, and \GenericSSLContext\ for SSL configuration, alongside supporting types like \Cancelable\ and \ImmutableArray\.
core/src/main/scala/org/http4s/blaze/util · high confidence
Introduce new pipeline stage utilities and timeout logic
This change adds several new components to the \org.http4s.blaze.pipeline.stages\ package to support pipeline construction and management. It introduces \BasicTail\ as a concrete implementation of \TailStage\, \OneMessageStage\ for handling single-element ejection from the pipeline, and \ByteToObjectStage\ as a trait for decoding byte buffers into objects with buffer overflow protection. Additionally, it adds \TimeoutStageBase\ to provide the core logic for timeout-based pipeline shutdowns using a \TickWheelExecutor\, and \QuietTimeoutStage\ which extends this base to reset the timeout on every read or write operation, effectively shutting down the pipeline after a period of inactivity.
core/src/main/scala/org/http4s/blaze/pipeline/stages · high confidence
Introduction of core HTTP model abstractions and utilities
This change introduces the foundational types for the HTTP model within the \org.http4s.blaze.http\ package. It adds \BodyReader\ to handle asynchronous message body streaming and accumulation, \ALPNTokens\ to define known HTTP protocol strings (HTTP/1.1, h2, h2-14), and \HeaderNames\ to provide standard header constants along with validation logic for HTTP/2 header keys. Additionally, it defines basic type aliases for \Headers\, \Url\, and \Method\ in the package object, and includes a configuration flag \logsensitiveinfo\ to control the logging of sensitive request data.
http/src/main/scala/org/http4s/blaze/http · high confidence
New Blaze HTTP client and server examples
Added a suite of example applications in the com.example.http4s.blaze package demonstrating the Blaze HTTP server and client. These include basic HTTP server setup, SSL/TLS configuration with optional HTTP-to-HTTPS redirection, WebSocket communication (including echo and ping/pong patterns), and various client-side operations such as GET requests, JSON decoding, multipart POST uploads, and standard form POSTs.
examples/src/main/scala/com/example/http4s/blaze · high confidence
New HTTP client implementation with connection pooling and idle timeout support
The blaze-client module introduces a new HTTP client implementation featuring a \PoolManager\ for connection pooling, \Http1Connection\ for handling HTTP/1.1 requests, and an \IdleTimeoutStage\ to manage connection lifecycles. This change adds support for configuring execution contexts, channel options, and connection monitoring, replacing the previous client architecture with a more robust, stateful connection management system.
repository · high confidence
New example service with authentication and streaming capabilities
The examples module now includes a comprehensive ExampleService demonstrating key http4s features, including HTTP Basic Authentication, streaming responses, multipart form handling, and static file serving. The service also provides SSL/TLS configuration examples and demonstrates proper handling of HTTP methods like HEAD, along with content negotiation and error handling patterns.
examples/src/main/scala/com/example/http4s · high confidence
Removals
Removal of Grizzly and Netty example applications
The standalone example applications for the Grizzly and Netty server integrations have been removed from the codebase. Users can no longer run the \SimpleGrizzlyServer\ or \SimpleNettyServer\ entry points provided in these specific example modules, as the \Example.scala\ files for both \org.http4s.examples.grizzly\ and \org.http4s.examples.netty\ have been deleted.
examples/src/main/scala/org/http4s/examples/grizzly · high confidence
Removal of legacy ExampleRoute implementation
The \ExampleRoute.scala\ file, which contained a collection of example HTTP routes (such as ping, echo, stream, and challenge endpoints) built on the older Play Iteratee-based API, has been removed from the examples directory. This deletion reflects a broader refactoring of the http4s examples to migrate away from the deprecated \play.api.libs.iteratee\ dependencies and the \HttpChunk\/\Raw\ body model towards a newer, cleaner API structure.
examples/src/main/scala/org/http4s/examples · high confidence
Removal of legacy Jetty servlet example
The standalone example application demonstrating how to run http4s within a Jetty servlet container has been removed. Users relying on this specific file for a reference implementation of embedding http4s in a traditional Java servlet environment will no longer find this code in the examples directory.
examples/src/main/scala/org/http4s/examples/servlet · high confidence
Behavioural changes
1 commit (0 fixes) modifying examples/src/main/resources/clientauth
A change to existing behaviour in examples/src/main/resources/clientauth — 1 commit, 5 files.
examples/src/main/resources/clientauth · medium confidence · unverified
Add Scala 2.13 compatibility shim for collection conversions
Users running http4s on Scala 2.13 can now utilize the blaze HTTP client without compilation errors. A new compatibility object in the blaze internal package provides a bridge to \scala.jdk.CollectionConverters\, ensuring that internal code relying on Java collection interoperability works correctly on the newer Scala version.
core/src/main/scala-2.13 · high confidence
Added Scala 2.11/2.12 compatibility shim for Java collection conversions
A new compatibility object has been added to the core Blaze HTTP client module to provide a unified access point for Java collection conversions. This shim, located in the internal package, exposes the \scala.collection.JavaConverters\ object, ensuring that code relying on these conversions behaves consistently across Scala 2.11 and 2.12 versions.
core/src/main/scala-2.11-2.12 · high confidence
Blaze channel connection defaults and error handling improvements
The Blaze channel layer now sets the default maximum number of active connections to 512 and configures the default thread pool size based on the number of available CPU cores (minimum 4). Additionally, connection error handling has been refined to explicitly recognize and normalize specific 'broken pipe' and 'connection reset' messages from various operating systems and Java versions as standard EOF conditions, ensuring more consistent disconnect behavior for users.
core/src/main/scala/org/http4s/blaze/channel · high confidence
Blaze client refactored with new connection pooling and idle duration controls
The Blaze HTTP client implementation has been restructured to improve connection management and resource handling. A new \ConnectionManager\ abstraction (including \BasicManager\ and \PoolManager\) now handles connection lifecycle, replacing previous inline pooling logic. Users can now configure \maxIdleDuration\ via \BlazeClientBuilder\ to mitigate stale connections that may be closed while idling in the pool. The client also introduces a \BlazeClientState\ trait for monitoring pool metrics such as allocated connections and queue depths. Additionally, the builder has been updated to deprecate the \executionContext\ parameter in favor of \executionContextConfig\, and the retry logic for \SocketException\ is now explicitly configurable via a \retries\ parameter.
blaze-client/src/main/scala/org/http4s/blaze · high confidence
Blaze server refactoring and HTTP/1.1 compliance hardening
The Blaze server implementation has been restructured into a new package (org.http4s.blaze.server) and refactored to improve HTTP/1.1 RFC 9112 compliance and security. The HTTP parser now strictly rejects malformed requests, including those with both Transfer-Encoding and Content-Length headers, duplicate Content-Length headers, and obsolete line folding (obs-fold). WebSocket message sizes are now capped by default (4 MiB) to prevent resource exhaustion, with the limit configurable via BlazeServerBuilder. Additionally, the HTTP/2 implementation is deprecated, and the server builder API has been simplified by removing the deprecated withSSL/withSSLContext methods in favor of withSslContext and consolidating execution context configuration.
blaze-server/src/main/scala/org/http4s/blaze · high confidence
Deprecate HTTP/2 server implementation
The HTTP/2 server components, specifically the ALPN negotiation handler (ALPNServerSelector) and the prior-knowledge handshaker (ServerPriorKnowledgeHandshaker), are now deprecated and will be removed in a future version. Users relying on the built-in HTTP/2 server support should be aware that this functionality is unmaintained.
http/src/main/scala/org/http4s/blaze/http/http2/server · high confidence
Deprecate legacy BlazeClientBuilder aliases
The \BlazeClientBuilder\ type alias and companion object in the \org.http4s.client.blaze\ package are now deprecated as of version 0.22. Users should migrate to \org.http4s.blaze.client.BlazeClientBuilder\ to ensure compatibility with future releases.
blaze-client/src/main/scala/org/http4s/client · high confidence
Deprecated aliases added for legacy Blaze server builder
The \org.http4s.server.blaze\ package now includes deprecated type and value aliases for \BlazeServerBuilder\ that point to the new \org.http4s.blaze.server.BlazeServerBuilder\. These aliases are marked for removal in version 0.22, signaling to users that they should migrate their imports and usage to the new package location.
blaze-server/src/main/scala/org/http4s/server · high confidence
HTTP/2 implementation marked as deprecated
The HTTP/2 implementation in the \blaze\ module is now deprecated and will be removed in a future version (0.23.18). All core components in this area—including \ConnectionImpl\, \FrameDecoder\, \FrameEncoder\, \PriorKnowledgeHandshaker\, and related stream and header handling classes—have been annotated with a deprecation notice indicating that HTTP/2 support is unmaintained.
http/src/main/scala/org/http4s/blaze/http/http2 · high confidence
New Java HTTP/1.1 parser implementation
The HTTP/1.1 parser has been rewritten in Java (replacing the previous Scala implementation) within the \org.http4s.blaze.http.parser\ package. This change introduces a new set of parser classes (\Http1ServerParser\, \Http1ClientParser\, \BodyAndHeaderParser\) that handle request and response line parsing, header validation, and chunked transfer encoding. The new parser enforces stricter validation, such as requiring valid tchar characters in header names and ensuring header values are present, and includes a fix for a chunked transfer-encoding bug. Users will experience a native Java parsing layer with updated error handling via \BaseExceptions\.
http/src/main/java · high confidence
New WebSocket implementation with Ping/Pong support and message size limits
The Blaze WebSocket stage has been replaced with a new implementation that introduces a dedicated \Http4sWSStage\ to handle the WebSocket lifecycle. This change adds support for receiving Ping messages from clients (and automatically replying with Pongs) and allows applications to handle Pong messages, which were previously ignored. It also enforces a cap on aggregate WebSocket message sizes, closing the connection with a 1009 status code if the limit is exceeded, and improves protocol compliance by properly handling reserved and unknown opcodes.
blaze-core/src/main/scala/org/http4s/blazecore/websocket · high confidence
New pipeline builder API with LeafBuilder and TrunkBuilder
The pipeline construction API has been refactored to use explicit builder types. Users now build pipelines using \LeafBuilder\ (starting from a Tail) and \TrunkBuilder\ (starting from a MidStage), which provide methods like \prepend\, \append\, \base\, and \cap\ to assemble stages. This replaces the previous implicit or less structured stage linking mechanism, enforcing that stages are fresh (not already part of a pipeline) when added and providing clearer separation between head, mid, and tail stages.
core/src/main/scala/org/http4s/blaze/pipeline · high confidence
Refactor HTTP/1.1 connection handling and add response header timeout
The Blaze HTTP/1.1 implementation now strictly follows RFC 9112 for connection persistence, updating the logic in Http1Stage to correctly interpret Connection headers and manage keep-alive behavior. A new ResponseHeaderTimeoutStage has been introduced to enforce timeouts on incoming response headers, configurable via the builder. Additionally, the BlazeBackendBuilder trait now exposes methods to configure standard socket options (such as SO\_KEEPALIVE, TCP\_NODELAY, and buffer sizes) directly through the builder API.
blaze-core/src/main/scala/org/http4s/blazecore · high confidence
Refactor parasitic execution context compatibility layer
The internal compatibility layer for obtaining a parasitic execution context has been renamed from XCompat to ParasiticExecutionContextCompat. This change updates the implementation in the Scala 2.12 and Scala 3 specific source directories to use the new trait name, ensuring consistent internal naming for the utility that provides a trampolined or parasitic execution context depending on the Scala version.
blaze-core/src/main/scala-2.12, blaze-core/src/main/scala-3 · high confidence
Refactored HTTP/1.1 and HTTP/2 response writing utilities
The \blaze-core/src/main/scala/org/http4s/blazecore/util\ package has been restructured to improve the handling of HTTP response bodies. New writer implementations have been introduced, including \BodylessWriter\ for discarding entity bodies, \CachingChunkWriter\ for buffering and optimizing chunked responses, \FlushingChunkWriter\ for immediate flushing, and \IdentityWriter\ for strict content-length enforcement. The \Http1Writer\ trait now coordinates header and body writing with better error handling via \guaranteeCase\, while \Http2Writer\ has been deprecated as HTTP/2 support is unmaintained. Utility objects like \ChunkWriter\ and \EntityBodyWriter\ provide shared logic for encoding chunks and managing stream compilation, and a new \fromFutureNoShift\ helper optimizes internal future handling by avoiding unnecessary execution context shifts.
blaze-core/src/main/scala/org/http4s/blazecore/util · high confidence
Refactored NIO1 channel implementation with dedicated acceptor and worker thread pools
The NIO1 networking layer has been restructured to separate acceptor and worker responsibilities into distinct thread pools. A new \FixedSelectorPool\ manages round-robin distribution of \SelectorLoop\ instances, while \NIO1SocketServerGroup\ now accepts these pools to configure server behavior. This change introduces a dedicated acceptor pool (defaulting to a single thread) for handling incoming connections and a configurable worker pool for processing I/O events, improving resource isolation and allowing users to tune thread counts and buffer sizes independently.
core/src/main/scala/org/http4s/blaze/channel/nio1 · high confidence
Use parasitic ExecutionContext for Scala 2.13
The Blaze HTTP client now utilizes Scala 2.13's native \ExecutionContext.parasitic\ for internal execution contexts. This change, implemented via a new compatibility trait in the Scala 2.13-specific source directory, replaces previous workarounds to leverage the standard library's optimized, non-forking execution context, improving performance and reducing overhead for fire-and-forget tasks.
blaze-core/src/main/scala-2.13 · high confidence
Test coverage
1 commit adding/updating tests in blaze-server/src/test/resources; Added HTTP/2 mock utilities for testing; Added MUnit-based test suites for blaze-core utilities; Added MUnit-based tests for blaze channel options and lifecycle; Added Scala 2.13-specific Blaze client test suite; Added comprehensive test suite for HTTP/2 implementation; Added comprehensive test suites for the Blaze HTTP client; Added test for ClientChannelFactory timeout behavior; Added test infrastructure and utilities for Blaze core; Added test suite for blaze pipeline stages; Added test suites and benchmarks for HTTP parsers; Added test suites for BodyReader and HeaderNames validation; Added test utilities and specs for HTTP/1 writer implementations; Added tests for Blaze server mTLS support and HTTP/1.1 connection handling; Added unit tests for WebSocket handshake and stage behavior; New BlazeTestSuite base class for HTTP4s Blaze tests.
Dependencies
Initial build configuration for http4s project
The project now defines its build structure using a modernized sbt setup (version 1.13.0). This includes a centralized dependency management file specifying core libraries such as async-http-client 3.0.13, logback-classic 1.2.13, and the MUnit testing framework (1.0.0-M6). The build also integrates several sbt plugins, including sbt-buildinfo for generating build metadata, sbt-java-formatter for code style enforcement, sbt-revolver for hot-reload development, and sbt-http4s-org for project organization.
project · high confidence
Update build dependencies and Scala versions
The build configuration has been updated to use Scala 2.12.21, 2.13.18, and 3.3.8, with 2.13 set as the default version. Key library dependencies have been bumped, including http4s to 0.23.37, circe-generic to 0.14.16, and munit-cats-effect to 2.2.0. The project now targets Java 8 exclusively and adopts the sbt-http4s-org plugin for standardized build settings.
(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
Baseline
- First survey — no prior run to compare against. CAI 48.
Lenses
- Code Health 92
- Architecture 79
- Maturity 55
- Readiness 37
- Security 50
Changes since last survey
- 300 commits — 295 feature/other, 5 fixes
By area
- (repo) — 137 commits
- (root) — 51 commits
- project/build.properties — 37 commits
- project/plugins.sbt — 25 commits
- project/Dependencies.scala — 15 commits
- .github/workflows — 14 commits
- blaze-server/src — 10 commits
- http/src — 6 commits
- blaze-core/src — 4 commits
- blaze-client/src — 1 commit
Notable commits
- fix: Fix Connection persistence according to RFC 9112
- fix: Fix MiMa issues
- fix: Fix Scalafix
- fix: Fix compilation for Scala 2.13.13
- fix: Fix tests to reflect tightened parsers
- change: Address the fs2.io.net.Network API changes
- change: CachingStaticWriter must write the status line and headers before the body
- change: Deprecate HTTP/2 implementation
- change: Merge branch 'series/0.23' into update/series/0.23/scala-library-2.12.20
- change: Merge branch 'series/0.23' into update/series/0.23/scala-library-2.13.12
- change: Merge branch 'series/0.23' into update/series/0.23/scala-library-2.13.13
- change: Merge branch 'series/0.23' into update/series/0.23/scala-library-2.13.13
- change: Merge branch 'series/0.23' into update/series/0.23/scala3-library-3.3.1
- change: Merge pull request #1001 from http4s/update/series/0.23/scala-library-2.12.21
- change: Merge pull request #1003 from http4s/update/series/0.23/async-http-client-3.0.5
- change: Merge pull request #1007 from http4s/update/series/0.23/async-http-client-3.0.6
- change: Merge pull request #1008 from http4s/update/series/0.23/sbt-1.12.0
- change: Merge pull request #1011 from http4s/update/series/0.23/sbt-1.12.1
- change: Merge pull request #1013 from http4s/update/series/0.23/async-http-client-3.0.7
- change: Merge pull request #1015 from http4s/update/series/0.23/sbt-http4s-org-2.0.5
- …and 280 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
http4s/blaze 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 20 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 c23b976a4f5a985320cc22c9708ba270e6048524 — 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-b51f968c9b10.