<?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: Özkan Altınörs</title>
    <description>The latest articles on DEV Community by Özkan Altınörs (@gepettousta).</description>
    <link>https://dev.to/gepettousta</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%2F4197765%2Ff960305e-8967-4202-a107-49a8947bfe51.jpg</url>
      <title>DEV Community: Özkan Altınörs</title>
      <link>https://dev.to/gepettousta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gepettousta"/>
    <language>en</language>
    <item>
      <title>How I Built a 100% Local-First Android Subscription &amp; Bill Tracker with 6 Custom UI Themes, On-Device ML Kit OCR, and Live Central Bank FX Rates</title>
      <dc:creator>Özkan Altınörs</dc:creator>
      <pubDate>Wed, 21 Oct 2026 08:15:59 +0000</pubDate>
      <link>https://dev.to/gepettousta/how-i-built-a-100-local-first-android-subscription-bill-tracker-with-6-custom-ui-themes-2582</link>
      <guid>https://dev.to/gepettousta/how-i-built-a-100-local-first-android-subscription-bill-tracker-with-6-custom-ui-themes-2582</guid>
      <description>&lt;p&gt;Most subscription and bill trackers today have two major problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They require you to connect your bank credentials via third-party aggregators like Plaid and sync your entire transaction history to a cloud server.&lt;/li&gt;
&lt;li&gt;Ironically, they charge a $5–$10/month recurring subscription just to remind you to cancel your other subscriptions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As an indie Android developer, I wanted a fast, zero-cloud, privacy-first alternative. So I built &lt;strong&gt;Subscription Radar&lt;/strong&gt; (&lt;code&gt;com.abonelikradari.app&lt;/code&gt;) — and just shipped &lt;strong&gt;v9.0.22&lt;/strong&gt; on Google Play.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.abonelikradari.app" rel="noopener noreferrer"&gt;Download Subscription Radar on Google Play&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is a deep dive into the engineering decisions behind building a zero-backend financial utility app in Kotlin.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Zero-Backend Architecture &amp;amp; Encrypted Local Persistence
&lt;/h2&gt;

&lt;p&gt;Instead of spinning up a cloud database and user authentication flow, Subscription Radar stores 100% of user data locally on the device:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted Room Database &amp;amp; Payload Cipher:&lt;/strong&gt; All recurring subscriptions, variable utility bills, and payment history records stay inside an on-device Room/SQLite database with &lt;code&gt;RoomPayloadCipher&lt;/code&gt; and &lt;code&gt;SecurePreferences&lt;/code&gt; backed by Android Keystore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable AES-GCM Backups:&lt;/strong&gt; Users can export and import password-protected encrypted JSON backups (&lt;code&gt;BackupCrypto&lt;/code&gt;) or plain CSV exports whenever they switch phones—no account required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Household Profiles:&lt;/strong&gt; Users can segment expenses across multiple profiles (e.g., &lt;em&gt;Personal&lt;/em&gt;, &lt;em&gt;Home&lt;/em&gt;, &lt;em&gt;Family&lt;/em&gt;, &lt;em&gt;Work&lt;/em&gt;) with isolated monthly budgets and analytics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. On-Device ML Kit OCR for Variable Utility Bills
&lt;/h2&gt;

&lt;p&gt;Subscriptions like Netflix or Spotify have predictable fixed prices, but utility bills (electricity, water, gas, mobile, fiber internet) change every month.&lt;/p&gt;

&lt;p&gt;To make logging variable bills effortless without uploading sensitive invoices to a cloud vision API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We integrated &lt;strong&gt;Google ML Kit Text Recognition (&lt;code&gt;play-services-mlkit-text-recognition&lt;/code&gt;)&lt;/strong&gt; directly on-device.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BillImageTextAnalyzer&lt;/code&gt; parses receipt and invoice photos offline, extracting the &lt;strong&gt;total amount&lt;/strong&gt;, &lt;strong&gt;currency&lt;/strong&gt;, and &lt;strong&gt;due date&lt;/strong&gt; using localized regex and date heuristics across 7 languages.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Multi-Currency Aggregation with Official Central Bank FX Rates
&lt;/h2&gt;

&lt;p&gt;Digital nomads, expats, and developers often pay for SaaS tools in &lt;code&gt;USD&lt;/code&gt; or &lt;code&gt;EUR&lt;/code&gt; while paying local utility bills in &lt;code&gt;TRY&lt;/code&gt;, &lt;code&gt;INR&lt;/code&gt;, &lt;code&gt;GBP&lt;/code&gt;, or &lt;code&gt;RUB&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription Radar fetches daily official exchange rates directly from public central bank XML/JSON feeds (&lt;strong&gt;ECB&lt;/strong&gt; and &lt;strong&gt;TCMB&lt;/strong&gt;) with zero intermediary backend cost.&lt;/li&gt;
&lt;li&gt;It computes cross-rates across &lt;strong&gt;TRY, USD, EUR, GBP, RUB, CNY, and INR&lt;/strong&gt;, allowing the home screen, widget, and &lt;strong&gt;Radar Analytics&lt;/strong&gt; to display unified monthly and annual totals in the user's primary currency.&lt;/li&gt;
&lt;li&gt;We also bundled &lt;strong&gt;14 regional service catalogs&lt;/strong&gt; with localized plan pricing so users can add popular services in one tap via the &lt;strong&gt;Quick Starter Wizard&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. 6 Switchable UI Appearances &amp;amp; WCAG Contrast Engine
&lt;/h2&gt;

&lt;p&gt;Not everyone wants their finance app to look like a dark cyberpunk terminal or a sterile spreadsheet. In v9.0.22, we engineered a runtime layout and surface theming system (&lt;code&gt;UiLabAppearance&lt;/code&gt;) featuring &lt;strong&gt;6 complete visual identities&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Original:&lt;/strong&gt; Modern dark/light radar aesthetic with animated sweep and 120Hz display support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple (Sade):&lt;/strong&gt; High-clarity minimalist cards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium Finance:&lt;/strong&gt; Executive dashboard with a custom &lt;code&gt;PremiumPaymentRing&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block (Blok):&lt;/strong&gt; Bold Neo-Brutalist / geometric cards with vivid color blocking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leather Wallet (Cüzdan):&lt;/strong&gt; Warm cream paper textures, serif typography, realistic receipt edges (&lt;code&gt;CuzdanReceiptDrawable&lt;/code&gt;), and a dynamic paid stamp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orbit (Yörünge):&lt;/strong&gt; Ice-blue surfaces with orange accents and custom orbital canvas visualizations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To ensure every theme remains readable across Light/Dark modes and 8 color palettes (96 total combinations), we built an automated &lt;strong&gt;WCAG 4.5:1 contrast verification engine (&lt;code&gt;LabTextContrast&lt;/code&gt;)&lt;/strong&gt; tested across 620+ unit and instrumentation tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Out &amp;amp; Let Me Know Your Thoughts!
&lt;/h2&gt;

&lt;p&gt;If you use an Android device and want a clean, private way to track your recurring subscriptions, free trials, and monthly bills:&lt;/p&gt;

&lt;p&gt;📲 &lt;strong&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.abonelikradari.app" rel="noopener noreferrer"&gt;Get Subscription Radar on Google Play&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback in the comments—especially on which of the 6 UI themes you prefer or any features you'd like to see next!&lt;/p&gt;

</description>
      <category>androidkotlin</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
