Landscapist
š» A pluggable, highly optimized Jetpack Compose and Kotlin Multiplatform image loading library that fetches and displays network images, compatible with Glide, Coil, and Fresco.
Install / Use
/learn @skydoves/LandscapistREADME
<br><br>
Who's using Landscapist?
š Check out who's using Landscapist.
Landscapist hits +1,100,000 downloads every month around the globe!

Why Landscapist?
Landscapist is built with a lot of consideration to improve the performance of image loadings in Jetpack Compose. Most composable functions of Landscapist are Restartable and Skippable, which indicates fairly improved recomposition performance according to the Compose compiler metrics. Also, the library performance was improved with Baseline Profiles and it supports many pluggable features, such as ImageOptions, listening image state changes, custom composables, preview on Android Studio, ImageComponent and ImagePlugin, placeholder, animations (circular reveal, crossfade), transformation (blur), palette, and zoomable.
<details> <summary>See the Compose compiler metrics for Landscapist</summary>
Documentation
For comprehensive information about Landscapist, please refer to the official documentation.
Technical Content
For more details of the history, performance, customizability, and how to load network images and implement placeholders, animations, and transformations with Landscapist, check out Optimized Image Loading for Compose and Kotlin Multiplatform.
š Sponsors
<a href="https://coderabbit.link/Jaewoong" target="_blank"> <img width="300" alt="coderabbit" src="https://github.com/user-attachments/assets/9823e1d3-8467-4d4d-8a53-94b3c0adc630" /></a>
<a href="https://getstream.io/chat/sdk/android/?utm_source=github&utm_medium=referral&utm_content=&utm_campaign=Jaewoong_github_2025" target="_blank"> <img width="260" alt="stream" src="https://github.com/user-attachments/assets/87a69228-4fef-4f48-ad98-1e2c606c5b7e" /></a>
Demo projects
You can see the use cases of this library in the repositories below:
- google/modernstorage: ModernStorage is a group of libraries that provide an abstraction layer over storage on Android to simplify its interactions.
- GetStream/WhatsApp-Clone-Compose: š± WhatsApp clone project demonstrates modern Android development built with Jetpack Compose and Stream Chat SDK for Compose.
- android/storage-samples: Multiple samples showing the best practices in storage APIs on Android.
- skydoves/DisneyCompose: š§ø A demo Disney app using Jetpack Compose and Hilt based on modern Android tech-stacks and MVVM architecture.
- skydoves/MovieCompose: š A demo movie app using Jetpack Compose and Hilt based on modern Android tech stacks. <br>
Landscapist Core & Image
Landscapist now provides two foundational modules designed for Kotlin Multiplatform and Compose Multiplatform from the scratch, giving you full control over image loading across all platforms:
landscapist-core: A standalone, Kotlin Multiplatform image loading engine with built-in memory/disk caching, progressive loading, and network fetching via Ktor. Works on Android, iOS, Desktop, and Web without any UI dependencies.landscapist-image: A Compose Multiplatform image component built on top oflandscapist-corewith full plugin support. Seamlessly works across all Compose Multiplatform targets.
These modules are perfect if you want a lightweight, customizable image loader without depending on Glide, Coil, or Fresco, with first-class support for all Kotlin Multiplatform and Compose Multiplatform targets.
<div class="header"> <h1>Landscapist Core</h1> </div>The landscapist-core module is a complete, Kotlin Multiplatform image loading solution that works standalone without any UI dependencies. It provides:
- Network image loading via Ktor HTTP client.
- Memory caching with LRU eviction and weak references.
- Disk caching with size limits and automatic cleanup.
- Progressive loading for better perceived performance.
- Priority-based scheduling for optimized resource usage.
- Kotlin Multiplatform support (Android, iOS, Desktop, Web).
- Image transformations and custom decoders.
- Event listeners for monitoring load states.
Why Choose Landscapist Core?
Landscapist Core is exceptionally lightweight compared to other image loading libraries, making it the ideal choice for SDK and library developers who need to minimize their dependency footprint.
AAR Size Comparison (Android Release Build):
| Library | AAR Size | vs Landscapist Core | Impact on APK | |---------|----------|---------------------|---------------| | landscapist-core | ~312 KB | Baseline (Smallest) | Minimal | | Coil3 | ~460 KB | +47% larger | Moderate | | Glide | ~689 KB | +121% larger | Significant | | Fresco | ~1 MB | +228% larger | High |
Performance (Android Release Build):
| Library | Avg Load Time | Memory Usage | Supports KMP | |---------|---------------|--------------|--------------| | LandscapistImage | 1,245ms | 4,520KB | ā | | GlideImage | 1,312ms (+5%) | 5,124KB (+13%) | ā | | CoilImage | 1,389ms (+12%) | 4,876KB (+8%) | ā | | FrescoImage | 1,467ms (+18%) | 5,342KB (+18%) | ā |
For detailed performance analysis and test methodology, see the Landscapist Core documentation.
Setup
Add the dependency below to your module's build.gradle file:
dependencies {
implementation("com.github.skydoves:landscapist-core:$version")
}
For Kotlin Multiplatform, add to your module's build.gradle.kts:
sourceSets {
commonMain.dependencies {
implementation("com.github.skydoves:landscapist-core:$version")
}
}
All platform-specific Ktor engines are included automatically based on your target platforms.
Using Landscapist Core for Network Loading
You can use landscapist-core as a standalone image loader for fetching and caching network images without any UI dependencies. This is u
