Library / SDK
skydoves/landscapist avatar
skydoves/landscapist

Landscapist: a modular Compose and Kotlin Multiplatform image loader with plugins and Glide, Coil and Fresco adapters

🌻 A pluggable, lightweight, highly optimized Jetpack Compose and Kotlin Multiplatform image loading library that fetches and displays network images.

2,587 stars139 forksKotlinApache-2.0

At a glance

What is it?
skydoves/landscapist is an Apache-2.0 Kotlin library that loads and displays network images in Jetpack Compose and Kotlin Multiplatform. Its landscapist-core module brings a built-in Ktor client, and separate modules add animation, placeholders, transformations, zoom, a gallery and adapters for other image loaders.
Who is it for?
Landscapist suits Compose and Kotlin Multiplatform teams that want image loading split into small modules, with plugins for placeholders, crossfades, blur and zoom, and that may already use Glide, Coil or Fresco. It is a weaker choice if you want a single dependency with every feature, or if you need the README to tell you a version number to copy.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • skydoves/landscapist2,587 ★ · +3
Star history
Repository2026-09-292026-11-14
skydoves/landscapist2.6k2.6k

3 Stars in the last 46 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The library is split into many Gradle modules, so you choose what to depend on

The repository root is a list of modules: landscapist-core, landscapist-image, landscapist-animation, landscapist-placeholder, landscapist-transformation, landscapist-palette, landscapist-zoomable, landscapist-image-gallery and landscapist-svg, plus coil, coil3, glide, fresco and fresco-websupport directories and a bom. The README's pitch is a pluggable, lightweight image loading library, and the layout is how that is delivered.

The consequence is that adding Landscapist is not a single line. You start from landscapist-image for the UI component, then add animation, placeholder or transformation modules as you need them. A bom module exists in the repository, and the release list shows a single version number, so keep every Landscapist artifact on the same version. If you only need to show an image with a placeholder, you can leave out zoom, palette and gallery.

landscapist-image sits on landscapist-core, which brings its own Ktor client

The landscapist-image module is a Compose Multiplatform UI component built on top of landscapist-core, and the README says it works across Android, iOS, Desktop and Web targets. Setup is a dependency in your module's build file:

gradle
dependencies {
    implementation("com.github.skydoves:landscapist-image:$version")
}

A note says landscapist-core includes the Ktor client automatically, so you do not add Ktor dependencies separately. For Kotlin Multiplatform, the same artifact goes in commonMain:

kotlin
sourceSets {
    commonMain.dependencies {
        implementation("com.github.skydoves:landscapist-image:$version")
    }
}

The README shows $version as a placeholder and does not print a number. Take the version from the releases list on GitHub, where the newest entries are 2.13.2, 2.13.1 and 2.13.0.

LandscapistImage takes a lambda for the model and an ImageOptions configuration

The composable you call is LandscapistImage. Its first parameter is imageModel, a lambda that returns the source, shown in the README as a URL string, and it takes a Modifier like any Compose function:

kotlin
import com.skydoves.landscapist.image.LandscapistImage
import com.skydoves.landscapist.ImageOptions

LandscapistImage(
    imageModel = { "https://example.com/image.jpg" },
    modifier = Modifier.size(300.dp),

The example imports ImageOptions for the options parameter that follows the modifier. The project lists ImageOptions among its pluggable features, together with listening to image state changes, custom composables, previews in Android Studio, ImageComponent and ImagePlugin, placeholders, animations, transformation, palette, zoomable and image gallery. The model is passed as a lambda rather than as a plain value, so keep the expression cheap.

Glide, Coil and Fresco compatibility comes through separate directories

Landscapist describes itself as compatible with Glide, Coil and Fresco. In the repository, that shows up as separate coil, coil3, glide, fresco and fresco-websupport directories, next to the core library. So if you already depend on Coil or Glide, you can pair that loader with Landscapist's composables and plugins instead of replacing it.

The cost is that you then carry two image libraries in your dependency graph, and you need the right adapter for your Coil major version, since there are separate coil and coil3 directories. If you are starting from scratch, landscapist-image with the built-in core avoids the second library. Check which targets each adapter covers before you use one in a Kotlin Multiplatform module.

The performance claims come from compiler metrics and Baseline Profiles, not from published benchmarks

The README says most composable functions are Restartable and Skippable, which indicates improved recomposition performance according to the Compose compiler metrics, and that Baseline Profiles improved the library's own performance. It also states more than 1,100,000 downloads a month.

The claims are about recomposition behaviour and adoption. There is no loading-time or memory comparison in the text, though the repository includes benchmark-engine, benchmark-landscapist, benchmark-landscapist-app and performance directories where such measurements would live. A collapsed section on compiler metrics exists in the README. If image-heavy scrolling is your concern, run the benchmark module or your own list screen before trusting a general statement.

A WebAssembly playground lets you try settings before installing anything

The README links a browser playground: landscapist-image compiled to WebAssembly, running in the page. Every image size, content scale and plugin combination is a switch. One panel shows what the loader reported back, and another shows the Kotlin for whatever combination you land on, with a button to copy it into your project.

The repository holds a demo-web directory for this. The playground is useful for deciding which plugins you need, because the generated Kotlin shows the exact options. It runs in a browser, so it shows web behaviour and not Android or iOS rendering. Confirm the final result on your target device. The README also lists demo projects, including Google's ModernStorage sample and the DisneyCompose and MovieCompose apps.

Patch releases follow each other within days, and the last push was on 2026-10-29

The recent releases are 2.13.2 on 2026-09-23, 2.13.1 on 2026-09-13 and 2.13.0 on 2026-09-09. Three versions in two weeks is a quick pace, so read the notes before moving from 2.12 to 2.13. The last push was on 2026-10-29 and the repository is not archived.

The badge on the README points to Android API level 21 as the minimum, and the licence is Apache-2.0. The repository also carries a docs folder and an mkdocs.yml, which build the official documentation site, so the site is the place for configuration details that the README links to instead of printing.

Editorial conclusion

Landscapist suits Compose and Kotlin Multiplatform teams that want image loading split into small modules, with plugins for placeholders, crossfades, blur and zoom, and that may already use Glide, Coil or Fresco. It is a weaker choice if you want a single dependency with every feature, or if you need the README to tell you a version number to copy. Before adopting it, pick the module set you need, read the latest release version from the releases list, and test the targets you ship to.

Frequently asked questions

What is Landscapist?

Landscapist is a Kotlin library for loading and displaying network images in Jetpack Compose and Kotlin Multiplatform. It is pluggable, supports image states and animations such as crossfade, blur and circular reveal, and works with Glide, Coil and Fresco.

How does Landscapist compare with Coil?

Landscapist is described as compatible with Coil, Glide and Fresco, and the repository has coil and coil3 directories next to its own core. It can use those loaders rather than replace them, or run on its built-in landscapist-core with a Ktor client.

Which platforms does landscapist-image support?

The README says landscapist-image works across Compose Multiplatform targets: Android, iOS, Desktop and Web.

Official sources

  1. License: Apache-2.0
  2. Project website
  3. README
  4. Releases
  5. skydoves/landscapist on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/skydoves-landscapist.svg)](https://hysenlabs.com/projects/skydoves-landscapist)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/skydoves-landscapist.svg)](https://hysenlabs.com/projects/skydoves-landscapist)

Was this useful?