<?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: Anatolii Frolov</title>
    <description>The latest articles on Forem by Anatolii Frolov (@af2905g).</description>
    <link>https://forem.com/af2905g</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%2F3068278%2F417d2a2e-ad17-4e37-b527-8beeb08e1ef6.png</url>
      <title>Forem: Anatolii Frolov</title>
      <link>https://forem.com/af2905g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/af2905g"/>
    <language>en</language>
    <item>
      <title>Most Claude Code “thinking keywords” no longer work in the Nov 2025 build</title>
      <dc:creator>Anatolii Frolov</dc:creator>
      <pubDate>Sat, 15 Nov 2025 14:31:28 +0000</pubDate>
      <link>https://forem.com/af2905g/most-claude-code-thinking-keywords-no-longer-work-in-the-nov-2025-build-lki</link>
      <guid>https://forem.com/af2905g/most-claude-code-thinking-keywords-no-longer-work-in-the-nov-2025-build-lki</guid>
      <description>&lt;p&gt;Most Claude Code “thinking keywords” that people still rely on were removed in the November 2025 build. &lt;/p&gt;

&lt;p&gt;I verified this by checking the current bundle and comparing behavior with earlier releases. The old hierarchy no longer exists.&lt;/p&gt;

&lt;p&gt;Below is a brief summary of what changed and why many prompts now return zero additional reasoning.&lt;/p&gt;

&lt;p&gt;The old ladder is gone&lt;br&gt;
Guides from spring 2025 still describe four levels of “thinking intensity.” That structure isn’t in the current build. The lower tiers are deleted, and prompt text no longer controls reasoning depth.&lt;/p&gt;

&lt;p&gt;The new system&lt;br&gt;
Extended reasoning is now controlled by an internal session mechanism rather than keyword stacking. Most phrases developers still append to prompts are ignored.&lt;/p&gt;

&lt;p&gt;Why this matters&lt;br&gt;
If your workflow depends on the old hierarchy, your prompts won’t behave as expected. This explains inconsistent reasoning depth in recent builds.&lt;/p&gt;

&lt;p&gt;Full breakdown with evidence:&lt;br&gt;
&lt;a href="https://medium.com/gitconnected/what-still-works-in-claude-code-nov-2025-ultrathink-tab-and-plan-mode-2ade26f7f45c?sk=a9997a7e950d08916128c56649a890ba" rel="noopener noreferrer"&gt;https://medium.com/gitconnected/what-still-works-in-claude-code-nov-2025-ultrathink-tab-and-plan-mode-2ade26f7f45c?sk=a9997a7e950d08916128c56649a890ba&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>Pulse Indicator in Jetpack Compose — Ready-to-Use @Composable</title>
      <dc:creator>Anatolii Frolov</dc:creator>
      <pubDate>Mon, 29 Sep 2025 15:40:42 +0000</pubDate>
      <link>https://forem.com/af2905g/pulse-indicator-in-jetpack-compose-ready-to-use-composable-3dip</link>
      <guid>https://forem.com/af2905g/pulse-indicator-in-jetpack-compose-ready-to-use-composable-3dip</guid>
      <description>&lt;p&gt;Spinners are fine for generic loading. But for connectivity states like GPS, Bluetooth, or network, they often feel too abstract.  &lt;/p&gt;

&lt;p&gt;I wanted something more contextual than a spinner, so I built this small component.&lt;br&gt;&lt;br&gt;
Here’s a &lt;strong&gt;pulse indicator&lt;/strong&gt; in Jetpack Compose: expanding rings around a central icon.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxra6qjh3oxqjxvgg43sw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxra6qjh3oxqjxvgg43sw.jpeg" alt="Pulse indicator preview" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Composable
&lt;/h2&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;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;PulseIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@DrawableRes&lt;/span&gt; &lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&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;periodMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600L&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;offsetsMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;longArrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1200L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2400L&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;startNs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nanoTime&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;frameTimeNs&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;mutableLongStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startNs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;LaunchedEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;withFrameNanos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;frameTimeNs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&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="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offsetMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Float&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;elapsedMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frameTimeNs&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;startNs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000L&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;offsetMs&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;elapsedMs&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="n"&gt;periodMs&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFloat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;periodMs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFloat&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;contentAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;@Composable&lt;/span&gt;
        &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;Ring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matchParentSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;graphicsLayer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;scaleX&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1f&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.8f&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
                    &lt;span class="n"&gt;scaleY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1f&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.8f&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
                    &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1f&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;border&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;White&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.9f&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;CircleShape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nc"&gt;Ring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offsetsMs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="nc"&gt;Ring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offsetsMs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="nc"&gt;Ring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offsetsMs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

        &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;White&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;CircleShape&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;contentAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;painter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;painterResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;contentDescription&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Animation timing: runs with withFrameNanos inside LaunchedEffect.&lt;/li&gt;
&lt;li&gt;Phase calculation: three rings use different offsets (0, 1200, 2400 ms).&lt;/li&gt;
&lt;li&gt;Rendering: rings expand and fade using graphicsLayer.&lt;/li&gt;
&lt;li&gt;Core icon: central static anchor (e.g., a location pin).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: a smooth pulse effect that communicates connection status more clearly than a generic spinner.&lt;/p&gt;

&lt;p&gt;📖 Originally published on ProAndroidDev (Medium):&lt;br&gt;
&lt;a href="https://proandroiddev.com/pulse-indicator-in-jetpack-compose-ready-to-use-composable-65dee9641235" rel="noopener noreferrer"&gt;Pulse Indicator in Jetpack Compose: Ready-to-Use @Composable&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>android</category>
      <category>design</category>
      <category>androiddev</category>
    </item>
    <item>
      <title>5 Jetpack Compose Tricks That Saved Me Hours in Real Projects</title>
      <dc:creator>Anatolii Frolov</dc:creator>
      <pubDate>Mon, 21 Apr 2025 15:35:14 +0000</pubDate>
      <link>https://forem.com/af2905g/5-jetpack-compose-tricks-that-saved-me-hours-in-real-projects-596i</link>
      <guid>https://forem.com/af2905g/5-jetpack-compose-tricks-that-saved-me-hours-in-real-projects-596i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on Level Up Coding (via Medium, friend link — no paywall)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While working on real-world Android apps, I’ve picked up a handful of small but powerful Jetpack Compose tricks — the kind that save time, reduce bugs, and make your UI smarter without bloating your code.&lt;/p&gt;

&lt;p&gt;These aren’t abstract patterns — just practical things I wish I had used earlier.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://medium.com/gitconnected/5-jetpack-compose-tricks-that-saved-me-hours-in-real-projects-32d43606e5f0?sk=71b73268ef8dc3fd2726c38dd2429063" rel="noopener noreferrer"&gt;Read the full article on Medium (free)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>androiddev</category>
      <category>kotlin</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Creating and Publishing an Android SDK: A Simple Step-by-Step Guide That Actually Works</title>
      <dc:creator>Anatolii Frolov</dc:creator>
      <pubDate>Sun, 20 Apr 2025 13:15:18 +0000</pubDate>
      <link>https://forem.com/af2905g/creating-and-publishing-an-android-sdk-a-simple-step-by-step-guide-that-actually-works-25cp</link>
      <guid>https://forem.com/af2905g/creating-and-publishing-an-android-sdk-a-simple-step-by-step-guide-that-actually-works-25cp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynwxo8za5vkb02w3cl8k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynwxo8za5vkb02w3cl8k.jpg" alt="Wall of woodworking tools neatly arranged – representing SDK tools" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/proandroiddev/creating-and-publishing-an-android-sdk-a-simple-step-by-step-guide-that-actually-works-3cf3a205f1e4" rel="noopener noreferrer"&gt;ProAndroidDev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Creating an Android SDK sounds like something only big teams or companies do — but it doesn’t have to be.&lt;/p&gt;

&lt;p&gt;Many devs (myself included) think of SDK publishing as something overly complex or “too much for a side project.” So I put together a simple, step-by-step guide to demystify the process.&lt;/p&gt;

&lt;p&gt;It walks through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structuring a clean Kotlin library
&lt;/li&gt;
&lt;li&gt;Designing a public API
&lt;/li&gt;
&lt;li&gt;Publishing to GitHub with JitPack (no Maven Central needed)
&lt;/li&gt;
&lt;li&gt;Integrating with Jetpack Compose
&lt;/li&gt;
&lt;li&gt;And writing docs + examples others can actually use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post includes &lt;strong&gt;a working GitHub repo&lt;/strong&gt;, a full example SDK, and even an integration demo app — so you can clone, explore, and build on top of it right away.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://medium.com/proandroiddev/creating-and-publishing-an-android-sdk-a-simple-step-by-step-guide-that-actually-works-3cf3a205f1e4" rel="noopener noreferrer"&gt;Read the full guide on Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>androiddev</category>
      <category>kotlin</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
