<?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>DEV Community: Zykrave</title>
    <description>The latest articles on DEV Community by Zykrave (@zykrave).</description>
    <link>https://dev.to/zykrave</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4140464%2F8795ccd7-6b8a-4869-b498-ae0f853c6c2a.jpg</url>
      <title>DEV Community: Zykrave</title>
      <link>https://dev.to/zykrave</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zykrave"/>
    <language>en</language>
    <item>
      <title>I built a 47-tool offline Android app with Kotlin and Jetpack Compose</title>
      <dc:creator>Zykrave</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:58:49 +0000</pubDate>
      <link>https://dev.to/zykrave/i-built-a-47-tool-offline-android-app-with-kotlin-and-jetpack-compose-4pap</link>
      <guid>https://dev.to/zykrave/i-built-a-47-tool-offline-android-app-with-kotlin-and-jetpack-compose-4pap</guid>
      <description>&lt;h2&gt;
  
  
  What is ToolixHub?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ToolixHub&lt;/strong&gt; is an &lt;em&gt;everyday utility Swiss Knife&lt;/em&gt; for Android&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;47 tools&lt;/strong&gt; in one app, across &lt;strong&gt;9 categories&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% offline&lt;/strong&gt;: no accounts, no ads, no network calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source&lt;/strong&gt;: &lt;a href="https://github.com/Zykrave/ToolixHub" rel="noopener noreferrer"&gt;github.com/Zykrave/ToolixHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[SCREENSHOT 1: &lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fen513mvm9cxik8ptwlrm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fen513mvm9cxik8ptwlrm.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;]&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calculators&lt;/strong&gt;: standard calculator with history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt;: word &amp;amp; character counter, find &amp;amp; replace, duplicate remover&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt;: resizer, Base64 converter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random&lt;/strong&gt;: name generator, decision maker, number generator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance&lt;/strong&gt;: loan EMI calculator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color&lt;/strong&gt;, &lt;strong&gt;Measurement&lt;/strong&gt;, &lt;strong&gt;Timers&lt;/strong&gt; (stopwatch with laps) and &lt;strong&gt;QR &amp;amp; Utility&lt;/strong&gt; (QR generator, hash &amp;amp; checksum generator, system info dashboard)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Favorites&lt;/strong&gt; and a &lt;strong&gt;Recently Used&lt;/strong&gt; row for quick access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[SCREENSHOT 2: &lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmiahb9adk5l4t3jgtukh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmiahb9adk5l4t3jgtukh.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;]&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I used AI only to get the &lt;strong&gt;base and the concept&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Everything after that, I built myself with help of ai in &lt;strong&gt;Android Studio&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Renamed and rebranded the app&lt;/li&gt;
&lt;li&gt;Designed a custom adaptive icon and splash screen&lt;/li&gt;
&lt;li&gt;Built a shared design system: category accent colors, reusable components, consistent cards&lt;/li&gt;
&lt;li&gt;Cleaned up the repo (&lt;code&gt;.gitignore&lt;/code&gt;, structure, signing config)&lt;/li&gt;
&lt;li&gt;Tested every change on a real device&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[SCREENSHOT 3: &lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn42j0w9veojoritpronv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn42j0w9veojoritpronv.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;]&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kotlin&lt;/strong&gt; + &lt;strong&gt;Jetpack Compose&lt;/strong&gt; + &lt;strong&gt;Material 3&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigation Compose&lt;/strong&gt; for screens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DataStore&lt;/strong&gt; for local preferences (favorites, recents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZXing&lt;/strong&gt; for QR and barcode handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coroutines&lt;/strong&gt; for async work&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minSdk 24&lt;/code&gt;, &lt;code&gt;targetSdk 36&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rules I set for myself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No network dependencies, ever.&lt;/strong&gt; It must work in airplane mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No local database.&lt;/strong&gt; DataStore is enough for this app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;Modifier.blur()&lt;/code&gt; or &lt;code&gt;RenderEffect&lt;/code&gt;.&lt;/strong&gt; They need API 31+, and I support API 24.

&lt;ul&gt;
&lt;li&gt;For depth, I used gradients and layered shadows instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One small change at a time&lt;/strong&gt;, tested on a real device before moving on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI gets you a base fast, but polish is still on you.&lt;/strong&gt; The design system, consistency and constraints came from me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A starting base is not a finished product.&lt;/strong&gt; The design system, consistency and constraints all came from hands-on work in Android Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Modifier.shadow()&lt;/code&gt; on a &lt;code&gt;Card&lt;/code&gt; can get clipped&lt;/strong&gt; by the card's own shape. Wrapping the Card in a Box that carries the shadow fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test shared components on several screens.&lt;/strong&gt; A change to one card affects 90+ call sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When something doesn't render, try an extreme test value first.&lt;/strong&gt; It tells you whether the effect is "too subtle" or "not working at all."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;scientific mode&lt;/strong&gt; for the calculator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save/download&lt;/strong&gt; options for tools that generate content&lt;/li&gt;
&lt;li&gt;Smoother screen transitions&lt;/li&gt;
&lt;li&gt;A more distinctive UI redesign&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download the APK:&lt;/strong&gt; [&lt;a href="https://github.com/Zykrave/ToolixHub/releases/tag/v1.2.0" rel="noopener noreferrer"&gt;https://github.com/Zykrave/ToolixHub/releases/tag/v1.2.0&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/Zykrave/ToolixHub" rel="noopener noreferrer"&gt;github.com/Zykrave/ToolixHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Feedback and issues are welcome. If you'd like a tool added, drop it in the comments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://github.com/Zykrave" rel="noopener noreferrer"&gt;Zykrave&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
