<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Saidur Rahman</title>
    <description>The latest articles on Forem by Saidur Rahman (@saidurtech).</description>
    <link>https://forem.com/saidurtech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3559953%2F1e129dc4-5094-462f-a5df-6bf1cb381d88.jpg</url>
      <title>Forem: Saidur Rahman</title>
      <link>https://forem.com/saidurtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/saidurtech"/>
    <language>en</language>
    <item>
      <title>Retain API in Jetpack Compose</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Fri, 26 Dec 2025 01:05:40 +0000</pubDate>
      <link>https://forem.com/saidurtech/retain-api-in-jetpack-compose-1923</link>
      <guid>https://forem.com/saidurtech/retain-api-in-jetpack-compose-1923</guid>
      <description>&lt;h2&gt;
  
  
  Mastering the Retain API in Jetpack Compose: Why &amp;amp; How It Matters
&lt;/h2&gt;

&lt;p&gt;In modern Android development with Jetpack Compose, managing state effectively — especially across configuration changes — is crucial for building resilient and fluid UI experiences. That’s where the &lt;strong&gt;Retain API&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore:&lt;/p&gt;

&lt;p&gt;🔹 What the Retain API is&lt;br&gt;
🔹 Why it matters&lt;br&gt;
🔹 How to use it with examples&lt;br&gt;
🔹 Best practices&lt;br&gt;
🔹 Helpful resources&lt;/p&gt;


&lt;h2&gt;
  
  
  What is the Retain API?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Retain API&lt;/strong&gt; in Jetpack Compose lets you &lt;em&gt;preserve state&lt;/em&gt; across configuration changes like device rotation, process death, and navigation lifecycle events — without relying on manual save/restore logic.&lt;/p&gt;

&lt;p&gt;Unlike typical &lt;code&gt;remember&lt;/code&gt; or &lt;code&gt;mutableStateOf&lt;/code&gt;, which hold state only during composition lifetime, the Retain API ties state to the &lt;em&gt;lifecycle owner&lt;/em&gt; (e.g., ViewModel, NavBackStackEntry), ensuring it survives events like rotation.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Use the Retain API?
&lt;/h2&gt;

&lt;p&gt;Here’s why the Retain API is a game-changer:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Survives configuration changes&lt;/strong&gt; (e.g., screen rotation)&lt;br&gt;
✅ &lt;strong&gt;Works with process death restoration&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Integrates with ViewModels &amp;amp; Navigation&lt;/strong&gt;&lt;br&gt;
✅ More concise and Compose-friendly than &lt;code&gt;onSaveInstanceState&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It simplifies state persistence without boilerplate, so you can focus on building features.&lt;/p&gt;


&lt;h2&gt;
  
  
  Core Concepts
&lt;/h2&gt;

&lt;p&gt;There are three key building blocks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rememberRetained&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persists state across composition &amp;amp; config changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RetainedSaveableStateRegistry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Handles the save/restore lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SavedStateHandle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Works with ViewModels for state persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Example: Persist Form State with Retain API
&lt;/h2&gt;

&lt;p&gt;Let’s say you have a simple form that you want to keep alive across rotations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Without Retain API (Problem)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProfileForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;Column&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The moment the device rotates, the state is lost.&lt;/p&gt;


&lt;h3&gt;
  
  
  With Retain API
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProfileFormRetained&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;retainedState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberRetained&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retainedState&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;retainedEmail&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberRetained&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="py"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retainedEmail&lt;/span&gt;

    &lt;span class="nc"&gt;Column&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the state survives rotation — and you write less code.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using Retain API with ViewModel
&lt;/h2&gt;

&lt;p&gt;If you’re using a ViewModel, you can store the retained state inside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfileViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;savedStateHandle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SavedStateHandle&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;savedStateHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;savedStateHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProfileScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ProfileViewModel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hiltViewModel&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onValueChange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures even &lt;strong&gt;process death restoration&lt;/strong&gt;, not just rotation persistence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;✨ Favor &lt;code&gt;rememberRetained&lt;/code&gt; for UI state that must survive recomposition&lt;br&gt;
✨ Use &lt;code&gt;SavedStateHandle&lt;/code&gt; with ViewModel for process death and navigation state&lt;br&gt;
✨ Scope retained state to where it logically belongs (e.g., ViewModel vs Composable)&lt;/p&gt;




&lt;h2&gt;
  
  
  Resource Links
&lt;/h2&gt;

&lt;p&gt;Here are official resources to deepen your knowledge:&lt;/p&gt;

&lt;p&gt;🔗 Android Dev — Jetpack Compose State &amp;amp; State Hoisting&lt;br&gt;
&lt;a href="https://developer.android.com/jetpack/compose/state" rel="noopener noreferrer"&gt;https://developer.android.com/jetpack/compose/state&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 SavedStateHandle in ViewModel&lt;br&gt;
&lt;a href="https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate" rel="noopener noreferrer"&gt;https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Jetpack Compose API Reference&lt;br&gt;
&lt;a href="https://developer.android.com/reference/kotlin/androidx/compose" rel="noopener noreferrer"&gt;https://developer.android.com/reference/kotlin/androidx/compose&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Retain API&lt;/strong&gt; is one of those under-the-hood features that makes real-world Compose apps robust and maintainable. Whether you’re handling forms, navigation state, or UI flags, understanding how to retain state confidently will boost both developer productivity and user experience.&lt;/p&gt;

&lt;p&gt;Happy Composing! 🎨📱&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>Automating Real-Life Workflows with n8n</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Sat, 20 Dec 2025 18:41:44 +0000</pubDate>
      <link>https://forem.com/saidurtech/automating-real-life-workflows-with-n8n-fbi</link>
      <guid>https://forem.com/saidurtech/automating-real-life-workflows-with-n8n-fbi</guid>
      <description>&lt;h3&gt;
  
  
  Scheduling, Chat, Smart Decisions &amp;amp; AI-Powered Automation
&lt;/h3&gt;

&lt;p&gt;Automation has evolved far beyond simple “if this, then that” rules. Today, businesses need &lt;strong&gt;intelligent workflows&lt;/strong&gt; that can understand language, summarize data, make decisions, and act autonomously.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;n8n&lt;/strong&gt;, combined with &lt;strong&gt;AI models like Gemini&lt;/strong&gt;, becomes a powerful solution.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What n8n is and why it’s different&lt;/li&gt;
&lt;li&gt;How AI fits into automation&lt;/li&gt;
&lt;li&gt;Real-life automation examples using n8n AI&lt;/li&gt;
&lt;li&gt;How you can build these workflows yourself using &lt;strong&gt;n8n.io/ai&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Introduction &amp;amp; Motivation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem Today
&lt;/h3&gt;

&lt;p&gt;Most teams still struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too many &lt;strong&gt;manual, repetitive tasks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data scattered across multiple tools&lt;/li&gt;
&lt;li&gt;Humans doing &lt;strong&gt;machine-friendly work&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Traditional automation lacking intelligence and flexibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automation + AI = Intelligent Workflows&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By combining &lt;strong&gt;n8n’s workflow automation&lt;/strong&gt; with &lt;strong&gt;AI reasoning&lt;/strong&gt;, we can build systems that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand natural language&lt;/li&gt;
&lt;li&gt;Make smart decisions&lt;/li&gt;
&lt;li&gt;Work 24/7 with minimal human intervention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;n8n + AI (Gemini, OpenAI, etc.) truly shines&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is n8n?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;n8n&lt;/strong&gt; (pronounced &lt;em&gt;n-eight-n&lt;/em&gt;) is an &lt;strong&gt;open-source, low-code workflow automation platform&lt;/strong&gt; that allows you to visually connect apps, APIs, and services to automate complex processes.&lt;/p&gt;

&lt;p&gt;Think of it as a more flexible, developer-friendly alternative to tools like Zapier or Make — with full control and self-hosting options.&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n Overview
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open-source workflow automation tool&lt;/li&gt;
&lt;li&gt;No-code / Low-code&lt;/li&gt;
&lt;li&gt;Self-hosted or cloud-based&lt;/li&gt;
&lt;li&gt;400+ built-in integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Capabilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling (Cron jobs)&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;li&gt;API calls&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;Data transformation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How n8n Works (Key Features)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Visual Workflow Builder
&lt;/h3&gt;

&lt;p&gt;A drag-and-drop interface lets you connect nodes like puzzle pieces, making automation easy to understand and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Node-Based System
&lt;/h3&gt;

&lt;p&gt;Each node performs a single task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch data&lt;/li&gt;
&lt;li&gt;Call an API&lt;/li&gt;
&lt;li&gt;Send an email&lt;/li&gt;
&lt;li&gt;Run AI prompts&lt;/li&gt;
&lt;li&gt;Transform JSON data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Open-Source &amp;amp; Self-Hostable
&lt;/h3&gt;

&lt;p&gt;You own your data and infrastructure. No vendor lock-in.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Low-Code / No-Code Friendly
&lt;/h3&gt;

&lt;p&gt;Non-developers can build workflows visually, while developers can inject &lt;strong&gt;custom JavaScript&lt;/strong&gt; for advanced logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Powerful Data Handling
&lt;/h3&gt;

&lt;p&gt;n8n works like an &lt;strong&gt;ETL tool&lt;/strong&gt;, moving and transforming structured JSON data between systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why AI + Automation?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Traditional Automation
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“If this → then that”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  AI-Powered Automation
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Understand → Decide → Act&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  AI Enables:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Natural language understanding&lt;/li&gt;
&lt;li&gt;Context-aware decision-making&lt;/li&gt;
&lt;li&gt;Text summarization&lt;/li&gt;
&lt;li&gt;Smart classification&lt;/li&gt;
&lt;li&gt;Conversational workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly why n8n introduced &lt;strong&gt;native AI workflows&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  n8n AI: Built-In Intelligence
&lt;/h2&gt;

&lt;p&gt;n8n provides dedicated AI features documented at:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://n8n.io/ai/" rel="noopener noreferrer"&gt;https://n8n.io/ai/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What n8n AI Offers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI Agent nodes&lt;/li&gt;
&lt;li&gt;Prompt templates&lt;/li&gt;
&lt;li&gt;Structured JSON outputs&lt;/li&gt;
&lt;li&gt;Memory &amp;amp; context handling&lt;/li&gt;
&lt;li&gt;Easy integration with LLMs (Gemini, OpenAI, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can build &lt;strong&gt;AI-powered workflows without writing complex backend code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;YouTube Learning Resources&lt;/strong&gt;&lt;br&gt;
n8n’s official YouTube channel provides step-by-step tutorials covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;Chatbots&lt;/li&gt;
&lt;li&gt;Email automation&lt;/li&gt;
&lt;li&gt;Scheduling &amp;amp; monitoring workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Perfect for beginners and advanced users.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture: n8n + Gemini AI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  High-Level Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger (Webhook / Schedule)
        ↓
n8n Workflow
        ↓
Gemini API (Prompt + Data)
        ↓
AI Response
        ↓
Decision / Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integration Method
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTTP Request or AI Agent node&lt;/li&gt;
&lt;li&gt;Secure API key authentication&lt;/li&gt;
&lt;li&gt;Prompt engineering inside n8n&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-Life Automation Examples
&lt;/h2&gt;




&lt;h2&gt;
  
  
  Example 1: AI Chatbot Integration (Customer Support)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario
&lt;/h3&gt;

&lt;p&gt;A business receives hundreds of repeated customer questions through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website chat&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Support team overloaded&lt;/li&gt;
&lt;li&gt;Delayed responses&lt;/li&gt;
&lt;li&gt;Poor customer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution: AI Chatbot with n8n
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Workflow Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User sends a message&lt;/li&gt;
&lt;li&gt;Webhook triggers n8n&lt;/li&gt;
&lt;li&gt;Message is sent to Gemini via AI node&lt;/li&gt;
&lt;li&gt;Gemini understands intent and generates a reply&lt;/li&gt;
&lt;li&gt;n8n sends the response back&lt;/li&gt;
&lt;li&gt;Optional escalation to human support&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a customer support assistant.
Answer politely and concisely.
User question: {{$json.message}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;✅ 24/7 AI support&lt;br&gt;
✅ Reduced workload&lt;br&gt;
✅ Faster responses&lt;/p&gt;

&lt;p&gt;📸 &lt;em&gt;Screenshot suggestion:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webhook trigger&lt;/li&gt;
&lt;li&gt;AI Agent node&lt;/li&gt;
&lt;li&gt;Response node&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example 2: Scheduled AI Reports (Daily Business Summary)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario
&lt;/h3&gt;

&lt;p&gt;Managers need daily insights from sales and operational data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manual analysis is time-consuming&lt;/li&gt;
&lt;li&gt;Reports are inconsistent&lt;/li&gt;
&lt;li&gt;Important trends are missed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution: Scheduled AI Reporting
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cron trigger (Every day at 9 AM)&lt;/li&gt;
&lt;li&gt;Fetch data from DB / Google Sheets&lt;/li&gt;
&lt;li&gt;Send data to Gemini&lt;/li&gt;
&lt;li&gt;Gemini summarizes trends and anomalies&lt;/li&gt;
&lt;li&gt;n8n emails the report or posts to Slack&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze the following sales data.
Summarize key insights and risks.
Data: {{$json}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Human-like executive summary&lt;/li&gt;
&lt;li&gt;Actionable insights&lt;/li&gt;
&lt;li&gt;Zero manual effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;em&gt;Screenshot suggestion:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cron node&lt;/li&gt;
&lt;li&gt;Data fetch node&lt;/li&gt;
&lt;li&gt;AI summarization node&lt;/li&gt;
&lt;li&gt;Email / Slack node&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example 3: Smart Workflow Decisions (AI Task Routing)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario
&lt;/h3&gt;

&lt;p&gt;Incoming support or job requests need intelligent routing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static rules don’t scale&lt;/li&gt;
&lt;li&gt;Edge cases are hard to manage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution: AI-Based Decision Engine
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Receive incoming request&lt;/li&gt;
&lt;li&gt;Gemini classifies urgency and intent&lt;/li&gt;
&lt;li&gt;n8n assigns:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Team&lt;/li&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;li&gt;SLA&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example AI Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Support Level 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sla"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 hours"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Smarter routing&lt;/li&gt;
&lt;li&gt;Faster resolution&lt;/li&gt;
&lt;li&gt;Reduced manual triage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;em&gt;Screenshot suggestion:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input webhook&lt;/li&gt;
&lt;li&gt;AI classification node&lt;/li&gt;
&lt;li&gt;Conditional routing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security, Cost &amp;amp; Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Store API keys securely&lt;/li&gt;
&lt;li&gt;Avoid sending sensitive personal data&lt;/li&gt;
&lt;li&gt;Use environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Limit token usage&lt;/li&gt;
&lt;li&gt;Use summaries instead of raw data&lt;/li&gt;
&lt;li&gt;Cache AI responses when possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write clear prompts&lt;/li&gt;
&lt;li&gt;Use structured JSON outputs&lt;/li&gt;
&lt;li&gt;Add fallback logic&lt;/li&gt;
&lt;li&gt;Enable logging and monitoring&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Future Possibilities with n8n AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI agents coordinating multiple workflows&lt;/li&gt;
&lt;li&gt;Voice-based automation&lt;/li&gt;
&lt;li&gt;Automatic approvals&lt;/li&gt;
&lt;li&gt;AI-driven business operations&lt;/li&gt;
&lt;li&gt;Intelligent monitoring &amp;amp; alerting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;n8n handles &lt;strong&gt;execution&lt;/strong&gt;.&lt;br&gt;
AI models like Gemini provide &lt;strong&gt;intelligence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Together, they enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smarter automation&lt;/li&gt;
&lt;li&gt;Faster decision-making&lt;/li&gt;
&lt;li&gt;Scalable, future-ready workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Start small, automate one process, then scale intelligently.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Useful Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;n8n AI Docs: &lt;a href="https://n8n.io/ai/" rel="noopener noreferrer"&gt;https://n8n.io/ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;n8n Official Website: &lt;a href="https://n8n.io" rel="noopener noreferrer"&gt;https://n8n.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;n8n YouTube Tutorials (Search: “n8n AI workflows”)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>KMP vs CMP: Kotlin Multiplatform vs Compose Multiplatform – A Complete Guide</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Mon, 15 Dec 2025 14:41:04 +0000</pubDate>
      <link>https://forem.com/saidurtech/kmp-vs-cmp-kotlin-multiplatform-vs-compose-multiplatform-a-complete-guide-2nm1</link>
      <guid>https://forem.com/saidurtech/kmp-vs-cmp-kotlin-multiplatform-vs-compose-multiplatform-a-complete-guide-2nm1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As mobile and cross-platform development continues to evolve, &lt;strong&gt;Kotlin Multiplatform (KMP)&lt;/strong&gt; and &lt;strong&gt;Compose Multiplatform (CMP)&lt;/strong&gt; have emerged as two powerful technologies backed by JetBrains. While they are often mentioned together, they serve &lt;strong&gt;different purposes&lt;/strong&gt; and solve &lt;strong&gt;different problems&lt;/strong&gt;. This blog post explains &lt;strong&gt;what KMP and CMP are&lt;/strong&gt;, how they differ, where they overlap, and &lt;strong&gt;when to use each&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Kotlin Multiplatform (KMP)?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kotlin Multiplatform (KMP)&lt;/strong&gt; is a technology that allows developers to &lt;strong&gt;share business logic across multiple platforms&lt;/strong&gt; while still writing &lt;strong&gt;platform-specific UI&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Android (JVM)&lt;/li&gt;
&lt;li&gt;iOS (Native)&lt;/li&gt;
&lt;li&gt;Web (JavaScript)&lt;/li&gt;
&lt;li&gt;Desktop (JVM)&lt;/li&gt;
&lt;li&gt;Backend (JVM)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You Share in KMP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Business logic&lt;/li&gt;
&lt;li&gt;Data models&lt;/li&gt;
&lt;li&gt;Networking layer&lt;/li&gt;
&lt;li&gt;Validation logic&lt;/li&gt;
&lt;li&gt;Domain layer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You Don’t Share
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UI code (by default)&lt;/li&gt;
&lt;li&gt;Platform-specific APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How KMP Works
&lt;/h3&gt;

&lt;p&gt;KMP lets you write &lt;strong&gt;common code&lt;/strong&gt; in a shared module (&lt;code&gt;commonMain&lt;/code&gt;) and platform-specific implementations in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;androidMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iosMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jsMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;desktopMain&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shared code is compiled to native binaries or bytecode depending on the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benefits of KMP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maximum code reuse without sacrificing native UI&lt;/li&gt;
&lt;li&gt;Native performance&lt;/li&gt;
&lt;li&gt;Full access to platform APIs&lt;/li&gt;
&lt;li&gt;Easier gradual adoption in existing apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KMP Example (Shared Logic)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;getUserName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Saidur Rahman"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used from Android (Kotlin) and iOS (Swift) seamlessly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Compose Multiplatform (CMP)?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Compose Multiplatform (CMP)&lt;/strong&gt; is a &lt;strong&gt;UI framework&lt;/strong&gt; that allows developers to &lt;strong&gt;share UI code across multiple platforms&lt;/strong&gt; using &lt;strong&gt;Jetpack Compose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CMP focuses on &lt;strong&gt;how the app looks&lt;/strong&gt;, not how business logic is structured.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Desktop (Windows, macOS, Linux)&lt;/li&gt;
&lt;li&gt;Web (Experimental)&lt;/li&gt;
&lt;li&gt;iOS (Beta)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You Share in CMP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UI components&lt;/li&gt;
&lt;li&gt;Screens&lt;/li&gt;
&lt;li&gt;Navigation logic&lt;/li&gt;
&lt;li&gt;UI state management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How CMP Works
&lt;/h3&gt;

&lt;p&gt;CMP uses the &lt;strong&gt;Compose declarative UI paradigm&lt;/strong&gt;, where UI is written once and rendered across platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  CMP Example (Shared UI)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, $name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same UI code can run on Android, Desktop, and iOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Differences: KMP vs CMP
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Kotlin Multiplatform (KMP)&lt;/th&gt;
&lt;th&gt;Compose Multiplatform (CMP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary Purpose&lt;/td&gt;
&lt;td&gt;Share business logic&lt;/td&gt;
&lt;td&gt;Share UI code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focus&lt;/td&gt;
&lt;td&gt;Data, domain, networking&lt;/td&gt;
&lt;td&gt;UI and presentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Sharing&lt;/td&gt;
&lt;td&gt;❌ Not included&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform Access&lt;/td&gt;
&lt;td&gt;Full native access&lt;/td&gt;
&lt;td&gt;Limited in some cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maturity&lt;/td&gt;
&lt;td&gt;Stable&lt;/td&gt;
&lt;td&gt;Android stable, others evolving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal For&lt;/td&gt;
&lt;td&gt;Native apps with shared logic&lt;/td&gt;
&lt;td&gt;Apps with shared UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  KMP + CMP: Better Together
&lt;/h2&gt;

&lt;p&gt;KMP and CMP are &lt;strong&gt;not competitors&lt;/strong&gt;—they are &lt;strong&gt;complementary&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideal Architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KMP&lt;/strong&gt; → Shared business logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CMP&lt;/strong&gt; → Shared UI layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maximum code sharing&lt;/li&gt;
&lt;li&gt;Faster development&lt;/li&gt;
&lt;li&gt;Consistent UI across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐
│   Compose UI (CMP)   │
└──────────────────────┘
            ↓
┌──────────────────────┐
│ Shared Logic (KMP)   │
└──────────────────────┘
            ↓
┌──────────┬──────────┐
│ Android  │   iOS    │
└──────────┴──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  When to Use KMP
&lt;/h2&gt;

&lt;p&gt;Choose &lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt; if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You already have native Android and iOS apps&lt;/li&gt;
&lt;li&gt;You want to share business logic only&lt;/li&gt;
&lt;li&gt;You need full control over native UI&lt;/li&gt;
&lt;li&gt;You want gradual migration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Banking apps&lt;/li&gt;
&lt;li&gt;Enterprise apps&lt;/li&gt;
&lt;li&gt;Apps with complex business rules&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When to Use CMP
&lt;/h2&gt;

&lt;p&gt;Choose &lt;strong&gt;Compose Multiplatform&lt;/strong&gt; if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to build UI once and reuse it&lt;/li&gt;
&lt;li&gt;Your app UI is mostly similar across platforms&lt;/li&gt;
&lt;li&gt;You are starting a new project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal tools&lt;/li&gt;
&lt;li&gt;MVPs and startups&lt;/li&gt;
&lt;li&gt;Desktop-first applications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KMP&lt;/strong&gt; delivers native performance because it compiles directly to platform-specific binaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CMP&lt;/strong&gt; performance is excellent on Android and Desktop, with iOS and Web still improving&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Learning Curve
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;KMP is easier for existing Android developers&lt;/li&gt;
&lt;li&gt;CMP requires understanding Compose and declarative UI principles&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommended Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Share business logic only&lt;/td&gt;
&lt;td&gt;KMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share UI only&lt;/td&gt;
&lt;td&gt;CMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full cross-platform app&lt;/td&gt;
&lt;td&gt;KMP + CMP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt; and &lt;strong&gt;Compose Multiplatform&lt;/strong&gt; are shaping the future of cross-platform development. KMP excels at &lt;strong&gt;logic sharing&lt;/strong&gt;, while CMP shines in &lt;strong&gt;UI sharing&lt;/strong&gt;. Together, they provide a powerful, modern alternative to traditional cross-platform frameworks.&lt;/p&gt;

&lt;p&gt;If you are an Android developer aiming to become a &lt;strong&gt;full-stack mobile engineer&lt;/strong&gt;, learning &lt;strong&gt;KMP first and then CMP&lt;/strong&gt; is a smart, future-proof strategy.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>kotlin</category>
      <category>mobile</category>
    </item>
    <item>
      <title>ChatGPT Prompt Engineering for Developers</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Sat, 13 Dec 2025 17:20:00 +0000</pubDate>
      <link>https://forem.com/saidurtech/chatgpt-prompt-engineering-for-developers-55o7</link>
      <guid>https://forem.com/saidurtech/chatgpt-prompt-engineering-for-developers-55o7</guid>
      <description>&lt;p&gt;Excited to share that I’ve successfully completed the “ChatGPT Prompt Engineering for Developers” course by &lt;strong&gt;DeepLearning.AI&lt;/strong&gt;! 🎉&lt;/p&gt;

&lt;p&gt;This course strengthened my understanding of how to design effective prompts, optimize AI responses, and build reliable AI-powered applications.&lt;/p&gt;

&lt;p&gt;Looking forward to applying these skills in real-world projects! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.deeplearning.ai/accomplishments/9dbb2e19-bc98-4c87-8856-c161e9ef1af6" rel="noopener noreferrer"&gt;https://learn.deeplearning.ai/accomplishments/9dbb2e19-bc98-4c87-8856-c161e9ef1af6&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Swift Is Coming to Android</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Sun, 19 Oct 2025 15:57:08 +0000</pubDate>
      <link>https://forem.com/saidurtech/swift-is-coming-to-android-810</link>
      <guid>https://forem.com/saidurtech/swift-is-coming-to-android-810</guid>
      <description>&lt;p&gt;Exciting News: Swift Is Coming to Android – Officially! 🚨&lt;/p&gt;

&lt;p&gt;📅 June 25, 2025 marked a game-changing moment for mobile development:&lt;br&gt;
 Swift.org has launched a dedicated Swift Android Workgroup — aiming to bring first-class Android support to the Swift programming language! 🧑‍💻💥&lt;/p&gt;

&lt;p&gt;What Does This Mean?&lt;/p&gt;

&lt;p&gt;Apple’s open-source language, Swift, is no longer just for iOS, macOS, and watchOS — it's officially expanding to Android, with real infrastructure and momentum behind it.&lt;br&gt;
This is not an experimental side project — Swift’s Android journey is being actively developed and supported by the community, with strategic goals in mind.&lt;/p&gt;

&lt;p&gt;What’s Included So Far?&lt;/p&gt;

&lt;p&gt;✅ Official Swift SDK for Android&lt;br&gt;
 ✅ Continuous Integration (CI) builds for Linux &amp;amp; Windows targeting Android&lt;br&gt;
 ✅ Native Swift toolchain support for Gradle, JNI interop, and Android Studio compatibility&lt;br&gt;
 ✅ Swift applications running directly on Android devices&lt;br&gt;
 ✅ Early integration with Jetpack Compose via the Skip framework&lt;br&gt;
 ✅ Improved developer tooling for cross-platform workflows&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;For years, cross-platform development meant Flutter, React Native, or Kotlin Multiplatform (KMP) — each with strengths but also tradeoffs.&lt;br&gt;
But now, with Swift joining the Android ecosystem natively, a new class of true cross-platform development is emerging:&lt;br&gt;
Build iOS &amp;amp; Android apps in pure Swift&lt;br&gt;
Share UI and business logic with Skip + Jetpack Compose&lt;br&gt;
Eliminate JavaScript bridges or Dart runtimes&lt;br&gt;
Tap into native performance, UI components, and tooling&lt;/p&gt;

&lt;p&gt;What’s Next?&lt;/p&gt;

&lt;p&gt;📦 Developers can already start experimenting with the Swift Android SDK&lt;br&gt;
 🧪 Try writing pure Swift Android apps&lt;br&gt;
 🛠️ Expect more ecosystem support, tutorials, and tooling improvements in the coming months&lt;br&gt;
 🤝 Ideal for Swift devs entering Android, or Android devs exploring multiplatform&lt;/p&gt;

&lt;p&gt;The Future of Mobile is Native &amp;amp; Multiplatform&lt;/p&gt;

&lt;p&gt;This shift means Swift is no longer confined to Apple platforms. The future is looking truly native across both ecosystems, and we're entering a world where Swift talks to Android seamlessly.&lt;br&gt;
✨ It’s the beginning of a new era — where native iOS and Android development aren’t siloed but connected through Swift.&lt;/p&gt;

</description>
      <category>news</category>
      <category>mobile</category>
      <category>opensource</category>
      <category>android</category>
    </item>
    <item>
      <title>Model Context Protocol (MCP)</title>
      <dc:creator>Saidur Rahman</dc:creator>
      <pubDate>Sun, 19 Oct 2025 03:53:22 +0000</pubDate>
      <link>https://forem.com/saidurtech/model-context-protocol-mcp-3a88</link>
      <guid>https://forem.com/saidurtech/model-context-protocol-mcp-3a88</guid>
      <description>&lt;p&gt;Artificial Intelligence (AI) is currently one of the most discussed topics in the tech world. As a Mobile Developer (Android &amp;amp; iOS), I’ve been exploring how AI can be effectively used in mobile applications.&lt;/p&gt;

&lt;p&gt;Recently, I started working with Model Context Protocol (MCP). With MCP, app data can easily be connected to LLMs like Claude or Cursor and utilized as searchable queries.&lt;/p&gt;

&lt;p&gt;Although SDKs for Kotlin, Java, TypeScript, and Python are available for MCP, resources in Kotlin are quite limited. This makes the learning process a bit challenging but also creates a great opportunity for Kotlin developers.&lt;br&gt;
Currently, I’m working on building an MCP server in Kotlin with JetBrains IDE, which in the future can be directly integrated with LLMs like Claude or Cursor. I hope to share a working demo code soon.&lt;/p&gt;

&lt;p&gt;Here’s a visual of how an MCP server actually works 👇&lt;/p&gt;

&lt;p&gt;🔗 If you are working on or interested in AI + Mobile Development, feel free to connect. By sharing experiences and ideas, we can make this journey even more enriching.&lt;/p&gt;

&lt;p&gt;কৃত্রিম বুদ্ধিমত্তা (AI) বর্তমানে প্রযুক্তি জগতের অন্যতম আলোচিত বিষয়। একজন Developer (Android &amp;amp; iOS) হিসেবে আমি খুঁজে দেখছি কীভাবে মোবাইল অ্যাপ্লিকেশনে AI-কে কার্যকরভাবে ব্যবহার করা যায়।&lt;/p&gt;

&lt;p&gt;সম্প্রতি আমি Model Context Protocol (MCP) নিয়ে কাজ শুরু করেছি। MCP-এর মাধ্যমে অ্যাপের ডেটা সহজেই Claude বা Cursor-এর মতো LLM-এর সাথে সংযুক্ত করে সার্চেবল কুয়েরি আকারে ব্যবহার করা যায়।&lt;/p&gt;

&lt;p&gt;যদিও MCP-এর জন্য Kotlin, Java, TypeScript, Python সহ একাধিক ভাষায় SDK আছে, তবে Kotlin-এ রিসোর্স কিছুটা কম। ফলে শেখার প্রক্রিয়াটি কিছুটা চ্যালেঞ্জিং হলেও এটি Kotlin ডেভেলপারদের জন্য একটি বড় সুযোগ তৈরি করছে।&lt;/p&gt;

&lt;p&gt;বর্তমানে আমি JetBrains IDE এর সাথে Kotlin-এ MCP server তৈরির কাজ করছি, যা Claude বা Cursor এর মতো LLM-এর সাথে সরাসরি ব্যবহার করা যাবে। আশা করছি শিগগিরই একটি কার্যকরী উদাহরণ (demo code) শেয়ার করতে পারব।&lt;br&gt;
নিচে একটি ভিজ্যুয়াল দেওয়া হলো, MCP server আসলে কীভাবে কাজ করে &lt;/p&gt;

&lt;p&gt;&lt;a href="https://lnkd.in/gpDBJPwM" rel="noopener noreferrer"&gt;https://lnkd.in/gpDBJPwM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;যদি আপনি AI + Mobile Development নিয়ে কাজ করেন বা আগ্রহী হন, চাইলে কানেক্ট হতে পারেন। অভিজ্ঞতা ও ধারণা বিনিময়ের মাধ্যমে এই যাত্রাকে আরও সমৃদ্ধ করা সম্ভব।&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>kotlin</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
