<?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: sarim2000</title>
    <description>The latest articles on DEV Community by sarim2000 (@sarim2000).</description>
    <link>https://dev.to/sarim2000</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%2F505053%2Fb5ce4637-e47a-478a-bf84-93ac3d01444d.png</url>
      <title>DEV Community: sarim2000</title>
      <link>https://dev.to/sarim2000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarim2000"/>
    <language>en</language>
    <item>
      <title>The journey of building a privacy-first Android app to 80+ stars and 100+ testers</title>
      <dc:creator>sarim2000</dc:creator>
      <pubDate>Thu, 14 Aug 2025 09:03:05 +0000</pubDate>
      <link>https://dev.to/sarim2000/the-journey-of-building-a-privacy-first-android-app-to-80-stars-and-100-testers-31af</link>
      <guid>https://dev.to/sarim2000/the-journey-of-building-a-privacy-first-android-app-to-80-stars-and-100-testers-31af</guid>
      <description>&lt;p&gt;Hey DEV community,&lt;/p&gt;

&lt;p&gt;I'm excited to share that my open-source Android project, &lt;strong&gt;&lt;a href="https://github.com/sarim2000/pennywiseai-tracker" rel="noopener noreferrer"&gt;PennyWise&lt;/a&gt;&lt;/strong&gt;, recently crossed &lt;strong&gt;80+ stars on GitHub&lt;/strong&gt; and has over &lt;strong&gt;100 active beta testers&lt;/strong&gt;. As a solo developer on a side project, this has been an incredible journey, and I wanted to share a bit about the "why" and the "how."&lt;/p&gt;

&lt;p&gt;PennyWise is a privacy-first expense tracker that automatically logs transactions by reading bank SMS. The key feature? &lt;strong&gt;Everything, including an AI assistant, runs 100% on the device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No cloud servers, no data collection, no API fees.&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%2Fn1qet1w5a88d9t3s4c7f.png" 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%2Fn1qet1w5a88d9t3s4c7f.png" alt="PennyWise App Screenshots" width="702" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Stack &amp;amp; Key Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;100% Kotlin &amp;amp; Jetpack Compose:&lt;/strong&gt; Built with a modern Android stack for a reactive UI.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;On-Device AI with MediaPipe:&lt;/strong&gt; I wanted to avoid cloud LLMs entirely. I used Google's MediaPipe with a Gemma 2B model to build an AI assistant that can answer questions about a user's spending &lt;em&gt;without their data ever leaving their phone&lt;/em&gt;. This was a huge challenge but core to the privacy promise.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Room Database:&lt;/strong&gt; For local, structured storage of all financial data.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Regex-based SMS Parsing:&lt;/strong&gt; A robust system to handle dozens of different bank SMS formats in India.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building something with a strong privacy-first stance seems to have resonated with users. The on-device AI is not just a gimmick; it's a statement against the trend of sending every little piece of data to the cloud.&lt;/p&gt;

&lt;p&gt;If you're interested in modern Android development, on-device ML, or just want to see a project that's gaining some real-world traction, I'd love for you to check it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/sarim2000/pennywiseai-tracker" rel="noopener noreferrer"&gt;https://github.com/sarim2000/pennywiseai-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to dive into any technical questions or discuss the challenges of on-device AI in the comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>opensource</category>
      <category>fintech</category>
    </item>
    <item>
      <title>How I Built a Privacy-First Expense Tracker with 100% On-Device AI</title>
      <dc:creator>sarim2000</dc:creator>
      <pubDate>Mon, 11 Aug 2025 08:47:55 +0000</pubDate>
      <link>https://dev.to/sarim2000/how-i-built-a-privacy-first-expense-tracker-with-100-on-device-ai-1bf</link>
      <guid>https://dev.to/sarim2000/how-i-built-a-privacy-first-expense-tracker-with-100-on-device-ai-1bf</guid>
      <description>&lt;p&gt;Hello everyone,&lt;/p&gt;

&lt;p&gt;I'm excited to share a project I've been passionately building: &lt;strong&gt;PennyWise AI&lt;/strong&gt;, a free, open-source, and privacy-first expense tracker for Android.&lt;/p&gt;

&lt;p&gt;The guiding mission was to build a powerful financial tool on one non-negotiable rule: &lt;strong&gt;the user's financial data must never leave their device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can check out the project on GitHub: &lt;a href="https://github.com/sarim2000/pennywiseai-tracker" rel="noopener noreferrer"&gt;https://github.com/sarim2000/pennywiseai-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This "privacy-by-design" principle led me down a fascinating technical path, forcing me to solve two major problems without relying on a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;UI:&lt;/strong&gt; 100% &lt;a href="https://developer.android.com/jetpack/compose" rel="noopener noreferrer"&gt;Jetpack Compose&lt;/a&gt; with Material Design 3.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Architecture:&lt;/strong&gt; MVVM, Clean Architecture principles.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Async:&lt;/strong&gt; Kotlin Coroutines and Flows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;DI:&lt;/strong&gt; Hilt.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Database:&lt;/strong&gt; Room for on-device storage.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The "Magic":&lt;/strong&gt; Google's MediaPipe for on-device LLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenge 1: Building a Scalable, Offline SMS Parsing Engine
&lt;/h3&gt;

&lt;p&gt;One of the key features is automatically logging transactions from bank SMS alerts. This is a common feature, but most apps do the parsing on their servers. To do it offline, I built a flexible parsing engine.&lt;/p&gt;

&lt;p&gt;I used a factory pattern. A &lt;code&gt;SmsReaderWorker&lt;/code&gt; (running via WorkManager) grabs new messages and passes them to a &lt;code&gt;BankParserFactory&lt;/code&gt;. This factory maps a sender ID to a specific parser class.&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="c1"&gt;// In SmsReaderWorker.kt&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Factory returns the correct parser for the SMS sender&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;parser&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BankParserFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parser&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="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;parsedTransaction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// ... save to the local Room DB&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 architecture makes the app incredibly extensible. To prove it out, the initial launch supports over 15 banks in the complex Indian market, but the framework is ready to scale globally. New parsers for banks in any country can be added easily without touching the core logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: On-Device AI without Compromise
&lt;/h3&gt;

&lt;p&gt;The app's standout feature is a chat interface where you can ask natural language questions like, "What did I spend on food last month?"&lt;/p&gt;

&lt;p&gt;Sending financial data to a cloud LLM API (like OpenAI or Gemini) was a privacy non-starter. The solution was &lt;strong&gt;Google's MediaPipe LlmInference Task&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm using a Gemma 2B model that is downloaded and runs entirely on the user's device. All inference happens locally.&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="c1"&gt;// A look at the LlmInference service&lt;/span&gt;
&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelPath&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="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmInference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LlmInferenceOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setModelPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;llmInference&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmInference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createFromOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&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;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&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 was a true game-changer. It allows PennyWise to offer a genuinely smart, next-gen feature while making the powerful promise that &lt;strong&gt;your financial data physically never leaves your phone.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Open Source?
&lt;/h3&gt;

&lt;p&gt;For an app that handles sensitive data, transparency is the ultimate currency. I want users and developers to be able to look under the hood, verify the privacy claims, and contribute to making the app better.&lt;/p&gt;

&lt;p&gt;If you're an Android developer who believes in building privacy-first tools, I'd love for you to check out the repository.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star us on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sarim2000/pennywiseai-tracker" rel="noopener noreferrer"&gt;https://github.com/sarim2000/pennywiseai-tracker&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Currying in JS 🤯</title>
      <dc:creator>sarim2000</dc:creator>
      <pubDate>Tue, 02 Jan 2024 15:58:57 +0000</pubDate>
      <link>https://dev.to/sarim2000/currying-in-js-34a4</link>
      <guid>https://dev.to/sarim2000/currying-in-js-34a4</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/sarim2000/LogicLoreLibrary/blob/main/javascript/curry.js"&gt;Using Currying we can modify a function from f(a,b) to f(a)(b)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If above sounds interesting do give my explanation in above link a chance; and learn Currying!&lt;/p&gt;

&lt;p&gt;:)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My first post and how I am starting to develop in public :)</title>
      <dc:creator>sarim2000</dc:creator>
      <pubDate>Tue, 26 Dec 2023 20:57:09 +0000</pubDate>
      <link>https://dev.to/sarim2000/my-first-post-and-how-i-am-starting-to-develop-in-public--2mho</link>
      <guid>https://dev.to/sarim2000/my-first-post-and-how-i-am-starting-to-develop-in-public--2mho</guid>
      <description>&lt;h2&gt;
  
  
  &lt;a href="https://github.com/sarim2000/taskmaster"&gt;Taskmaster - CLi&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I am working on this project to create cli based task management and am planning to integrate AI and other essential tools. Do you guys can give more suggestion on how I can improve it?&lt;/p&gt;

&lt;p&gt;I am looking to build something useful in my free time, also wanna contribute something to this community through my limited knowledge and skillset, appreciate every help incoming&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>cli</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
