# gradle-plugin

Published articles for gradle-plugin.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Build Setup: Targets, Source Sets and buildSrc for tvOS in a Compose Multiplatform Fork

DevFeed: [Build Setup: Targets, Source Sets and buildSrc for tvOS in a Compose Multiplatform Fork](<https://devfeed.tech/articles/build-setup-targets-source-sets-and-buildsrc-for-tvos-in-a-compose-multiplatform-fork-22943.md>)

Original publisher: [Read original article](<https://proandroiddev.com/build-setup-targets-source-sets-and-buildsrc-for-tvos-in-a-compose-multiplatform-fork-4d9caafa30a8?source=rss----c72404660798---4>)

Author: Sajid Ali

Published: 2026-09-14T04:24:43Z

Content type: tutorial

Language: en

Sources: [ProAndroidDev - Medium](<https://devfeed.tech/sources/proandroiddev-medium.md>)

Topics: [compose-multiplatform](<https://devfeed.tech/topics/compose-multiplatform.md>), [tvOS](<https://devfeed.tech/topics/tvos.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>)

Tags: [apple](<https://devfeed.tech/tags/apple.md>), [build](<https://devfeed.tech/tags/build.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [ios](<https://devfeed.tech/tags/ios.md>), [jetbrains](<https://devfeed.tech/tags/jetbrains.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [source](<https://devfeed.tech/tags/source.md>)

### AI overview

This tutorial explains the build setup for adding tvOS support to a Compose Multiplatform fork. It covers Kotlin Multiplatform targets, source-set organization shared between iOS and tvOS, and the build-layer work used to identify missing modules and dependencies.

### Source excerpt

Compose Multiplatform on tvOS This series: Compose Multiplatform on tvOS My Journey Making Compose Multiplatform Work on tvOS, and What I Learned Build Setup: Targets, Source Sets and buildSrc for tvOS in a Compose Multiplatform Fork (this post) Rendering (coming soon) Siri Remote input (coming soon) Siri Remote trackpad (coming soon) Screen density and text input (coming soon) Porting tv-material (coming soon) The Gradle plugin and third-party libraries (coming soon) Maintaining the fork (coming soon) Building a real app on it (coming soon) Part 1 was why this fork exists. This one is the build layer, and it comes before any Compose code, because in Kotlin Multiplatform a target is not a flag you flip at the end. It decides which source sets compile, which dependencies resolve, which klibs get published, which linker flags get passed. Until the build knows about tvosArm64, nothing tells you what is missing. So the first commits were build files. Once the targets were on, the compiler listed what was missing, module by module, and I worked through that list. Source set layout on the tvos branch I started on a branch called tvos, based on upstream. Back then JetBrains called iOS "uikit" in this repository and the source set was uikitMain. Because tvOS is also UIKit underneath, it made sense to have a common source parent for both iOS and tvOS. But iOS was already being called uikit, so I chose uiKitCommonMain as the source set name and moved all the UIKit files there, keeping only the iOS specific files in uikitMain and putting the tvOS specific files in a new source set, tvosMain. The problem with this approach was how to keep up with upstream. I tried a symlink to the uikit source set, and then overriding the tvOS files in a separate target. The override worked but complicated the process. At that time my goal was to make it runnable on tvOS however possible, so we would have a proof of concept. So I did a lot of hacks in the tvos branch to make it runnable, and af

## The Four Kotlin Versions in a Gradle Project

DevFeed: [The Four Kotlin Versions in a Gradle Project](<https://devfeed.tech/articles/the-four-kotlin-versions-in-a-gradle-project-24698.md>)

Original publisher: [Read original article](<https://blog.gradle.org/three-kotlin-versions-in-a-gradle-project>)

Author: Laura Kassovic

Published: 2026-06-12T04:00:00Z

Content type: article

Language: en

Sources: [The Gradle Blog](<https://devfeed.tech/sources/the-gradle-blog.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [compiler](<https://devfeed.tech/tags/compiler.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-compiler](<https://devfeed.tech/tags/kotlin-compiler.md>), [syntax](<https://devfeed.tech/tags/syntax.md>)

### AI overview

This article explains the four Kotlin versions that can matter in a Gradle project: the Kotlin compiler version selected through the Kotlin Gradle Plugin, the language version targeted for project code, the Kotlin compiler bundled with Gradle for build logic, and the language version Gradle pins for that build logic.

### Source excerpt

Do you know what version of Kotlin your Gradle build is using? There are four Kotlin versions you need to know about in a project built with Gradle. They're easy to mix up, and mixing them up can lead to some confusion (and the occasional compiler error). The trick is that there are really only two compilers in play, and each one carries its own language-version dial. Two compilers, two dials, four numbers. Let's take them one at a time. This post was updated on June 16, 2026. 1. The Kotlin that compiles your code This is the version most people look for. If your application or library code is written in Kotlin and gets compiled by the Kotlin Gradle Plugin, you pick its version in your build: // build.gradle.kts plugins { kotlin("jvm") version "1.9.25" } Change the KGP version, and you change the Kotlin compiler used to compile your project. This is the version you control directly. 2. The Kotlin language version for your code Picking the KGP version chooses which compiler runs over your code. But that compiler has a second dial: the language version, which decides what Kotlin syntax it will accept. You set it through KGP: // build.gradle.kts kotlin { compilerOptions { languageVersion = KotlinVersion.KOTLIN_1_8 } } By default it matches the language version associated with your KGP version, so most projects never touch it. You can pin it lower, for example to keep a library compilable by projects still on an older Kotlin. #1 is the compiler; this is the language level you ask that compiler to target. 3. The Kotlin embedded in Gradle (that compiles your build logic) Now the other compiler. Gradle ships its own Kotlin compiler and standard library inside the distribution. It's the compiler that builds your Kotlin DSL scripts and Gradle-managed build logic, and its standard library is available on the classpath used by build scripts and plugins. You never declare this one. It comes bundled with whatever Gradle version you use. In Gradle 9.6.0: # gradle/wrapper/gradle-w

## Apollo Kotlin 5 Is Now Available

DevFeed: [Apollo Kotlin 5 Is Now Available](<https://devfeed.tech/articles/apollo-kotlin-5-is-now-available-23201.md>)

Original publisher: [Read original article](<https://www.apollographql.com/blog/apollo-kotlin-5-is-now-available>)

Author: Martin Bonnin

Published: 2026-05-13T12:00:25Z

Content type: release

Language: en

Sources: [Apollo Blog](<https://devfeed.tech/sources/apollo-blog.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>), [Cache](<https://devfeed.tech/topics/cache.md>), [Caching](<https://devfeed.tech/topics/caching.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Maven Central](<https://devfeed.tech/topics/maven-central.md>), [Agent Skills](<https://devfeed.tech/topics/agent-skills.md>)

Tags: [agent-skills](<https://devfeed.tech/tags/agent-skills.md>), [cache](<https://devfeed.tech/tags/cache.md>), [changelog](<https://devfeed.tech/tags/changelog.md>), [community](<https://devfeed.tech/tags/community.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [maven-central](<https://devfeed.tech/tags/maven-central.md>)

### AI overview

Apollo Kotlin 5 is available on Maven Central with GraphQL Golden Path support, a new normalized cache, a modernized Gradle plugin, compiler plugin APIs, and an Apollo Kotlin agent skill. The release includes experimental GraphQL RFC support and provides a migration path from version 4.

### Source excerpt

Apollo Kotlin 5 is now available on Maven Central. GraphQL Golden Path ready, with a new normalized cache, agent skills support, and a modernized Gradle plugin.

## Metro 1.0.0 Is Stable as a Kotlin Multiplatform Compile-Time Dependency Injection Framework

DevFeed: [Metro 1.0.0 Is Stable as a Kotlin Multiplatform Compile-Time Dependency Injection Framework](<https://devfeed.tech/articles/metro-is-stable-39040.md>)

Original publisher: [Read original article](<https://www.zacsweers.dev/metro-is-stable/>)

Author: Zac Sweers

Published: 2026-04-27T21:07:22Z

Content type: release

Language: en

Sources: [Zac Sweers](<https://devfeed.tech/sources/zac-sweers.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [Framework](<https://devfeed.tech/topics/framework.md>), [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>)

Tags: [build-performance](<https://devfeed.tech/tags/build-performance.md>), [build-times](<https://devfeed.tech/tags/build-times.md>), [compilation](<https://devfeed.tech/tags/compilation.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [experimental](<https://devfeed.tech/tags/experimental.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [incremental](<https://devfeed.tech/tags/incremental.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [metro](<https://devfeed.tech/tags/metro.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [perfetto](<https://devfeed.tech/tags/perfetto.md>), [stable](<https://devfeed.tech/tags/stable.md>)

### AI overview

Metro 1.0.0 is now stable. The Kotlin multiplatform compile-time dependency injection framework uses a compiler plugin and provides API-stable runtime APIs, MetroX artifacts, and a Gradle plugin unless marked experimental. The article also describes build-performance improvements and compile-time validation features.

### Source excerpt

New here? Metro is a multiplatform, compile-time dependency injection framework for Kotlin implemented as a compiler plugin. Metro 1.0.0 is out now and stable. This means that its runtime APIs (runtime, MetroX artifacts, Gradle plugin, etc.) are now API-stable unless annotated with an experimental annotation. This

## Compose Stability Analyzer 0.7.0: Recomposition Cascade and Live Heatmap

DevFeed: [Compose Stability Analyzer 0.7.0: Recomposition Cascade and Live Heatmap](<https://devfeed.tech/articles/compose-stability-analyzer-0-7-0-recomposition-cascade-and-live-heatmap-25921.md>)

Original publisher: [Read original article](<https://proandroiddev.com/compose-stability-analyzer-0-7-0-recomposition-cascade-and-live-heatmap-6e8f789cd8ea?source=rss-9bb203a4ab2e------2>)

Author: Jaewoong Eum

Published: 2026-02-15T00:08:14Z

Content type: tutorial

Language: en

Sources: [Stories by Jaewoong Eum on Medium](<https://devfeed.tech/sources/stories-by-jaewoong-eum-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [adb](<https://devfeed.tech/tags/adb.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-stability](<https://devfeed.tech/tags/compose-stability.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [recomposition](<https://devfeed.tech/tags/recomposition.md>)

### AI overview

This article introduces Compose Stability Analyzer 0.7.0, focusing on its Recomposition Cascade Visualizer and Live Recomposition Heatmap. It explains how the heatmap uses ADB-connected device events to display runtime recomposition counts in Android Studio.

### Source excerpt

Jetpack Compose's stability system determines whether a composable function can be skipped during recomposition. When all parameters are stable, Compose can compare them and skip the function entirely if nothing changed. When even one parameter is unstable, the composable must re-execute every time its parent recomposes. Understanding which composables are stable and which are not is the first step toward optimizing Compose performance, but it's not the whole picture. Compose Stability Analyzer has been providing real-time stability analysis directly in Android Studio through gutter icons, hover tooltips, inline hints, and code inspections. These features answer the question "is this composable stable?" at a glance. Version 0.7.0 goes further by answering two additional questions that static analysis alone cannot address: "what happens downstream when this composable recomposes?" and "which composables are actually recomposing the most on a real device?" In this article, you'll explore the two new features introduced in version 0.7.0: the Recomposition Cascade Visualizer and the Live Recomposition Heatmap. Live Recomposition Heatmap Static analysis tells you which composables could recompose unnecessarily. The Live Recomposition Heatmap tells you which ones actually are. It bridges runtime behavior with your IDE by reading @TraceRecomposition events from a connected device via ADB and displaying live recomposition counts directly above composable functions in the editor. To use the heatmap, you need the Compose Stability Analyzer Gradle plugin applied to your project, composable functions annotated with @TraceRecomposition, and logging enabled via ComposeStabilityAnalyzer.setEnabled(true) in your Application class. With those in place, open the Compose Stability Analyzer tool window and click the Start/Stop button in the title bar. If one device is connected, monitoring begins immediately. If multiple devices are connected, a picker popup lets you choose which one t

## Detecting Maven-Hijack-style risks in Gradle builds with the Dependency Analysis Gradle Plugin

DevFeed: [Detecting Maven-Hijack-style risks in Gradle builds with the Dependency Analysis Gradle Plugin](<https://devfeed.tech/articles/detecting-maven-hijack-style-risks-in-gradle-builds-with-the-dependency-analysis-gradle-plugin-24611.md>)

Original publisher: [Read original article](<https://blog.gradle.org/detect-maven-hijack-risks-in-gradle-with-plugin>)

Author: Laura Kassovic

Published: 2025-12-08T05:00:00Z

Content type: tutorial

Language: en

Sources: [The Gradle Blog](<https://devfeed.tech/sources/the-gradle-blog.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [supply-chain-security](<https://devfeed.tech/topics/supply-chain-security.md>), [software supply-chain attack](<https://devfeed.tech/topics/software-supply-chain-attack.md>), [Java](<https://devfeed.tech/topics/java.md>), [Vulnerabilities](<https://devfeed.tech/topics/vulnerabilities.md>)

Tags: [dependency](<https://devfeed.tech/tags/dependency.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [java](<https://devfeed.tech/tags/java.md>), [software-supply-chain](<https://devfeed.tech/tags/software-supply-chain.md>), [software-supply-chain-attack](<https://devfeed.tech/tags/software-supply-chain-attack.md>), [supply-chain-security](<https://devfeed.tech/tags/supply-chain-security.md>), [vulnerabilities](<https://devfeed.tech/tags/vulnerabilities.md>)

### AI overview

This tutorial explains how Maven-Hijack-style attacks exploit duplicate fully qualified class names, deterministic Maven packaging order, and JVM classloader behavior in Java builds. It presents DAGP 3.5.0, the Dependency Analysis Gradle Plugin, as a defense that warns about duplicate classes and checks binary compatibility to identify potentially ambiguous bytecode.

### Source excerpt

JVM builds have lived with "duplicate classes on the classpath" for years. Most of the time, it's an annoying source of NoSuchMethodError or a "why did production suddenly break when I reordered dependencies?" kind of bug. A recent academic paper, Maven-Hijack: Software Supply Chain Attack Exploiting Packaging Order, shows that this isn't just a reliability problem, it's also a supply-chain security problem. DAGP 3.5.0 (Dependency Analysis Gradle Plugin), a popular community plugin, now provides another line of defense: in addition to warning you about duplicate classes, it checks binary compatibility when it finds them. That means it can spot cases where "the same class name" actually refers to different bytecode, which is exactly the kind of ambiguity Maven-Hijack exploits. We'll explore how to use DAGP to protect against Maven-Hijack style attacks in Gradle builds. If you've heard about supply chain vulnerabilities in the npm / Nx ecosystem, we've also written about how Continuous GRC can help block compromised packages across your org. What Maven-Hijack actually does The Maven-Hijack paper describes a class of attacks that rely on two facts about the Java ecosystem: Maven packaging order is deterministic - When building an uber-JAR, Maven walks the dependency tree in depth-first order and packages classes in that order. Dependencies earlier in that traversal "win" when there are duplicates. The JVM classloader loads the first matching class on the classpath - At runtime, the Java classloader linearly scans the classpath and loads the first class whose fully-qualified name matches the one being requested. That's enough to build an attack: The attacker finds a gadget dependency, a library that contains a class they'd love to hijack (e.g., a JDBC driver or some other central integration point). They then compromise or control an infection dependency that appears earlier in the dependency tree and publish a new version that contains a class with the same fully quali

## Medium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned

DevFeed: [Medium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned](<https://devfeed.tech/articles/medium-android-app-migrating-from-apollo-kotlin-3-to-4-lessons-learned-20324.md>)

Original publisher: [Read original article](<https://medium.engineering/medium-android-app-migrating-from-apollo-kotlin-3-to-4-lessons-learned-ff8d0d861cdb?source=rss----2817475205d3---4>)

Author: Pierrick CAEN

Published: 2025-10-06T08:18:42Z

Content type: tutorial

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [GraphQL](<https://devfeed.tech/topics/graphql.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Cache](<https://devfeed.tech/topics/cache.md>), [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [apollo-client](<https://devfeed.tech/tags/apollo-client.md>), [cache](<https://devfeed.tech/tags/cache.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [migration](<https://devfeed.tech/tags/migration.md>)

### AI overview

This article describes Medium's migration of its Android app from Apollo Kotlin 3 to 4. It explains the app's use of Apollo's normalized cache, CacheFirst fetching, and watch() for UI updates, then covers identifier changes, revised exception handling, and cache-miss errors encountered during the migration.

### Source excerpt

Photo by Mario Verduzco on UnsplashMedium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned In this post, I'll share my experience migrating the Medium Android app from Apollo Kotlin version 3 to version 4, including the challenges I encountered and how I solved them to improve our GraphQL implementation. Understanding Our Apollo Cache Implementation Before diving into the migration, it's important to understand how we use Apollo's cache in the Medium Android app. Our app relies heavily on Apollo's normalized cache for several critical purposes: Performance Optimization: We use FetchPolicy.CacheFirst as our default strategy, which means we always try to serve data from the cache first before making network requests. This significantly reduces loading times and provides a smooth user experience, especially when users navigate between screens that display similar content. Real-time Updates: We use Apollo's watch() functionality extensively to observe cache changes and automatically update our UI when data changes. This is particularly useful for features like: Live clap counts on posts Real-time follower updates Post viewed updates and more... Starting the Migration The initial plan was straightforward: update Apollo Kotlin from version 3 to 4. The IntelliJ plugin made this process seem simple at first glance. Key Changes in Apollo Kotlin 4 Group id / plugin id / package name: Apollo Kotlin 4 uses a new identifier (com.apollographql.apollo) for its maven group id, Gradle plugin id, and package name. This change from com.apollographql.apollo3 allows running version 4 alongside version 3 if needed. Source: Apollo Kotlin Migration Guide - Group id / plugin id / package name Exception handling: Apollo 4 has a new way of handling exceptions. Instead of throwing exceptions directly, they're now passed through ApolloResponse. Source: Apollo Kotlin Migration Guide -- Fetch errors do not throw ApolloCompositeException: In Apollo Kotlin 3, when both cache and netw

## Testing a Gradle Plugin that interacts with Git

DevFeed: [Testing a Gradle Plugin that interacts with Git](<https://devfeed.tech/articles/testing-a-gradle-plugin-that-interacts-with-git-25587.md>)

Original publisher: [Read original article](<https://www.marcogomiero.com/posts/2025/test-gradle-plugin-git/>)

Author: Marco Gomiero

Published: 2025-05-13T00:00:00Z

Content type: tutorial

Language: en

Sources: [Posts on Marco Gomiero](<https://devfeed.tech/sources/posts-on-marco-gomiero.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [Git](<https://devfeed.tech/topics/git.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [cocoapods](<https://devfeed.tech/topics/cocoapods.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [cocoapods](<https://devfeed.tech/tags/cocoapods.md>), [git](<https://devfeed.tech/tags/git.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This tutorial explains how to test a Gradle plugin that publishes Kotlin Multiplatform frameworks through Git-based CocoaPods repositories. It uses Gradle TestKit and local Git bare repositories to automate testing without relying on manual verification or actual remote repositories.

### Source excerpt

Some time ago, I built KMP Framework Bundler, a Gradle plugin for Kotlin Multiplatform projects that generates an XCFramework for Apple targets or a FatFramework for iOS targets and manages the publishing process to a CocoaPods repository. (Note: the plugin is currently in maintenance mode; using KMMBridge might be a better option.) After building the Framework, the plugin handles the publishing process by interacting with a Git-based CocoaPods repository. It copies the Framework into the repository, updates the podspec file with the latest version, commits the changes, and pushes them.

## How Storytale Previews Kotlin UI Components Across Platforms

DevFeed: [How Storytale Previews Kotlin UI Components Across Platforms](<https://devfeed.tech/articles/taking-a-look-at-storytale-kevin-schildhorn-38308.md>)

Original publisher: [Read original article](<https://touchlab.co/previewing-storytale>)

Published: 2025-04-11T00:00:00Z

Content type: tutorial

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [UI components](<https://devfeed.tech/topics/ui-components.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [React](<https://devfeed.tech/topics/react.md>)

Tags: [animations](<https://devfeed.tech/tags/animations.md>), [community](<https://devfeed.tech/tags/community.md>), [components](<https://devfeed.tech/tags/components.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [plugin](<https://devfeed.tech/tags/plugin.md>), [source](<https://devfeed.tech/tags/source.md>), [storytale](<https://devfeed.tech/tags/storytale.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial examines Storytale, a Kotlin Gradle plugin and runtime library for generating an interactive UI component gallery for Composables. It explains story definitions, the generated interface, parameter controls, source viewing, and cross-platform previews, while noting the project's early-stage limitations.

### Source excerpt

Storytale is a Gradle plugin that generates interactive component libraries for your UI. We'll go over how it works and how it can help your design system.

## KMMBridge 1.2.1 Released - Kevin Schildhorn

DevFeed: [KMMBridge 1.2.1 Released - Kevin Schildhorn](<https://devfeed.tech/articles/kmmbridge-1-2-1-released-kevin-schildhorn-38241.md>)

Original publisher: [Read original article](<https://touchlab.co/kmmbridge-1.2.1>)

Published: 2025-02-04T00:00:00Z

Content type: release

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [cocoapods](<https://devfeed.tech/topics/cocoapods.md>), [releases](<https://devfeed.tech/topics/releases.md>), [swift-package-manager](<https://devfeed.tech/topics/swift-package-manager.md>), [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [cocoapods](<https://devfeed.tech/tags/cocoapods.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [ios](<https://devfeed.tech/tags/ios.md>), [kmmbridge](<https://devfeed.tech/tags/kmmbridge.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [release](<https://devfeed.tech/tags/release.md>), [spm](<https://devfeed.tech/tags/spm.md>), [swift-package-manager](<https://devfeed.tech/tags/swift-package-manager.md>), [xcode](<https://devfeed.tech/tags/xcode.md>)

### AI overview

KMMBridge 1.2.1 adds support for publishing Kotlin Multiplatform framework binaries as GitHub Releases for CocoaPods integration. It also improves CocoaPods build error logging.

### Source excerpt

KMMBridge is a Gradle plugin that publishes Kotlin Multiplatform Xcode Framework dependencies for Swift Package Manager and CocoaPods. The 1.2.1 release fixes issues around publishing packages using CocoaPods.

## Using a Custom Gradle Plugin to Configure the BugSee Android SDK

DevFeed: [Using a Custom Gradle Plugin to Configure the BugSee Android SDK](<https://devfeed.tech/articles/android-bugsee-sdk-ignore-the-docs-do-this-instead-24899.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/android-bugsee-sdk-ignore-the-docs-do-this-instead/>)

Author: blundell

Published: 2025-01-30T21:43:46Z

Content type: tutorial

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [Library](<https://devfeed.tech/topics/library.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [ios](<https://devfeed.tech/tags/ios.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [reference](<https://devfeed.tech/tags/reference.md>), [sdk](<https://devfeed.tech/tags/sdk.md>)

### AI overview

This tutorial explains how to configure the BugSee Android SDK through a custom Gradle plugin. It moves dependency setup, library initialization, token configuration, settings, and plugin application into a more modular structure with clearer separation of concerns.

### Source excerpt

When introducing 3rd party libraries (like BugSee), often their configuration is dumped into your build.gradle/application:onCreate and mixed with everything else. This post shows you how to have cleaner, more maintainable code by creating your own gradle plugin. BugSee is a Flight recorder for your iOS and Android apps "See video, network and logs that led [...] The post Android Bugsee SDK: Ignore the Docs, Do THIS Instead first appeared on Blundell.

## KMMBridge 1.1.0 Released - Kevin Galligan

DevFeed: [KMMBridge 1.1.0 Released - Kevin Galligan](<https://devfeed.tech/articles/kmmbridge-1-1-0-released-kevin-galligan-38240.md>)

Original publisher: [Read original article](<https://touchlab.co/kmmbridge-1.1>)

Published: 2024-12-05T00:00:00Z

Content type: release

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>), [Maintainability](<https://devfeed.tech/topics/maintainability.md>), [swift-package-manager](<https://devfeed.tech/topics/swift-package-manager.md>), [cocoapods](<https://devfeed.tech/topics/cocoapods.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [.NET 11](<https://devfeed.tech/topics/net-11.md>)

Tags: [cocoapods](<https://devfeed.tech/tags/cocoapods.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [ios](<https://devfeed.tech/tags/ios.md>), [kmmbridge](<https://devfeed.tech/tags/kmmbridge.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [maintainability](<https://devfeed.tech/tags/maintainability.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>), [releases](<https://devfeed.tech/tags/releases.md>), [spm](<https://devfeed.tech/tags/spm.md>), [swift-package](<https://devfeed.tech/tags/swift-package.md>), [swift-package-manager](<https://devfeed.tech/tags/swift-package-manager.md>), [xcode](<https://devfeed.tech/tags/xcode.md>)

### AI overview

KMMBridge 1.1.0 is a significant internal refactoring of the Gradle plugin used to publish Kotlin Multiplatform Xcode Framework binaries through Swift Package Manager and CocoaPods. The release improves maintainability and adds Gradle configuration cache support where possible, while introducing separate modules for GitHub features and potentially requiring plugin ID changes for GitHub publishing.

### Source excerpt

KMMBridge is a Gradle plugin that publishes Kotlin Multiplatform Xcode Framework dependencies for Swift Package Manager and CocoaPods. The 1.1.0 release is a significant internal refactoring to support ongoing improvements and maintainability.

## Mastering ktlint: A Guide to Crafting Your Own Rules

DevFeed: [Mastering ktlint: A Guide to Crafting Your Own Rules](<https://devfeed.tech/articles/mastering-ktlint-a-guide-to-crafting-your-own-rules-25116.md>)

Original publisher: [Read original article](<http://michaelevans.org/blog/2024/09/07/mastering-ktlint-a-guide-to-crafting-your-own-rules/>)

Author: Michael Evans

Published: 2024-09-07T15:49:37Z

Content type: tutorial

Language: en

Sources: [Gadget Habit](<https://devfeed.tech/sources/gadget-habit.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Code quality](<https://devfeed.tech/topics/code-quality.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code-quality](<https://devfeed.tech/tags/code-quality.md>), [coding](<https://devfeed.tech/tags/coding.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [guide](<https://devfeed.tech/tags/guide.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [module](<https://devfeed.tech/tags/module.md>), [test](<https://devfeed.tech/tags/test.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial explains how to create a custom ktlint rule for Kotlin projects. The example detects Android Log statements, shows how to configure the ktlint Gradle plugin and dependencies, defines the rule, adds a test, integrates it into ktlint configuration, and runs ktlint to report findings.

### Source excerpt

Ktlint is a powerful linting tool for Kotlin code that helps maintain code quality and consistency. While it comes with a set of built-in rules, there may be cases where you want to create custom rules tailored to your project's specific requirements. In this tutorial, we'll walk you through the process of writing a custom ktlint rule that detects and removes Android Log statements from your Kotlin code. Prerequisites Before we dive into writing custom ktlint rules, ensure you have ktlint installed in your project. The tasks ktlintApplyToIdea and addKtlintCheckTask are provided by the ktlint Gradle plugin. If you haven't already, include the plugin in your project by adding the following to your build.gradle.kts file: 1 2 3 plugins { id("org.jlleitschuh.gradle.ktlint") version "<latest-version>" } Once the plugin is applied, run the following command to set up ktlint in your project: 1 ./gradlew ktlintApplyToIdea addKtlintCheckTask Writing a Custom ktlint Rule 1. Create a New Module To write a custom ktlint rule, start by creating a new module in your Kotlin project. 2. Set Up Your Project In your new module, make sure you have ktlint as a dependency. Add it to your build.gradle.kts or build.gradle file: 1 2 3 dependencies { ktlint("io.gitlab.arturbosch.detekt:detekt-formatting:<ktlint-version>") } 3. Define the ktlint Rule Now, let's define our custom rule. Create a Kotlin class that extends the Rule class and override the visit method to define the logic for your rule. In this example, we want to detect Android Log statements. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import io.gitlab.arturbosch.detekt.api.Rule import org.jetbrains.kotlin.psi.KtCallExpression class LogStatementRule : Rule() { override fun visitCallExpression(expression: KtCallExpression) { if (expression.calleeExpression?.text == "Log" && expression.valueArguments.size == 1 ) { // Report a finding report( finding = "Found Android Log statement", documentable = expression ) } } } 4. Create a Test As w

## Gradle brainteasers 2/2: relocatable input files

DevFeed: [Gradle brainteasers 2/2: relocatable input files](<https://devfeed.tech/articles/gradle-brainteasers-2-2-relocatable-input-files-25431.md>)

Original publisher: [Read original article](<https://blog.mbonnin.net/gradle-brainteasers-22-relocatable-input-files>)

Author: Martin Bonnin

Published: 2024-07-17T08:41:15Z

Content type: tutorial

Language: en

Sources: [Martin Bonnin's blog](<https://devfeed.tech/sources/martin-bonnin-s-blog.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>), [Caching](<https://devfeed.tech/topics/caching.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [apollo](<https://devfeed.tech/tags/apollo.md>), [build-tool](<https://devfeed.tech/tags/build-tool.md>), [cache](<https://devfeed.tech/tags/cache.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [plugin](<https://devfeed.tech/tags/plugin.md>)

### AI overview

This tutorial explains how the Apollo Gradle Plugin models GraphQL input files so generated Kotlin package names remain correct without breaking Gradle build cache relocation. It recommends using FileCollection and related APIs to preserve each file's relative path and other input information.

### Source excerpt

This is a follow up to this other post about having fun with the Gradle APIs. In this post, I'm talking about how I spent a shameful amount of time understanding how Gradle handles input files. The problem The Apollo Gradle Plugin is generating Kotli...

## Analyzing Jetpack Compose compiler reports with a Gradle plugin

DevFeed: [Analyzing Jetpack Compose compiler reports with a Gradle plugin](<https://devfeed.tech/articles/effortless-compose-compiler-report-analysis-25716.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/effortless-compose-compiler-report-analysis/>)

Author: Shreyas Patil

Published: 2024-05-20T12:30:51Z

Content type: tutorial

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>)

Tags: [analysis](<https://devfeed.tech/tags/analysis.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [debugging](<https://devfeed.tech/tags/debugging.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [guide](<https://devfeed.tech/tags/guide.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [opensource](<https://devfeed.tech/tags/opensource.md>), [performance](<https://devfeed.tech/tags/performance.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how Jetpack Compose compiler reports expose composable-function stability, restartability, and skippability. It presents a Gradle plugin that parses the reports and metrics and converts them into an HTML report highlighting potentially problematic and non-problematic composables and classes.

### Source excerpt

A guide to analyzing Jetpack Compose compiler reports easily. Learn how to diagnose stability and skippability of your composables for better performance.

## Measuring and analyzing the KotlinJS bundle size - Gustavo Fão Valvassori

DevFeed: [Measuring and analyzing the KotlinJS bundle size - Gustavo Fão Valvassori](<https://devfeed.tech/articles/measuring-and-analyzing-the-kotlinjs-bundle-size-gustavo-fao-valvassori-38293.md>)

Original publisher: [Read original article](<https://touchlab.co/measuring-kotlin-js-bundle>)

Published: 2024-02-16T00:00:00Z

Content type: tutorial

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [kotlinjs](<https://devfeed.tech/topics/kotlinjs.md>), [Webpack](<https://devfeed.tech/topics/webpack.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>)

Tags: [analyze](<https://devfeed.tech/tags/analyze.md>), [article](<https://devfeed.tech/tags/article.md>), [devtools](<https://devfeed.tech/tags/devtools.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [kotlin-js](<https://devfeed.tech/tags/kotlin-js.md>), [kotlinjs](<https://devfeed.tech/tags/kotlinjs.md>), [lighthouse](<https://devfeed.tech/tags/lighthouse.md>), [measuring](<https://devfeed.tech/tags/measuring.md>), [performance](<https://devfeed.tech/tags/performance.md>)

### AI overview

This tutorial explains how KotlinJS projects are compiled into JavaScript and bundled with Webpack. It presents two ways to measure and analyze bundle size: examining source maps with SourceMapExplorer or Chrome Lighthouse, and using WebpackBundleAnalyzer.

### Source excerpt

Smaller JavaScript bundle size helps improve a website's loading speed and performance. In this article, we present two different ways of analyzing and measuring KotlinJS bundle size.

## Kotlin 1.9.20: Streamlining Source Sets in Multiplatform Project - Jigar Brahmbhatt

DevFeed: [Kotlin 1.9.20: Streamlining Source Sets in Multiplatform Project - Jigar Brahmbhatt](<https://devfeed.tech/articles/kotlin-1-9-20-streamlining-source-sets-in-multiplatform-project-jigar-brahmbhatt-38259.md>)

Original publisher: [Read original article](<https://touchlab.co/kotlin-1-9-20-source-set-enhancements>)

Published: 2024-02-01T00:00:00Z

Content type: article

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>), [code-completion](<https://devfeed.tech/topics/code-completion.md>), [Code](<https://devfeed.tech/topics/code.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [boilerplate](<https://devfeed.tech/tags/boilerplate.md>), [code-completion](<https://devfeed.tech/tags/code-completion.md>), [development](<https://devfeed.tech/tags/development.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [new-features](<https://devfeed.tech/tags/new-features.md>)

### AI overview

This article explains how Kotlin 1.9.20 improves Kotlin Multiplatform source set configuration. It covers the default source set hierarchy template, simplified iOS target setup, custom source sets, manual template application, and enhanced IDE code completion.

### Source excerpt

Explore how Kotlin 1.9.20's new features significantly enhance the experience of setting up target source sets

## jOOQ 3.19.0 Released with DuckDB, Trino, Oracle 23c support, join path improvements, an official gradle plugin, commercial maven repositories, policies, UDT paths, trigger meta data, hierarchies, and much more

DevFeed: [jOOQ 3.19.0 Released with DuckDB, Trino, Oracle 23c support, join path improvements, an official gradle plugin, commercial maven repositories, policies, UDT paths, trigger meta data, hierarchies, and much more](<https://devfeed.tech/articles/jooq-3-19-0-released-with-duckdb-trino-oracle-23c-support-join-path-improvements-an-official-gradle-plugin-commercial-maven-repositories-policies-udt-paths-trigger-meta-d-28951.md>)

Original publisher: [Read original article](<https://blog.jooq.org/jooq-3-19-0-released-with-duckdb-trino-oracle-23c-support-join-path-improvements-an-official-gradle-plugin-commercial-maven-repositories-policies-udt-paths-trigger-meta-data-hierarchies-and/>)

Author: lukaseder

Published: 2023-12-15T16:30:41Z

Content type: release

Language: en

Sources: [jOOQ](<https://devfeed.tech/sources/jooq.md>)

Topics: [releases](<https://devfeed.tech/topics/releases.md>), [DuckDB](<https://devfeed.tech/topics/duckdb.md>), [CockroachDB](<https://devfeed.tech/topics/cockroachdb.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [rdbms](<https://devfeed.tech/topics/rdbms.md>), [Multi-tenancy](<https://devfeed.tech/topics/multi-tenancy.md>)

Tags: [cockroachdb](<https://devfeed.tech/tags/cockroachdb.md>), [cockroachdb-23](<https://devfeed.tech/tags/cockroachdb-23.md>), [duckdb](<https://devfeed.tech/tags/duckdb.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [implicit-joins](<https://devfeed.tech/tags/implicit-joins.md>), [java-8](<https://devfeed.tech/tags/java-8.md>), [join-paths](<https://devfeed.tech/tags/join-paths.md>), [jooq](<https://devfeed.tech/tags/jooq.md>), [jooq-3-19](<https://devfeed.tech/tags/jooq-3-19.md>), [jooq-development](<https://devfeed.tech/tags/jooq-development.md>), [maven](<https://devfeed.tech/tags/maven.md>), [maven-repository](<https://devfeed.tech/tags/maven-repository.md>), [multi-tenancy](<https://devfeed.tech/tags/multi-tenancy.md>), [oracle-23c](<https://devfeed.tech/tags/oracle-23c.md>), [policies](<https://devfeed.tech/tags/policies.md>), [release-notes](<https://devfeed.tech/tags/release-notes.md>), [releases](<https://devfeed.tech/tags/releases.md>), [row-level-security](<https://devfeed.tech/tags/row-level-security.md>), [security](<https://devfeed.tech/tags/security.md>), [trigger-meta-data](<https://devfeed.tech/tags/trigger-meta-data.md>), [triggers](<https://devfeed.tech/tags/triggers.md>), [trino](<https://devfeed.tech/tags/trino.md>), [trinodb](<https://devfeed.tech/tags/trinodb.md>), [udt-paths](<https://devfeed.tech/tags/udt-paths.md>), [udts](<https://devfeed.tech/tags/udts.md>)

### AI overview

The jOOQ 3.19.0 release adds experimental DuckDB support, Trino support, and support for CockroachDB 23 and Oracle 23c. It also improves join paths, introduces an official Gradle plugin and a commercial Maven repository, and adds policies for row-level security.

### Source excerpt

New Dialects It's been a few releases since we've added support for new dialects, but finally some very interesting RDBMS of increasing popularity have joined the jOOQ family including: These dialects are available in all jOOQ editions. New dialect versions In addition to these entirely new dialects, big new CockroachDB and Oracle versions have shipped: ... Continue reading jOOQ 3.19.0 Released with DuckDB, Trino, Oracle 23c support, join path improvements, an official gradle plugin, commercial maven repositories, policies, UDT paths, trigger meta data, hierarchies, and much more ->

## Evolution of translations management for Android at Revolut

DevFeed: [Evolution of translations management for Android at Revolut](<https://devfeed.tech/articles/evolution-of-translations-management-for-android-at-revolut-26343.md>)

Original publisher: [Read original article](<https://medium.com/revolut/evolution-of-translations-management-for-android-at-revolut-2f97b5969bfb?source=rss----44c5ac415e14---4>)

Author: Yaroslav T

Published: 2023-12-05T17:28:51Z

Content type: article

Language: en

Sources: [Revolut Engineering](<https://devfeed.tech/sources/revolut-engineering.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Development](<https://devfeed.tech/topics/development.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Script](<https://devfeed.tech/topics/script.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Groovy](<https://devfeed.tech/topics/groovy.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [development](<https://devfeed.tech/tags/development.md>), [evolution](<https://devfeed.tech/tags/evolution.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [groovy](<https://devfeed.tech/tags/groovy.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [management](<https://devfeed.tech/tags/management.md>), [migration](<https://devfeed.tech/tags/migration.md>), [translation](<https://devfeed.tech/tags/translation.md>)

### AI overview

An engineering retrospective on how Revolut evolved Android translation management across multiple apps, modules, and languages. It describes using Lokalise, moving translation downloads from app startup to scripts, and migrating the script from Python to Groovy through a Gradle task.

### Source excerpt

Here's everything you need to know about how translations have evolved at Revolut. We currently have 6 apps, with 330 modules containing strings.xml files. And don't forget, we need to support 33 languages. To make the translation process smooth, we use the API of Lokalise. When one of our engineers adds a new string on the platform, it's translated into all languages within 1 hour. After that, we need to download and place the translations into the correct module. Now, from an engineering perspective, here comes the most interesting part! Initial implementation In 2017, we began our expansion, and the first supported languages were French and Polish. We quickly reached a stage where fast translation became an integral part of the feature release process. Using our partner, Lokalise.com, we started implementing translations for a single app (only Revolut retail app existed at the time). We added Lokalise library to our project and used keys from it via a Singleton pattern: https://medium.com/media/b55574683f8ebc328b4049d46f1114bf/href Library downloads translations from the server once the user opens the app. This approach was fast to implement, but had 2 limitations: API has user limit, which is critical for the fast-growing application Download translations on app launch degrades the performance First script To answer both of these problems, we created a simple local script that downloads strings and puts them into the resources' folder. Before releasing a new version of the app, one of the engineers has to call this script and merge translated files into the release branch. https://medium.com/media/78c6e72e4148de66b8d461b467b0df55/hrefSimplifying developers' life Later on, one of our engineers introduced an additional script to upload keys to Lokalise. The goal was to let engineers create new keys in strings.xml during the development process, automatically upload them to the provider, translate them, and then download them back. However, we soon discovered that

## Implementing Multiplatform Kotlin library

DevFeed: [Implementing Multiplatform Kotlin library](<https://devfeed.tech/articles/implementing-multiplatform-kotlin-library-39208.md>)

Original publisher: [Read original article](<https://kt.academy/article/ak-kmp-library>)

Published: 2023-09-18T00:15:00Z

Content type: tutorial

Language: en

Sources: [Kt. Academy](<https://devfeed.tech/sources/kt-academy.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Library](<https://devfeed.tech/topics/library.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [gradle-plugin](<https://devfeed.tech/topics/gradle-plugin.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [workshop-learning-programming](<https://devfeed.tech/tags/workshop-learning-programming.md>)

### AI overview

This tutorial explains how to build and distribute a Kotlin library for multiple platforms using Kotlin Multiplatform. It covers placing platform-independent code in the common source set, configuring platform source sets and dependencies with the Kotlin Multiplatform Gradle plugin, and separating platform-specific file management when needed.

### Source excerpt

How in Kotlin we can use multiplatform capabilities to distribute the same code to multiple platforms.

## How Apollo Kotlin leverages Gradle Enterprise to Rev Up Build Times

DevFeed: [How Apollo Kotlin leverages Gradle Enterprise to Rev Up Build Times](<https://devfeed.tech/articles/how-apollo-kotlin-leverages-gradle-enterprise-to-rev-up-build-times-23356.md>)

Original publisher: [Read original article](<https://www.apollographql.com/blog/how-apollo-kotlin-leverages-gradle-enterprise-to-rev-up-build-times>)

Author: Martin Bonnin

Published: 2023-07-17T09:43:11Z

Content type: article

Language: en

Sources: [Apollo Blog](<https://devfeed.tech/sources/apollo-blog.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [build times](<https://devfeed.tech/topics/build-times.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [code productivity](<https://devfeed.tech/topics/code-productivity.md>)

Tags: [build-times](<https://devfeed.tech/tags/build-times.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [performance](<https://devfeed.tech/tags/performance.md>)

### AI overview

This article describes how the Apollo Kotlin maintainers integrated Gradle Enterprise to optimize a large, multi-platform build. It explains the role of Gradle in Apollo Kotlin and introduces features including build scans, remote build cache, performance analysis, and flaky test management.

### Source excerpt

If you are using Apollo Kotlin, you are very very (very) likely using the Gradle Build Tool. It plays a central part in Apollo Kotlin. It's the build system that downloads your schema, generates your Kotlin models, wires everything together, and makes sure you're not running your tasks too many times. This is done using the Gradle plugin (download, source) amongst other things.

## Plugin Portal Outage Followup

DevFeed: [Plugin Portal Outage Followup](<https://devfeed.tech/articles/plugin-portal-outage-followup-24677.md>)

Original publisher: [Read original article](<https://blog.gradle.org/plugin-portal-outage-followup>)

Author: Sterling Greene

Published: 2023-06-28T04:00:00Z

Content type: article

Language: en

Sources: [The Gradle Blog](<https://devfeed.tech/sources/the-gradle-blog.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [Library](<https://devfeed.tech/topics/library.md>)

Tags: [bintray](<https://devfeed.tech/tags/bintray.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [jfrog](<https://devfeed.tech/tags/jfrog.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [maven-central](<https://devfeed.tech/tags/maven-central.md>), [outage](<https://devfeed.tech/tags/outage.md>), [plugin](<https://devfeed.tech/tags/plugin.md>)

### AI overview

This follow-up explains how an unannounced JCenter change on June 23, 2023 caused Gradle users to experience failures resolving artifacts through the Gradle Plugin Portal. It describes the impact on plugin builds, missing artifacts and transitive dependencies, recovery options, and plans to reduce reliance on JCenter.

### Source excerpt

ℹ Update on July 15, 2024 See our recent blog post for up-to-date information about the Plugin Portal and JCenter. On June 23rd, 2023, at 9:00 UTC, Gradle users started experiencing issues resolving artifacts from the Gradle Plugin Portal because of changes to artifacts hosted on JCenter by JFrog. JCenter stopped serving files directly and redirected all requests to Maven Central. This was an unannounced change. We contacted JFrog, and they replied it was a test and they would revert back to having JCenter serve artifacts. Around 18:30 UTC, JCenter returned to normal behavior. This post describes the effect this outage had on builds, ways to recover from similar outages, and what we will do to eliminate the dependency on JCenter in the future. Users still directly using JCenter should also refer to our original blog post about the shutdown of JCenter on Gradle builds in general. Effects on Gradle plugins usage in builds When JFrog stopped serving artifacts from JCenter, all requests were redirected to Maven Central. This can impact builds in different ways. In this blog post, we focus on the resolution of Gradle plugins from the Plugin Portal. Background information The Plugin Portal only hosts artifacts related to Gradle plugins. The Plugin Portal redirects Gradle builds to JCenter to resolve transitive dependencies required by plugins. Some of these transitive dependencies are hosted by JCenter and some are mirrored from Maven Central. Additionally, some very old versions of Gradle plugins are also hosted on JCenter. This is because they were historically hosted on JFrog's Bintray service. Following Bintray's shutdown in May 2021, we removed the Plugin Portal's integration with Bintray, but we kept redirecting to JCenter for those artifacts because JFrog committed to keeping JCenter read-only indefinitely. When changes are made to JCenter, the Plugin Portal may no longer serve some artifacts or serve different artifacts. Missing artifacts Any artifacts only avail

## Announcing the Apollo Kotlin plugin for Android Studio and IntelliJ IDEA

DevFeed: [Announcing the Apollo Kotlin plugin for Android Studio and IntelliJ IDEA](<https://devfeed.tech/articles/announcing-the-apollo-kotlin-plugin-for-android-studio-and-intellij-idea-23145.md>)

Original publisher: [Read original article](<https://www.apollographql.com/blog/announcing-the-apollo-kotlin-plugin-for-android-studio-and-intellij-idea>)

Author: Benoit Lubek

Published: 2023-06-20T12:22:59Z

Content type: release

Language: en

Sources: [Apollo Blog](<https://devfeed.tech/sources/apollo-blog.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>), [Code generation](<https://devfeed.tech/topics/code-generation.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Library](<https://devfeed.tech/topics/library.md>), [ide](<https://devfeed.tech/topics/ide.md>)

Tags: [android-studio](<https://devfeed.tech/tags/android-studio.md>), [apollo](<https://devfeed.tech/tags/apollo.md>), [code-generation](<https://devfeed.tech/tags/code-generation.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [intellij-idea](<https://devfeed.tech/tags/intellij-idea.md>), [issue-tracker](<https://devfeed.tech/tags/issue-tracker.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [migration](<https://devfeed.tech/tags/migration.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [navigation](<https://devfeed.tech/tags/navigation.md>), [plugin](<https://devfeed.tech/tags/plugin.md>), [preview](<https://devfeed.tech/tags/preview.md>), [release](<https://devfeed.tech/tags/release.md>)

### AI overview

Apollo introduced a preview plugin for Android Studio and IntelliJ IDEA that improves Apollo Kotlin development with automatic background code generation, migration helpers, and navigation between Kotlin and GraphQL definitions.

### Source excerpt

We're happy to introduce an Apollo Kotlin plugin for Android Studio and IntelliJ IDEA, to help you work with the library and improve your productivity. This preview release can be tried out today. Features On-the-fly code generation Apollo Kotlin is a strongly-typed client library that generates models from your GraphQL queries. This works thanks to a Gradle plugin that triggers the code generation at build time.

## Applying a 3rd Party Gradle Plugin as a Composite Plugin

DevFeed: [Applying a 3rd Party Gradle Plugin as a Composite Plugin](<https://devfeed.tech/articles/applying-a-3rd-party-gradle-plugin-as-a-composite-plugin-24903.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/applying-a-3rd-party-gradle-plugin-as-a-composite-plugin/>)

Author: blundell

Published: 2023-01-10T10:29:19Z

Content type: tutorial

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [Android Library](<https://devfeed.tech/topics/android-library.md>), [Template](<https://devfeed.tech/topics/template.md>)

Tags: [android-studio](<https://devfeed.tech/tags/android-studio.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [build](<https://devfeed.tech/tags/build.md>), [composite-build](<https://devfeed.tech/tags/composite-build.md>), [dropbox](<https://devfeed.tech/tags/dropbox.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [intermediate-tutorial-androiddev-composite-build-gradle-plugin](<https://devfeed.tech/tags/intermediate-tutorial-androiddev-composite-build-gradle-plugin.md>), [library](<https://devfeed.tech/tags/library.md>), [multi-module-project](<https://devfeed.tech/tags/multi-module-project.md>), [plugin](<https://devfeed.tech/tags/plugin.md>), [project](<https://devfeed.tech/tags/project.md>), [reference](<https://devfeed.tech/tags/reference.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A tutorial on wrapping a third-party Gradle plugin in a custom plugin and including it through a Gradle composite build. Using Dropbox's Affected Module Detector as an example, it shows how a multi-module Android project can use the plugin's tasks while extending its behavior without forking or republishing it.

### Source excerpt

This post shows you how to wrap a 3rd party Gradle plugin in your own plugin, so that you can interactive with it programmatically. The post Applying a 3rd Party Gradle Plugin as a Composite Plugin first appeared on Blundell.

[Next page](<https://devfeed.tech/tags/gradle-plugin.md?cursor=WyIyMDIzLTAxLTEwVDEwOjI5OjE5KzAwOjAwIiwgImRhNTBhMGY5LWQ3MTktNDNhOS05NDkzLTMyMTZiNWZlY2Q1MCJd>)