coil-kt/coil
53.3
Adequate · 25 September 2026
20.7k
lines of production code
Kotlin
primary language
4
measurements over time
What this system is
This system is Coil 3, a Kotlin Multiplatform image loading library that provides a unified API for loading, caching, and displaying images across Android, iOS, JVM, JS, and WebAssembly targets. It features a modernized, Compose-centric architecture with native support for animated GIFs, SVGs, and video frame extraction, while offering extensible network integration via OkHttp and Ktor. The library manages image lifecycle, memory, and disk caching through a stable singleton pattern and supports advanced features like HTTP cache control and crossfade transitions.
How it got here
2019 — Coil 3.6.3 API restructuring and modernization
41 changes.
This period focused on a major architectural overhaul of the Coil library, removing legacy builder-based APIs, singleton patterns, and internal implementation details in favor of a unified ImageRequest model and explicit initialization. The release also included significant infrastructure updates, such as migrating the sample app to modern Android components, upgrading the Gradle wrapper, and introducing a Bill of Materials for dependency management.
2020–2024 — Coil 3 multiplatform release
69 changes.
This period focused on the development and stabilization of Coil 3, establishing a comprehensive Kotlin Multiplatform architecture with support for JVM, Android, iOS, JS, and WebAssembly. The work involved defining stable public APIs for core image loading, Compose integration, and specialized modules for GIF, video, and SVG handling, while introducing a new extensible network layer. Extensive testing infrastructure, including snapshot and instrumentation tests, was built to ensure cross-platform compatibility and performance.
2025–2026 — ES module support and test stabilization
8 changes.
This period focused on enabling ES module compatibility in Node.js and verifying image decoding in JS environments, alongside migrating the Android sample to the new KMP Gradle plugin. Significant effort was also directed at stabilizing browser tests by addressing WASM loading issues and expanding test coverage for Android Compose components and lint rules.
Features
Add Compose Multiplatform sample app
A new Compose Multiplatform sample application has been added to the repository, demonstrating image loading with Coil across Android, iOS, JVM, JS, and Wasm targets. The app features a Material 3 UI with adaptive image grids, handles platform-specific insets and back navigation, and includes resource symlinks for shared assets.
samples/compose · high confidence
Add HTTP Cache-Control support for image caching
The new \coil-network-cache-control\ module introduces a \CacheControlCacheStrategy\ that enables Coil to respect HTTP \Cache-Control\ headers (such as \max-age\, \no-cache\, and \immutable\) when deciding whether to serve cached images or fetch new ones. This implementation, based on OkHttp's caching logic, allows applications to leverage server-side cache directives for more efficient image loading and reduced network usage.
coil-network-cache-control/src/commonMain · high confidence
Add Ktor 3 network integration for Coil 3
This change introduces the \coil-network-ktor3\ module, providing a new network fetcher implementation built on Ktor 3. It includes the \KtorNetworkFetcher\ and its factory functions, allowing users to configure HTTP clients with optional cache strategies, connectivity checks, and concurrent request strategies. The module registers itself via ServiceLoader on JVM, JS, Native, and WasmJS platforms, enabling automatic discovery of the Ktor 3 network client within the Coil image loading pipeline.
coil-network-ktor3/src · high confidence
Add internal macro-benchmark suite for startup and scrolling performance
The internal/benchmark module now includes a new set of macro-benchmark tests to measure application startup and scrolling performance. This suite introduces a BaselineProfileBenchmark to compare compilation modes (None, Partial with Baseline Profile, and Full), a BaselineProfileGenerator to create baseline profiles by interacting with the sample app, and a ScrollBenchmark that measures frame timing and specific trace sections (such as image painting) during list scrolling. These changes provide internal visibility into performance characteristics under different compilation and runtime conditions.
internal/benchmark · high confidence
Add shared sample app components for image and video handling
The shared sample module now includes core data models and view-model logic to support image and video display. A new Image data class carries URI, dimensions, color, and Coil 3 extras (such as video frame timestamps). The MainViewModel manages navigation between a list and detail screen, loads images from JSON resources, and generates synthetic video frames with associated metadata. The Screen sealed interface defines List and Detail states, with Detail carrying the selected image and an optional Coil memory-cache placeholder key.
shared · high confidence
Android test utilities now include dedicated test activities and bitmap comparison helpers
The internal test utilities for Android now provide a complete runtime environment for testing image loading, including \ComposeTestActivity\ and \ViewTestActivity\ declared in the AndroidManifest and implemented in Kotlin, along with the supporting layout and theme resources. Additionally, the \bitmaps.android.kt\ module introduces \getPixels()\ and \computeSimilarity()\ functions that allow tests to compare bitmap pixel data across ARGB channels, while \utils.android.kt\ adds robust helpers for decoding bitmaps from resources and assets with retry logic for emulator stability.
internal/test-utils/src/androidMain · high confidence
Initial public API dump for the coil-test library
The coil-test/api location now includes the initial ABI dump (coil-test.klib.api) for the coil-test library, exposing the public API surface for targets including iosArm64, iosSimulatorArm64, js, linuxArm64, linuxX64, macosArm64, and wasmJs. This dump documents the \FakeImage\ class and the \FakeImageLoaderEngine\ class (along with its \Builder\, \RequestValue\, and \ResultValue\ inner types), which serve as test utilities for simulating image loading and interception in Coil 3.
coil-test/api · high confidence
Introduce Coil Bill of Materials (BOM) module
A new \coil-bom\ module has been added to the project, providing a unified Bill of Materials for all public Coil artifacts. This allows consumers to import the BOM in their build configuration to manage dependency versions centrally, ensuring consistency across the library's modules without needing to specify individual versions for each artifact.
(dependencies) · high confidence
Introduce Ktor 2 network integration with concurrent request support
The Ktor 2 networking module has been split into its own artifact, providing a new \KtorNetworkFetcherFactory\ that allows users to configure network fetching with an \HttpClient\, \CacheStrategy\, \ConnectivityChecker\, and a new \ConcurrentRequestStrategy\. This strategy enables the library to await in-flight requests for the same resource, reducing redundant network traffic. The implementation includes platform-specific optimizations for JVM (using \RandomAccessFile\ for direct file channel writes) and non-JVM targets, and registers the fetcher via ServiceLoader for automatic discovery.
coil-network-ktor2/src · high confidence
Introduce OkHttp network fetcher for Coil 3
The coil-network-okhttp module now provides an OkHttp-based network fetcher for Coil 3, allowing users to fetch images using the OkHttp client. This includes a new \OkHttpNetworkFetcherFactory\ that supports lazy initialization of the \Call.Factory\, custom cache strategies, connectivity checking, and concurrent request strategies. The implementation wraps OkHttp responses into Coil's \NetworkClient\ and \NetworkResponseBody\ abstractions, and registers itself via ServiceLoader for automatic discovery. Android-specific tests verify integration with memory and disk caches, custom cache keys, and lazy initialization behavior.
coil-network-okhttp · high confidence
Introduce coil-network-cache-control module for HTTP cache support
A new \coil-network-cache-control\ module has been added, providing the \CacheControlCacheStrategy\ class to implement HTTP Cache-Control header support. This class implements the \CacheStrategy\ interface and exposes \read\ and \write\ methods for managing network responses and requests, available across JVM and multiplatform targets (iOS, Linux, macOS, JS, WASM).
coil-network-cache-control/api · high confidence
Lint warning for mistaken kotlin.error() usage in ImageRequest.Builder
The coil-lint module now includes a new detector that warns when Kotlin's standard library \error()\ function is used inside an \ImageRequest.Builder\ lambda (such as within \ImageView.load { }\). This common mistake, often caused by missing the \coil3.request.error\ import, causes the app to throw an \IllegalStateException\ at runtime instead of setting an error image. The new lint check helps developers catch this issue early by suggesting the correct Coil extension function.
coil-lint · high confidence
New coil-network-core public API surface for network abstraction
The coil-network-core module now exposes a stable public API defining the core network abstractions used by Coil. This includes the \NetworkClient\ interface for executing HTTP requests, \NetworkRequest\ and \NetworkResponse\ classes for carrying request data and response metadata (including \requestMillis\ and \responseMillis\), and \NetworkHeaders\/\NetworkRequestBody\/\NetworkResponseBody\ for handling HTTP content. The API also introduces \CacheStrategy\ for controlling caching behavior, \ConnectivityChecker\ for online/offline detection, and \ConcurrentRequestStrategy\ (with a \DeDupeConcurrentRequestStrategy\ implementation) to coordinate in-flight requests. Additionally, extension functions in \ImageRequestsKt\ allow setting HTTP method, headers, and body on image requests, and \NetworkFetcher\ provides the fetcher implementation that ties these components together.
coil-network-core/api · high confidence
New extensible network core with configurable caching and request coordination
The coil-network-core module introduces a new, extensible network layer that replaces the previous internal implementation. Users can now configure how network responses are cached via the new CacheStrategy interface, which controls read/write behavior to the disk cache. The system also supports de-duplicating concurrent requests for the same key through the ConcurrentRequestStrategy interface, reducing redundant network traffic. Additionally, a ConnectivityChecker interface allows applications to control whether network requests are executed based on device online status, and the NetworkFetcher now integrates these components to provide more granular control over network fetching, caching, and error handling.
coil-network-core/src/commonMain/kotlin/coil3/network · high confidence
New iOS sample app for the Compose integration
The samples directory now includes a complete iOS application (CoilSample) that demonstrates the Kotlin Multiplatform Compose integration. This new sample provides the Xcode project structure, Swift UI wrappers, and asset configurations necessary to run the Compose app on iOS devices, alongside shared ProGuard rules for Android.
samples · high confidence
New public API for video frame extraction and MediaDataSource support
The coil-video module now exposes a stable public API for video-specific operations. Users can extract video frames by index, time in microseconds/milliseconds, percentage, or specific options via new extension functions on ImageRequest and Options. Additionally, the module introduces VideoFrameDecoder for decoding frames and MediaDataSourceFetcher to support fetching video data from Android's MediaDataSource implementations.
coil-video/api · high confidence
New video frame extraction options and MediaDataSource support
The video module now supports extracting video frames by specific index (Android 28+), time in milliseconds/microseconds, or percentage of duration, giving users precise control over which frame is captured. It also introduces the ability to prefer embedded thumbnails from video files when available, which can improve performance and visual quality. Additionally, a new MediaDataSourceFetcher allows decoding video frames directly from MediaDataSource objects, expanding the types of data sources the library can handle.
coil-video/src/main/java/coil3/video · high confidence
Non-Android Compose image rendering and validation support
This change introduces the missing implementation layer for Coil's Compose integration on non-Android platforms (such as iOS, macOS, and desktop). It enables image drawing on Canvas by providing the \Image.asPainter\ conversion logic and a native canvas accessor, implements crossfade animation support via \AsyncImagePainter\ state handling, and adds request validation to ensure \target\ is null on these platforms. This allows developers to use the same Compose image APIs on non-Android targets as they do on Android.
coil-compose-core/src/nonAndroidMain · high confidence
Public SVG parser interface and configurable SvgDecoder
The coil-svg module now exposes a public \Svg.Parser\ interface, allowing users to provide custom SVG parsing implementations via \SvgDecoder.Factory\. The \SvgDecoder\ and its factory have been updated to accept this parser, along with new configuration options for density handling (\density\, \scaleToDensity\) and intrinsic sizing (\useViewBoundsAsIntrinsicSize\). This change enables greater flexibility in how SVGs are decoded and rendered within the Coil image loading library.
coil-svg/api · high confidence
SVG rendering now supports deferred draw-time rendering and custom CSS injection
The SVG decoder now offers a \renderToBitmap\ option (enabled by default) that allows SVGs to be rendered at draw time instead of immediately as bitmaps, improving memory efficiency for complex images. Additionally, users can now inject custom CSS rules into SVGs via the \css\ extension on image requests, and the decoder exposes a public \Svg.Parser\ interface to enable custom SVG parsing implementations.
coil-svg/src · high confidence
Stabilize public Image APIs with SingletonImageLoader
The public API surface for image loading is now stabilized, introducing the \SingletonImageLoader\ class and its associated \Factory\ interface to manage global image loader instances. This change exposes Kotlin extension functions for Android (such as \load\ on \ImageView\ and \getImageLoader\ for \Context\) and JVM platforms, allowing users to easily load images into views and retrieve results using a centralized loader instance.
coil/api/android · high confidence
Stabilized Image API and added JVM-specific ImageLoaders utilities
The JVM API surface is now stabilized, introducing the \coil3.Image\ interface with a \draw\ method for Canvas rendering and concrete implementations like \BitmapImage\ and \ColorImage\. The \ImageLoader\ builder now exposes explicit \coroutineContext\ and \decoderCoroutineContext\ configuration options, and the \ImageLoaders\ companion object provides a new \executeBlocking\ utility for synchronous image loading on the JVM.
coil-core/api/jvm · high confidence
Video library now supports service loader discovery
The video extension now registers its internal components via Java ServiceLoader, allowing the Coil framework to automatically discover and use the video frame decoder and media data source fetcher without explicit configuration. This change adds META-INF service provider files for coil3.video.internal.VideoFrameDecoderServiceLoaderTarget and coil3.video.internal.MediaDataSourceFetcherServiceLoaderTarget, enabling seamless integration of video capabilities into the core library.
coil-video/src/main/resources · high confidence
Removals
Removal of BuilderMarker DSL annotation
The \BuilderMarker\ annotation, previously used to restrict calling outer scopes in DSL builder classes, has been removed from the \coil.annotation\ package. This change eliminates the specific DSL scoping marker that was previously available for library consumers.
coil-base/src/main/java/coil/annotation · high confidence
Removal of CoilContentProvider
The CoilContentProvider class has been removed from the coil-default module. This eliminates the automatic initialization of the Coil singleton via an Android ContentProvider, requiring users to ensure Coil is initialized through other means if they were relying on this mechanism.
coil-default/src/main/java/coil/util · high confidence
Removal of CrossfadeDrawable implementation
The \CrossfadeDrawable\ class, which previously handled crossfading transitions between two drawables, has been removed from the \coil-base\ module. This change eliminates the built-in crossfade capability provided by this specific drawable implementation.
coil-base/src/main/java/coil/drawable · high confidence
Removal of GlobalLifecycle and LifecycleCoroutineDispatcher
The internal \GlobalLifecycle\ fallback implementation and the \LifecycleCoroutineDispatcher\ have been removed from the lifecycle module. This eliminates the previous mechanism that queued coroutine work while a lifecycle was not started and provided a permanent 'resumed' lifecycle fallback, simplifying the internal lifecycle handling.
coil-base/src/main/java/coil/lifecycle · high confidence
Removal of ImageLoader extension functions
The \ImageLoaders.kt\ file containing extension functions for \ImageLoader\ (such as \load\ and \get\ for various data types like String, Uri, File, and Drawable) has been removed. Users can no longer call these convenience methods directly on \ImageLoader\ instances and must instead use the explicit builder classes (\LoadRequestBuilder\ and \GetRequestBuilder\) to construct requests.
coil-base/src/main/java/coil/api · high confidence
Removal of MovieDrawable GIF rendering implementation
The MovieDrawable class, which was responsible for rendering animated GIFs using Android's legacy Movie API, has been removed from the coil-gif module. This eliminates the software-based canvas rendering path and associated scaling logic for GIFs, aligning with the library's preference for using ImageDecoderDecoder and AnimatedImageDrawable on Android P and above.
coil-gif/src/main/java/coil/drawable · high confidence
Removal of built-in image transformations
The built-in image transformation classes—BlurTransformation, CircleCropTransformation, GrayscaleTransformation, and RoundedCornersTransformation—have been removed from the coil-base module. Users can no longer apply these effects directly via the transformation API; these capabilities must now be implemented externally or handled through other means such as Jetpack Compose clipping.
coil-base/src/main/java/coil/transform · high confidence
Removal of internal BitmapPool implementation
The internal BitmapPool interface and its RealBitmapPool implementation have been removed from the coil-base module. This change eliminates the local bitmap object pooling logic, which previously managed bitmap reuse and memory limits via an LRU eviction policy, from this specific code location.
coil-base/src/main/java/coil/bitmappool · high confidence
Removal of internal collection utilities
The internal collection utilities in the coil-base module have been removed. Specifically, the \ArrayUtils\ object, the \GroupedLinkedMap\ class, and the \SparseIntArraySet\ class along with its extension functions in \SparseIntArraySets\ have been deleted from the codebase. This change eliminates these specific data structure implementations from the library's internal storage layer.
coil-base/src/main/java/coil/collection · high confidence
Removal of internal network connectivity monitoring classes
The internal classes responsible for monitoring device network state—specifically \NetworkObserver\, \NetworkObserverStrategy\, and \HttpException\—have been removed from the \coil.network\ package. This eliminates the library's built-in mechanism for detecting online/offline connectivity changes and the associated exception type, meaning any logic previously handled by these internal observers is no longer present in this module.
coil-base/src/main/java/coil/network · high confidence
Removal of internal utility and logging infrastructure
The internal utility layer in coil-base has been removed, deleting files that previously handled logging (CoilLogger, Logs), context helpers (Contexts), bitmap and memory calculations (Utils, Extensions), and coroutine callbacks (ContinuationCallback). This eliminates the internal logging mechanism and several helper functions used for memory/cache sizing and context resolution within this module.
coil-base/src/main/java/coil/util · high confidence
Removal of legacy Coil and ImageView extension functions
The legacy extension functions for loading images via the \Coil\ singleton and \ImageView\ instances have been removed from the \coil.api\ package. This deletion eliminates the convenience methods that previously allowed direct calls like \Coil.load()\ or \imageView.load()\, requiring users to migrate to the newer \ImageLoader\ API for image loading operations.
coil-default/src/main/java/coil/api · high confidence
Removal of legacy GIF and animated WebP decoders
The \GifDecoder\ (which used the deprecated \android.graphics.Movie\ API) and \ImageDecoderDecoder\ (which used the Android P+ \ImageDecoder\ API) have been removed from the \coil-gif\ module. This eliminates the manual decoding logic for GIF and animated WebP images, implying that support for these formats is now handled by a different component or module within the library.
coil-gif/src/main/java/coil/decode · high confidence
Removal of legacy Target and ViewTarget interfaces
The legacy \Target\, \ViewTarget\, and \PoolableViewTarget\ interfaces, along with the \ImageViewTarget\ implementation, have been removed from the \coil.target\ package. This change eliminates the previous mechanism for handling image load results and bitmap pooling via these specific interfaces, requiring users to adopt the updated request and target APIs.
coil-base/src/main/java/coil/target · high confidence
Removal of legacy data mapping interfaces and implementations
The \coil.map\ package has been removed, eliminating the legacy \Mapper\ and \MeasuredMapper\ interfaces along with their built-in implementations (\FileMapper\, \HttpUriMapper\, \StringMapper\). This change removes the previous mechanism for converting raw data types (such as \File\, \String\, or \Uri\) into fetcher-compatible types, indicating a shift in how the library handles data ingestion and source resolution.
coil-base/src/main/java/coil/map · high confidence
Removal of legacy decode infrastructure classes
The \BitmapFactoryDecoder\, \DataSource\, \DecodeResult\, \DecodeUtils\, \Decoder\, \DrawableDecoderService\, \EmptyDecoder\, and \Options\ classes have been removed from the \coil.decode\ package. This cleanup eliminates legacy decoding logic and utility classes that are no longer part of the active image pipeline, simplifying the library's internal architecture.
coil-base/src/main/java/coil/decode · high confidence
Removal of legacy fetcher and result classes
The \coil.fetch\ package has removed several internal classes: \BitmapFetcher\, \DrawableFetcher\, \ResourceFetcher\, \UriFetcher\, and \HttpUrlFetcher\, along with the \Fetcher\ interface and \FetchResult\ sealed class hierarchy (\SourceResult\, \DrawableResult\). This cleanup eliminates the previous mechanism where fetchers translated data into either a \BufferedSource\ or a \Drawable\ directly, simplifying the internal fetching architecture.
coil-base/src/main/java/coil/fetch · high confidence
Removal of legacy size resolution classes and enums
The \DisplaySizeResolver\, \Scale\, \Size\, \SizeResolver\, and \ViewSizeResolver\ classes in the \coil.size\ package have been removed. This eliminates the previous API for defining image target sizes and resolving view dimensions, indicating a shift in how image sizing is handled within the library.
coil-base/src/main/java/coil/size · high confidence
Removed redundant configuration files from the sample app
The coil-sample module no longer includes the .gitignore file (which previously excluded the /build directory) and the shrinker-rules.pro file (which contained ProGuard configuration rules). These files have been deleted as they are considered redundant for the sample project.
coil-sample · high confidence
API
Introduce coil-gif API surface for animated image support
The coil-gif module now exposes its public API, defining the core classes and functions required to handle animated GIFs. This includes the \AnimatedImageDecoder\ and \GifDecoder\ for decoding, \MovieDrawable\ for rendering with animation callbacks, and \AnimatedTransformation\ for applying effects. The API also provides builder extensions in \ImageRequestsKt\ to configure repeat counts and animation start/end callbacks on requests, alongside utility functions in \DecodeUtilsKt\ to detect animated formats like HEIF and WebP.
coil-gif/api · high confidence
Public API surface for SVG decoding on JVM and Android
This change introduces the public API definitions for SVG support in the JVM and Android modules of coil-svg. On Android, the API exposes \SvgDecoder\ and \SvgDecoder.Factory\ which accept a \Svg.Parser\ for custom parsing, along with options for density scaling (\scaleToDensity\), bitmap rendering (\renderToBitmap\), and CSS configuration. On the JVM, the API provides equivalent \SvgDecoder\ and \SvgDecoder.Factory\ classes using the JetBrains Skia SVG backend instead of Android's native SVG library. Both platforms expose the core \Svg\ interface, \Svg.ViewBox\ data class, and utility functions like \isSvg\ and \getCss\, enabling developers to integrate SVG decoding into image loading pipelines with consistent configuration options across platforms.
coil-svg/api/jvm · high confidence
Stabilized Coil 3 Android API surface
The Android-specific public API for Coil 3 has been stabilized and published, defining the official contract for developers. This release introduces the core \Image\ interface and its implementations (\BitmapImage\, \ColorImage\, \DrawableImage\), alongside the \ComponentRegistry\ for managing decoders, fetchers, and interceptors. The \ImageLoader\ builder now exposes explicit configuration for coroutine contexts (including separate contexts for decoding and fetching) and disk caching policies. Additionally, the new \Extras\ system allows passing arbitrary typed data through requests, and the \EventListener\ API provides detailed lifecycle hooks for monitoring image loading stages.
coil-core/api/android · high confidence
Updated public API surface for coil-core
The public API dump for coil-core has been updated to reflect recent changes, including the addition of \cleanupCoroutineContext\ to \DiskCache.Builder\, the introduction of \DataSource\ and \CachePolicy\ enums, and the definition of core interfaces like \Mapper\, \Keyer\, \Decoder\, \Fetcher\, and \Interceptor\. This change ensures the binary compatibility validation reflects the current state of the library's public contract for targets including iOS, Linux, macOS, JS, and wasmJs.
coil-core/api · high confidence
Behavioural changes
Adjust test timeouts and add Chrome launcher for flakiness mitigation
The test configuration has been updated to reduce flakiness by increasing browser activity, disconnect, and capture timeouts to 400 seconds, setting the Mocha test timeout to 60 seconds, and delaying the process exit by 5 seconds to ensure logs are fully captured. Additionally, a custom Chrome launcher for compose tests has been added with specific flags to enable WebGL and bypass sandbox restrictions.
coil-core/karma.config.d · high confidence
Android sample app manifest and shared resource linkage
The Android sample app now includes an explicit AndroidManifest.xml that declares network permissions, sets the main activity as the launcher entry point, and enables the back-invoked callback for improved navigation handling. Additionally, the app's assets directory is linked to the shared common resources, allowing the sample to access shared assets directly.
samples/view/src/main · high confidence
Android-specific image rendering and request validation in Compose
This change introduces Android-specific implementations for the Compose image pipeline. It adds \AsyncImagePainter\ logic to handle crossfade transitions between image states and implements \Image.asPainter\ to correctly render \BitmapImage\ and \DrawableImage\ types using Compose-compatible painters. Additionally, it defines \LocalPlatformContext\ to provide the Android \Context\ to the Compose hierarchy and enforces validation that prevents setting \target\ or \lifecycle\ properties on image requests within the Compose layer.
coil-compose-core/src/androidMain/kotlin · high confidence
AsyncImage API overhaul with crossfade, restart, and preview support
The Coil Compose API for JVM has been significantly restructured to enhance image handling and developer experience. Users can now enable smooth crossfade transitions between subsequent image results via the public CrossfadePainter, and manually restart image loading using the new AsyncImagePainter.restart() method. The AsyncImage and SubcomposeAsyncImage composables now support disabling clipToBounds for more flexible layout control. Additionally, image requests in Android Studio previews are handled via the new LocalAsyncImagePreviewHandler composition local, and model equality is customizable through the AsyncImageModelEqualityDelegate composition local. The API also exposes ConstraintsSizeResolver and DrawScopeSizeResolver for advanced sizing control.
coil-compose-core/api/android, coil-compose-core/api/jvm · high confidence
AsyncImage rendering and performance improvements
AsyncImage now uses a custom Modifier.Node-based implementation (ContentPainterModifier) to handle painting, which improves performance and fixes crashes when measuring images with inverted constraints or when the parent uses IntrinsicSize. The component no longer automatically waits for draw size before rendering, allowing images to appear sooner. Additionally, ImageRequests are now correctly recreated when ContentScale changes to or from None, and the internal coroutine dispatching logic has been simplified to remove reliance on Dispatchers.Main.immediate.
coil-compose-core/src/commonMain/kotlin/coil3/compose/internal · high confidence
Bitmap pool strategy selection logic removed
The internal logic for selecting a bitmap pooling strategy based on Android SDK version has been removed. The \BitmapPoolStrategy\ interface, along with its implementations (\AttributeStrategy\, \SizeConfigStrategy\, and \SizeStrategy\) and the factory logic that chose between them, has been deleted from the codebase.
coil-base/src/main/java/coil/bitmappool/strategy · high confidence
Coil 3.6.3 release and repository documentation overhaul
This release (3.6.3) fixes build failures with Android Gradle Plugin 9.4.0 and R8 caused by invalid characters in Kotlin module name metadata. The repository documentation has been significantly updated: the main README now targets Compose Multiplatform and lists translations in nine languages (Japanese, Korean, Russian, Swedish, Turkish, Chinese, Persian, Uzbek), while new files (AGENTS.md, CLAUDE.md, GEMINI.md) provide AI assistant guidelines. The release process is now documented in RELEASING.md, and the deploy\_docs.sh script has been refactored to use a new assemble\_docs.sh helper, explicitly copy translated READMEs, and build the Compose WASM sample.
(repo-wide) · high confidence
Consolidation of LoadRequest and GetRequest into ImageRequest
The distinct LoadRequest and GetRequest classes, along with their corresponding builders and the RequestDisposable interface, have been removed from the coil.request package. This change merges the previous load and get request types into a unified ImageRequest, simplifying the API by eliminating the need to choose between separate request types for loading images into views versus retrieving raw image data.
coil-base/src/main/java/coil/request · high confidence
Enable GIF decoding via Java ServiceLoader
The coil-gif module now registers its decoder implementation through the standard Java ServiceLoader mechanism. By adding a service provider configuration file, the GIF decoder is automatically discovered and available without requiring explicit manual registration, simplifying integration for users relying on service-based discovery.
coil-gif/src/main/resources · high confidence
Improved GIF playback performance on older Android versions
Animated GIFs now play more smoothly on devices running Android 33 and below by enforcing a minimum frame delay. The library introduces a new internal mechanism that rewrites GIF frame delays below a 20ms threshold to 100ms during decoding, preventing excessively fast playback. This behavior is applied automatically via the GifDecoder on older Android versions (API \< 28), while the native AnimatedImageDecoder on Android 28+ continues to handle frame timing natively.
coil-gif/src/main/java/coil3/gif/internal · high confidence
Improved video frame extraction and internal resource handling
This change enhances the video decoding internals by adding support for extracting video frames by index, which allows for more precise frame retrieval. It also introduces a new FileHandleMediaDataSource to better support custom FileSystem implementations and registers service loader targets for MediaDataSourceFetcher and VideoFrameDecoder to improve extensibility. Additionally, utility functions are added to handle MediaMetadataRetriever lifecycle and API differences across Android versions, ensuring compatibility and avoiding strict mode warnings.
coil-video/src/main/java/coil3/video/internal · high confidence
Initial public API dump for Coil 3
A new ABI dump file (coil.klib.api) has been added to the repository, establishing the public API surface for the coil3 library. This file documents the stable interface for the SingletonImageLoader, including its methods for retrieving, resetting, and configuring image loaders, as well as the Factory interface used to instantiate them. This change supports the new klib validation feature by providing a baseline for binary compatibility checks.
coil/api · high confidence
Introduce adaptive image grid and edge-to-edge layout in the View sample
The View-based sample app now features an adaptive image grid that dynamically adjusts its column count based on available screen width, replacing the previous static layout. Additionally, the app has been updated to support edge-to-edge rendering, ensuring content extends behind system bars for a more immersive display. These changes are implemented through new custom views (AspectRatioImageView, ImageGridView) and updated activity logic handling window insets.
samples/view/src/main/java · high confidence
Migrate compose-android sample to new Android KMP Gradle plugin
The compose-android sample has been migrated to use the new Android KMP Gradle plugin. This update includes a structural change where the assets directory now symlinks to the shared common resources, allowing the Android app to access shared assets directly. The main entry point has been updated to a new MainActivity that utilizes the Android-specific ViewModel and enables edge-to-edge display. Additionally, the AndroidManifest.xml has been refactored to remove legacy external storage permissions, update the application package context, enable the back-invoked callback for improved navigation handling, and add profileable attributes for better debugging support.
samples/compose-android · high confidence
New Gradle build infrastructure for Coil 3
The build system has been completely rewritten for Coil 3, introducing a new Kotlin-based build source structure under \buildSrc/src/main/kotlin/coil3\. This update adds a custom Kotlin Multiplatform hierarchy template to standardize source set grouping (e.g., \jvmCommon\, \native\, \jsCommon\), integrates native Linux targets by default, and enables Kotlin/Wasm (wasmJs) support out of the box. It also includes new Gradle tasks to automatically link Skiko builtins for Android, verify that Skiko versions match between core and Compose modules, and manage Skiko runtime dependencies for WebAssembly without requiring the full Compose plugin. Additionally, the build now configures Android libraries using the new Kotlin Multiplatform Android plugin and updates publishing and Dokka settings to align with Coil 3's module structure.
buildSrc/src/main/kotlin/coil3 · high confidence
New animated image decoding and control APIs for GIFs and WebPs
The coil-gif module now includes dedicated decoders for modern animated formats: AnimatedImageDecoder handles GIFs, animated WebPs, and animated HEIFs on Android API 28+ using the native ImageDecoder, while GifDecoder remains for legacy API support. Users can now globally or per-request set the animation repeat count (including a new ENCODED\_LOOP\_COUNT option to respect the file's metadata) and register start/end animation callbacks. Additionally, an experimental AnimatedTransformation interface allows applying pixel-level transformations to animated frames, with the system automatically handling scaling and opacity calculations.
coil-gif/src/main/java/coil3/gif · high confidence
New public API for crossfade transitions and model equality in AsyncImage
The coil-compose-core library now exposes \CrossfadePainter\ as a public API, enabling smooth visual transitions between subsequent image results in \AsyncImage\. This change also introduces \AsyncImageModelEqualityDelegate\ (with an \AllProperties\ implementation) and a \LocalAsyncImageModelEqualityDelegate\ composition local, allowing users to customize how image model changes are detected to trigger these crossfade effects. Additionally, \AsyncImagePainter\ now exposes a \restart()\ method for manual control over the loading lifecycle.
coil-compose-core/api · high confidence
Refactored singleton image loader to use PlatformContext for factory resolution
The singleton image loader implementation has been updated to resolve the application context via a new \PlatformContext.applicationContext()\ extension function rather than relying on platform-specific direct access. This change centralizes context retrieval within the \PlatformContext\ abstraction, ensuring that the singleton factory logic consistently uses the correct application-level context across different platforms. The public API surface remains largely unchanged, but the internal mechanism for obtaining the context during lazy initialization has been standardized.
coil/src/commonMain · high confidence
Removal of Coil singleton object
The \Coil\ singleton object, which previously provided static methods to get or set the default \ImageLoader\ instance, has been removed from the library. Users can no longer access the default loader via \Coil.loader()\ or configure it using \Coil.setDefaultImageLoader()\. This change eliminates the global singleton pattern for the default image loader, requiring users to manage \ImageLoader\ instances explicitly or through alternative initialization mechanisms.
coil-default/src/main/java/coil · high confidence
Removal of internal memory management and request delegation classes
The internal memory management and request delegation infrastructure in the \coil.memory\ package has been removed. This includes the deletion of \BitmapReferenceCounter\, \DelegateService\, \MemoryCache\, \RequestDelegate\, \RequestService\, \TargetDelegate\, and \ViewTargetRequestManager\. These classes previously handled bitmap reference counting, memory caching, request lifecycle management, and target delegation; their removal indicates a significant internal refactoring of how the library manages memory and request lifecycles.
coil-base/src/main/java/coil/memory · high confidence
Removal of legacy buildSrc utility files
The \Extensions.kt\ and \Library.kt\ files in \buildSrc/src/main/kotlin\ have been removed. This eliminates custom Gradle extension functions (such as \minSdk\, \versionCode\, and test dependency helpers) and the centralized \Library\ object that previously managed hardcoded versions for AndroidX, Coroutines, OkHttp, and other dependencies, indicating a shift to a different dependency management strategy (likely version catalogs or external build scripts).
buildSrc/src/main/kotlin · high confidence
Removal of legacy image loading components and configuration classes
The \ComponentRegistry\, \DefaultRequestOptions\, \ImageLoader\, \ImageLoaderBuilder\, and \RealImageLoader\ classes have been removed from the \coil\ package. This change eliminates the previous builder-based configuration model and the internal implementation of the image loader, indicating a significant restructuring of how image loading is initialized and configured in this library version.
coil-base/src/main/java/coil · high confidence
Replace ImageLoader network observer with ConnectivityChecker interface
The network connectivity check mechanism has been refactored to use a new \ConnectivityChecker\ interface instead of the previous \ImageLoader.Builder.networkObserverEnabled\ setting. On Android, this introduces platform-specific logic that leverages \ConnectivityManager\ to determine online status, handling API level differences (API 21 vs 23) and checking for the \ACCESS\_NETWORK\_STATE\ permission. Non-Android platforms now default to an always-online state via this interface. This change also includes internal utilities to assert non-main-thread execution and check permissions, ensuring the connectivity check is performed safely and correctly on the respective platforms.
coil-network-core/src/androidMain · high confidence
Restrict which HTTP response codes are cacheable
The default caching strategy now strictly limits which HTTP status codes are written to disk. Previously, all 2xx responses were cached; the new implementation retains this behavior but also explicitly allows specific non-2xx codes (300, 301, 404, 405, 410, 414, 501) that are cacheable by RFC semantics, while disabling disk writes for all other non-cacheable status codes.
coil-network-core/src/commonMain/kotlin/coil3/network/internal · high confidence
Sample app architecture migrated to modern Android components
The coil-sample application has been refactored to replace legacy Android patterns with modern equivalents. The custom \Application\ class and manual \ImageLoader\ setup have been removed, indicating a shift to automatic initialization or a different provider pattern. ViewModels and Activities no longer use \LiveData\ and \ViewModelProviders\, having migrated to \StateFlow\ and ViewBinding. Additionally, custom utility extensions for inflation, view binding, and TLS 1.2 enforcement have been deleted, suggesting these functionalities are now handled by standard library components (like \activity-ktx\ and \livedata-ktx\) or Coil's built-in configuration.
coil-sample/src/main/java · high confidence
Shared sample infrastructure migrated to Material 3 and Coil 3
The shared sample codebase has been restructured to support cross-platform consistency and modern UI standards. The Android sample now uses Material 3 (Theme.Material3.DayNight.NoActionBar) and enables edge-to-edge display for a seamless look. Image loading has been upgraded to Coil 3, with platform-specific implementations for disk caching (disabled on JS/Wasm, enabled on Android/other) and video frame extraction. Asset management is now centralized via a common \Resources\ interface and \AssetType\ enum, with JSON manifests for JPGs, GIFs, and SVGs moved to common resources, while MP4 support is restricted to Android.
samples/shared · high confidence
Split Ktor network support into separate Ktor 2 and Ktor 3 artifacts
The single \coil-network-ktor\ module has been split into two distinct artifacts, \coil-network-ktor2\ and \coil-network-ktor3\, allowing users to integrate Coil with their specific version of the Ktor HTTP client. The public API for both modules now exposes \KtorNetworkFetcher\ and \KtorNetworkFetcherFactory\ classes, which provide factory methods to create network fetchers from an \io.ktor.client.HttpClient\ instance. These factories support optional configuration for concurrent request strategies, cache strategies, and connectivity checking, ensuring compatibility with the respective Ktor major versions.
coil-network-ktor2/api, coil-network-ktor3/api · high confidence
Stabilize Coil Core for Compose and fix R8 shrinking issues
Coil Core is now stable for the Compose compiler, allowing its classes to be used in Compose code without stability warnings. Additionally, R8 shrinking rules have been added to prevent a bug in R8 9.0+ that could drop super calls in GenericViewTarget subclasses, ensuring images render correctly in release builds.
coil-core · high confidence
Stabilize browser tests by disabling WASM streaming and increasing timeouts
To reduce flakiness in browser-based tests, the Karma configuration now patches WebAssembly.instantiateStreaming to compile from an ArrayBuffer instead, preventing Chrome stalls during large module loading. Additionally, test timeouts have been increased (Mocha to 60s, browser activity to 10 minutes) to accommodate slower WASM startup on local machines, and a custom ChromeHeadless launcher is used to disable extensions and randomize the remote debugging port for a more stable execution environment.
karma.browser.d, karma.config.d · high confidence
Stabilize singleton image loader configuration in Compose
The \setSingletonImageLoaderFactory\ function is now stable, allowing developers to configure the global image loader used by \AsyncImage\, \rememberAsyncImagePainter\, and \SubcomposeAsyncImage\ via a Compose-optimized API. This change ensures that the singleton loader is set safely and immediately, preventing race conditions when these composables are invoked during composition.
coil-compose/src · high confidence
Stabilized Compose image APIs with new AsyncImage composable and crossfade support
The Coil Compose module has been restructured to stabilize its public API, introducing a new \AsyncImage\ composable that simplifies asynchronous image loading by handling request execution and state management internally. The existing \rememberAsyncImagePainter\ and \SubcomposeAsyncImage\ APIs have been updated to align with this new structure, including the addition of a \clipToBounds\ parameter to control content clipping. A new \CrossfadePainter\ has been added to enable smooth crossfade transitions between subsequent image results, configurable via the \useExistingImageAsPlaceholder\ request option. The release also introduces \ConstraintsSizeResolver\ and \DrawScopeSizeResolver\ for more flexible size resolution, exposes \LocalAsyncImageModelEqualityDelegate\ to control when image requests are re-executed on model changes, and provides \LocalAsyncImagePreviewHandler\ to customize rendering in Android Studio previews.
coil-compose-core/src/commonMain/kotlin/coil3/compose · high confidence
Stabilized singleton image loader APIs and Android context handling
The Android-specific singleton image loader implementation is now stabilized, introducing an internal \PlatformContext.applicationContext()\ accessor to properly resolve the application context for singleton loaders. Additionally, extension functions for \Context\ and \ImageView\ (such as \imageLoader\, \load\, \dispose\, and \result\) are stabilized, providing a consistent and reliable way to load images and manage request lifecycles on Android without requiring manual singleton management.
coil/src/androidMain · high confidence
Updated coil-compose API signatures for Coil 3
The public API surface for coil-compose has been updated to reflect the Coil 3 release, introducing new function signatures for \AsyncImage\, \SubcomposeAsyncImage\, and \rememberAsyncImagePainter\. This change includes the addition of \setSingletonImageLoaderFactory\ for configuring the global image loader via CompositionLocal, and updates to the Klib ABI dump to support the new multiplatform targets (iosArm64, iosSimulatorArm64, js, macosArm64, wasmJs).
coil-compose/api · high confidence
Fixes
Workaround for Skiko ES module loading in Node.js
A new Node.js script has been added to intercept and transform Skiko ES module files (skiko.mjs, skikod8.mjs) during runtime. This workaround converts ES module syntax (such as import.meta.url and export statements) into CommonJS format, allowing these specific modules to be loaded correctly in environments that do not natively support ES modules.
gradle/nodejs · high confidence
Test coverage
Add Android device instrumentation tests for coil-core; Add Compose screenshot tests for AsyncImage and vector drawables; Added API surface for JVM test utilities; Added Android host tests for image loading and composition components; Added Android instrumentation tests for GIF animation and transformation features; Added Android instrumented tests for Coil Compose; Added JVM Common test utilities for SVG decoding; Added JVM-specific bitmap decoding utility for tests; Added Paparazzi snapshot tests for image loading components; Added Roborazzi snapshot tests for Android and JVM Compose/View integration; Added non-Android test utilities for bitmap comparison and platform context; Added test for ES module image decoding; Added test utilities for mocking image loading; Added test utility to ignore tests on Apple platforms; Added tests for AsyncImage model equality, constraint size resolution, and deferred dispatch; Added tests for CacheControlCacheStrategy; Added tests for Compose UI resource loading; Added tests for FakeImageLoaderEngine; Added tests for HEIF support and updated GIF decoder service loader verification; Added tests for SingletonImageLoader behavior; Added tests for VideoFrameServiceLoader; Added tests for network caching, concurrent request strategies, and fetcher behavior; Added tests for video frame decoding and MediaDataSource support; New internal test utilities for network fetching and image comparison; Removal of bitmap pool strategy unit tests; Removal of legacy test utility functions; Removal of shared test utility functions; Removal of test-only BitmapPool fakes; Removed RealImageLoaderIntegrationTest; Removed ViewSizeResolverTest; Removed basic RealImageLoader tests; Removed instrumentation tests for BitmapFactoryDecoder and DrawableDecoderService; Removed legacy Robolectric-based fetcher tests; Removed legacy memory cache and target delegate tests; Removed lifecycle coroutine dispatcher tests and fakes; Removed unit tests for GroupedLinkedMap and SparseIntArraySet; Updated test utilities for non-Android platforms.
Dependencies
Gradle wrapper upgraded to v9.7.1 with enhanced network resilience
The Gradle wrapper has been updated from version 5.5.1 to 9.7.1, significantly modernizing the build toolchain. This upgrade introduces new configuration properties to improve build stability: network timeouts are now set to 10,000ms, retry logic is enabled with zero initial retries and a 500ms back-off delay, and distribution URL validation is enforced. These changes ensure more robust dependency downloads and stricter integrity checks during the build process.
gradle/wrapper · 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 36 → 53 (+17.3)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 52 → 48 (-3.4)
- Architecture 97 → 100 (+2.9)
- Maturity 49 → 63 (+14.4)
- Readiness 15 → 46 (+30.8)
- Security 60 → 73 (+12.9)
Resolved (85)
- Coverage not measured — test suite did not build
- Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- Dimension evaluation failed
- Duplicated block (34 lines × 2) (coil-core/src/commonMain/kotlin/coil3/decode/DecodeUtils.kt)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- …and 65 more
New (88)
- AbstractContentPainterNode.modifyConstraints (cognitive 17) (coil-compose-core/src/commonMain/kotlin/coil3/compose/internal/ContentPainterModifier.kt)
- Change coupling: AsyncImage.kt ↔ SubcomposeAsyncImage.kt (coil-compose-core/src/commonMain/kotlin/coil3/compose/AsyncImage.kt)
- Change coupling: ScaleDrawable.kt ↔ CrossfadeDrawable.kt (coil-core/src/androidMain/kotlin/coil3/size/ScaleDrawable.kt)
- ClassTooLong: DiskLruCache (coil-core/src/commonMain/kotlin/coil3/disk/DiskLruCache.kt)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- DiskLruCache.completeEdit (cognitive 20) (coil-core/src/commonMain/kotlin/coil3/disk/DiskLruCache.kt)
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no usage examples (README.md)
- Documentation: written for insiders (docs/java_compatibility.md)
- Duplicated block (11 lines × 2) (coil-core/src/androidMain/kotlin/coil3/ColorImage.kt)
- Duplicated block (16 lines × 2) (coil-core/src/commonMain/kotlin/coil3/decode/DecodeUtils.kt)
- Duplicated block (17 lines × 2) (coil-network-ktor2/src/jvmCommonMain/kotlin/coil3/network/ktor2/internal/utils.jvmCommon.kt)
- Duplicated block (23 lines × 2) (coil-core/src/jsCommonMain/kotlin/coil3/decode/SkiaImageDecoder.jsCommon.kt)
- Duplicated block (33 lines × 2) (coil-core/src/androidMain/kotlin/coil3/decode/StaticImageDecoder.kt)
- Duplicated block (49 lines × 2) (coil-core/src/androidMain/kotlin/coil3/EventListener.kt)
- Duplicated block (56 lines × 2) (coil-network-ktor2/src/commonMain/kotlin/coil3/network/ktor2/KtorNetworkFetcher.kt)
- Duplicated block (61 lines × 2) (coil-network-ktor2/src/commonMain/kotlin/coil3/network/ktor2/internal/utils.kt)
- ErrorFunctionDetector.isInsideImageRequestBuilderLambda (cognitive 41) (coil-lint/src/main/kotlin/coil3/lint/ErrorFunctionDetector.kt)
- High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
- …and 68 more
Changes since last survey
- 63 commits — 59 feature/other, 4 fixes
By area
- gradle/libs.versions.toml — 25 commits
- (root) — 20 commits
- coil-core/src — 9 commits
- gradle/wrapper — 2 commits
- (repo) — 1 commit
- .github/workflows — 1 commit
- buildSrc/src — 1 commit
- coil-bom/build.gradle.kts — 1 commit
- coil-network-core/src — 1 commit
- internal/test-js-es-modules — 1 commit
- samples/view — 1 commit
Notable commits
- fix: Fix JS ES module test configuration (#3560)
- fix: Fix Skiko bridge for ES module consumers (#3558)
- fix: Fix android test source sets to androidHostTest and androidDeviceTest (#3597)
- fix: Fix deduplicated request cancellation handling (#3566)
- change: Adds support for loading images from blob URLs (object URLs) on web (JS/Wasm) targets (#3504)
- change: Avoid internal Skiko APIs on web (#3534)
- change: Enable suppressAgpWarnings. (#3535)
- change: Fix formatting.
- change: Group Compose Multiplatform and Skiko dependency updates (#3538)
- change: Merge pull request #3591 from coil-kt/release/3.6
- change: Migrate to AGP's new DSL. (#3567)
- change: Migrate to Bitmap.installPixelsFromArrayBuffer for decoding images on web. (#3536)
- change: Prepare 3.6.0.
- change: Prepare next development version.
- change: Prepare next development version.
- change: Prepare next development version.
- change: Prepare next development version.
- change: Prepare version 3.6.1.
- change: Prepare version 3.6.2.
- change: Prepare version 3.6.3.
- …and 43 more
Architecture
- Containers 0 added · 0 removed · contexts 5 added · 0 removed · edges 4 added · 0 removed
Added bounded contexts (5)
- coil-compose-core
- coil-core
- coil-gif
- coil-svg
- shared
Added dependency edges (4)
- coil-compose-core → coil-core (coupling)
- coil-gif → coil-core
- coil-svg → coil-core
- shared → coil-core
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
coil-kt/coil 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 7e9c48be426ff538b1396aa7d4fe34b37d32b28d — 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.