Solutions

Android Squared CardView

Recently, I had to add a perfect squared CardView and I wanted to achieve this without hardcoding its width and height. I happily discovered the power of ConstraintLayout. And so this is how I managed to create a perfect square which should work on every dimension. Heres some sample code that I used to create […]

, , ,
Refactoring with AI
Articles

LLM Prompts for Code Refactoring: A Practical Guide

LLM Prompts for Code Refactoring: Structuring Your Requests When you’re facing a large refactoring task in your Android codebase, asking an LLM the right way can save you hours. Unlike simple coding questions, refactoring requires your AI assistant to understand the architectural context, the business logic you’re preserving, and the specific constraints of your project.

, , , ,
AI assistant concept with code on screen
Articles

Generate Architecture Docs from Code with LLMs

Generate Architecture Documentation Automatically from Your Codebase You know the problem: your app’s architecture documentation is either non-existent, wildly out of date, or buried in scattered wiki pages that nobody reads. By the time you onboard a new developer, they’re confused about module boundaries, data flow, and how components talk to each other. Modern LLMs

, , , ,
Autumn sunny sunset
Tutorials

Building a Day/Night Sky Gradient System for Android Live Wallpapers

Creating Realistic Sky Gradients That Change With the Sun When you look at a great live wallpaper, what makes it feel alive isn’t just animation — it’s the sky. A static blue-to-orange gradient at the top of your screen feels dead after five minutes. But a sky that actually shifts through dawn blues, golden hours,

, , , , ,
Tutorials

One HTTP Client for Android and iOS: Ktor 3 in a KMP Shared Module

The Networking Problem in KMP Projects Before Kotlin Multiplatform, Android had Retrofit and OkHttp while iOS had URLSession or Alamofire — two completely separate networking stacks, two sets of models to keep in sync, and twice the bugs to chase. KMP solves this at the shared-module level, and Ktor Client is the library built specifically

, , , , , ,
Circuit board representing platform layers
Tutorials

expect and actual: The Mechanism That Makes Kotlin Multiplatform Tick

The Core Problem KMP Has to Solve Kotlin Multiplatform lets you share business logic across Android, iOS, desktop, and web — but each platform still has its own APIs. Android has Log, iOS has NSLog, Android has SharedPreferences, iOS has NSUserDefaults. KMP’s answer to this is a two-keyword mechanism: expect and actual. It’s the single

, , , , ,
Code on a dark monitor screen
Tutorials

Kotlin Property Delegates You’re Probably Not Using: observable and vetoable

Why Property Delegates Often Go Unnoticed Most Kotlin developers know lazy — it’s everywhere. You see it in Android ViewModels, dependency injection setups, and library code. But the standard library ships two more property delegates that are surprisingly powerful and almost never discussed: Delegates.observable and Delegates.vetoable. If you’ve been wiring up manual setters or using

, , , , ,
Tutorials

Building a Weather-Reactive Rendering Engine for Android Live Wallpapers

Making Your Wallpaper Respond to Real-World Weather A beautiful sky gradient is a good start, but what makes Seasons Live Wallpaper feel special is that it reacts to the actual weather outside your window. Rain particles drift down when it’s raining. Snow accumulates during winter storms. Fog creeps in on humid mornings. Lightning flashes light

, , , , ,
Laptop with Kotlin code open
Tutorials

Lazy Computation in Kotlin: The sequence Builder and How It Can Save Your Memory

The Hidden Cost of Eager Collections Kotlin’s collection functions — map, filter, flatMap — are a joy to use. But they share one characteristic that can quietly hurt your app: they’re eager. Each call processes the entire source and allocates a brand new intermediate list. Chain three or four of them on a list of

, , , , ,
Articles

Rubber Duck Debugging with AI: Prompt Patterns for Effective Debugging

Rubber Duck Debugging with AI: The Modern Approach “Rubber duck debugging” is an old technique: you explain your bug to an inanimate object (a rubber duck), and in the process of explaining, you discover the problem yourself. Today’s AI assistants make this technique more powerful. Instead of talking to a duck, you can ask an

, , , ,
Code on a dark monitor
Tutorials

Claude Code Skills for Android: Automate the Boilerplate You Write Every Day

What Skills Are in Claude Code Once you’ve used Claude Code for a while you’ll notice you repeat the same prompts. “Create a new feature screen with a ViewModel and UiState.” “Add a Room entity and DAO for this model.” “Write a Hilt module that provides this repository.” These are perfect candidates for skills —

, , , , , ,
Seasons Live Wallpaper - for your Android device
Articles

Seasons Live Wallpaper — A Living, Breathing Home Screen for Android

What If Your Wallpaper Knew the Weather? Most live wallpapers loop the same animation forever. They look nice for a day, then you forget they’re even there. Seasons Live Wallpaper is different — it’s a wallpaper that actually pays attention to the world around you. Built by an indie developer from Romania, Seasons brings four

, , , , ,
Close-up of code on a screen
Tutorials

Writing Android Tests and Debugging With Claude Code: A Practical Workflow

The Part of Android Development “Nobody Enjoys” :P Writing tests and debugging are the two parts of Android development where most developers lose the most time. Tests feel like writing code twice, and debugging often means staring at a stack trace while trying to hold an entire call graph in your head. Claude Code doesn’t

, , , , , , ,
Tutorials

Stop Using mutableListOf + toList(): Meet Kotlin’s buildList, buildMap, and buildSet

A Familiar But Slightly Awkward Pattern If you’ve written Kotlin for a while, you’ve almost certainly written code like this: fun getActiveUsers(users: List): List { val result = mutableListOf() for (user in users) { if (user.isActive) result.add(user) if (user.isPremium) result.add(user.copy(label = “Premium”)) } return result.toList() // convert back to read-only } The pattern works, but

, , , , ,
Tutorials

Functional Error Handling in Kotlin: runCatching and the Result Type

The Problem With Try-Catch Everywhere Exception handling in Kotlin (and Java before it) has always had a composability problem. Once you introduce a try-catch block, you break the expression-oriented flow of your code. You can’t easily chain operations, return from them in one line, or pass the “success or failure” result to another function without

, , , , ,
Scroll to Top