Inspiration

In Indonesia, forgetting a subscription is annoying — but forgetting your vehicle tax (pajak), property tax (PBB), or a loan installment (KPR) costs real money. Miss the deadline and you pay a denda — a late-payment penalty. Every subscription tracker on the App Store handles Netflix and Spotify, but none of them track the bills that actually carry penalties here. I built Duitjaga to guard against exactly that: the money you lose by forgetting.

What it does

Duitjaga tracks your subscriptions and your financial obligations in one place, shown as two separate monthly totals so they're never mixed up:

  • Subscriptions — Netflix, Spotify, local services like Vidio, and more, from a pre-filled catalog.
  • Obligations — vehicle tax, property tax (PBB), and loans (KPR) — the bills Western apps ignore.
  • Reminders before the deadline — days before a subscription renews, weeks before a tax is due, so you never eat a denda.
  • Home-screen widget and spending insights by category.
  • 100% private — no account, no login, no bank linking. All data stays on your device.

How I built it

  • SwiftUI + SwiftData (local-only), targeting iOS 17, in a clean MVVM structure.
  • RevenueCat powers monetization: Duitjaga Pro is a one-time lifetime unlock (pro_lifetime, a non-consumable) — no subscription, because it would be ironic to charge monthly to fight monthly fees. A single entitlement store subscribes to RevenueCat's customerInfoStream, so Pro state updates everywhere automatically.
  • Local notifications (UNCalendarNotificationTrigger) for due-date reminders, scheduled around iOS's 64-notification limit.
  • WidgetKit for the home-screen widget, sharing state through an App Group.
  • A bundled local catalog of popular Indonesian services and obligation templates, so users add items in seconds.
  • Fully localized in Bahasa Indonesia and English, with IDR formatting.

Challenges I ran into

  • Holding two very different money concepts on one screen — recurring subscriptions and one-off, penalty-bearing obligations — without confusing users. The answer was two separate totals and a clear due-soon system.
  • RevenueCat + offer codes for judges — wiring a one-time non-consumable, then adding in-app offer-code redemption so judges can unlock Pro, since Apple retired the old promo codes.
  • iOS notification limits — scheduling only the next occurrence per item to stay under the 64-notification cap.
  • Shipping a polished v1.0 through App Review under a hackathon deadline.

Accomplishments that I'm proud of

  • A genuinely local product that solves a problem no Western app addresses — the denda.
  • A fast, clean dual-total home screen that makes "subscriptions vs. bills" obvious at a glance.
  • Real production purchases flowing through RevenueCat, with a frictionless offer-code unlock path.
  • Private by design — no account, no bank linking.

What I learned

  • How to model two different recurrence types cleanly around SwiftData.
  • The full RevenueCat lifecycle — entitlements, offerings, offer codes, and observing customerInfoStream instead of scattering one-shot checks.
  • That a sharp, local wedge beats a generic feature list — Duitjaga is memorable because it's unapologetically Indonesia-first.

What's next for Duitjaga

  • iCloud sync across devices and CSV export — your data is yours, take it anywhere (already scaffolded as Pro features).
  • A live FX refresh and more obligation templates.
  • Growing the catalog based on user feedback.

Built With

  • app-store-connect
  • bahasa-indonesia
  • ios
  • mvvm
  • revenuecat
  • storekit
  • swift
  • swiftdata
  • swiftui
  • usernotifications
  • widgetkit
  • xcode
Share this project:

Updates

Submission history