KMP Tutorial #2: Setting Up Your First Kotlin Multiplatform Project

In the previous tutorial, we learned what KMP is and why it matters. Now let’s get our hands dirty — create a real project, understand every file in it, write shared code, and run it on both Android and iOS. This is a long tutorial. Take your time. By the end, you will have a working cross-platform app and understand exactly how every piece fits together. Part 1: Setting Up Your Environment What You Need Tool Required Purpose Android Studio Yes IDE for KMP development (latest stable) Xcode Yes (Mac only) Builds and runs iOS apps JDK 17+ Yes Kotlin compiler depends on it Mac computer For iOS Apple requires Xcode, which only runs on macOS CocoaPods Optional Some KMP libraries need it for iOS If you are on Windows or Linux, you can still write shared code and build the Android app. But you cannot build or run iOS. There is no way around this — Apple controls iOS builds. ...

April 1, 2026 · 14 min

KMP Tutorial #1: What is Kotlin Multiplatform and Why Should You Learn It?

You are a Kotlin developer. You build Android apps. But your company also needs an iOS app. And maybe a desktop app. And a web app. Do you write everything four times? Do you switch to Flutter and learn Dart? Do you hire a separate iOS team? Or do you use the Kotlin you already know — and share your code across all platforms? That is what Kotlin Multiplatform (KMP) does. ...

April 1, 2026 · 8 min

Rust Tutorial #28: Rust for AI/ML — Polars, Burn, PyO3

In the previous tutorial, we explored embedded Rust. Now we look at Rust for AI and Machine Learning — why Rust is growing in this space, what tools exist, and how to implement core ML concepts from scratch. This tutorial builds everything from standard Rust. No heavy dependencies. You will understand the math and patterns behind AI/ML, and learn about the crates that make production use practical. Why Rust for AI/ML? Python dominates AI/ML. So why use Rust? ...

March 26, 2026 · 10 min

Rust WebAssembly Tutorial: wasm-pack, wasm-bindgen, and Leptos

In the previous tutorial, we explored Rust for AI/ML. Now we learn WebAssembly (WASM) — how to run Rust code in the browser at near-native speed. This is a conceptual tutorial. The code runs on your regular computer but demonstrates the exact patterns used in real Rust+WASM projects. You will understand how WASM works, how data flows between Rust and JavaScript, and how frameworks like Leptos build web apps entirely in Rust. ...

March 26, 2026 · 9 min

Rust Tutorial #30: Unsafe Rust — When and How to Use It Safely

In the previous tutorial, we explored WebAssembly. Now we learn unsafe Rust — what it means, when you need it, and how to use it without breaking Rust’s safety guarantees. Rust’s safety system prevents bugs at compile time. But some things are impossible to verify at compile time. Raw pointer operations, FFI calls, and certain data structures need to bypass the borrow checker. That’s what unsafe is for. Important: unsafe doesn’t mean “dangerous” or “bad.” It means “the programmer is responsible for correctness here, not the compiler.” Used correctly, unsafe code is just as safe as safe code. ...

March 26, 2026 · 10 min

Rust Tutorial #27: Embedded Rust — no_std and Embassy

In the previous tutorial, we did a collections deep dive. Now we explore Embedded Rust — how Rust works on microcontrollers, what no_std means, and why Rust is becoming the language of choice for embedded systems. This is a conceptual tutorial. The code runs on your regular computer but demonstrates the patterns you use in real embedded Rust. You don’t need hardware to follow along. Why Rust for Embedded? Embedded systems have strict requirements: no crashes, no memory leaks, no undefined behavior. A bug in a pacemaker or car brakes can be fatal. ...

March 26, 2026 · 9 min

Rust Tutorial #31: Building a Real Project (Capstone)

This is the final tutorial in our Rust series. We bring together everything you learned — ownership, error handling, async, web APIs, databases, and CLI tools — into one complete project. We will build LinkShort, a URL shortener. It has two parts: A REST API — create, list, and redirect short links (Axum + SQLx) A CLI tool — manage links from the terminal (Clap + Reqwest) By the end, you will have a working application that you can run locally, extend, and deploy. ...

March 26, 2026 · 12 min

Jetpack Compose Tutorial #25: Publishing Your App to Google Play

This is it — the final tutorial. You built a complete task manager app with Jetpack Compose, Room, Hilt, Navigation, MVI, animations, and adaptive layouts. Now let’s put it in the hands of real users. Before You Publish — Checklist Make sure your app is ready: App works — test every feature on a real device No crashes — check Logcat for errors Dark mode works — test both themes Different screen sizes — test on phone and tablet Keyboard handling — forms work with keyboard visible Proguard/R8 — release build compiles and runs App icon — custom icon (not the default green Android) App name — set in strings.xml Step 1: Generate a Signing Key Every app on Google Play must be signed. This proves the app comes from you. ...

March 26, 2026 · 6 min

Rust Tutorial #4: Ownership — The Key Concept

In the previous tutorial, we learned variables, types, and functions. Now we tackle the most important concept in Rust — ownership. Ownership is what makes Rust unique. It is the reason Rust has no garbage collector, yet never leaks memory. Every Rust programmer must understand ownership. Once you get it, the rest of Rust clicks into place. Why Ownership Exists Most languages manage memory in one of two ways: Garbage collector (Java, Kotlin, Go, Python) — A background process finds and frees unused memory. Simple for the programmer, but uses extra CPU and can cause pauses. Manual management (C, C++) — The programmer allocates and frees memory. Fast, but easy to make mistakes — use-after-free, double-free, memory leaks. Rust takes a third approach: ...

March 26, 2026 · 9 min

Rust Tutorial #5: Borrowing and References

In the previous tutorial, we learned about ownership. We saw that passing a value to a function moves it, and you cannot use it anymore. That works, but it is limiting. What if a function only needs to read the data? What if it needs to modify it but give it back? You should not have to move ownership every time. This is where borrowing comes in. Borrowing lets you use a value without taking ownership of it. The value stays with the original owner. ...

March 26, 2026 · 7 min