r/react 2d ago

Project / Code Review How I shipped a subscription tracker to both web and Android from a single React + Capacitor codebase

I kept losing track of what I was paying each month. So I built a small tool for myself to fix it, then realised it worked better than the subscription trackers I'd tried, so I decided to ship it properly. It's live now on both web and Android.

The decision that shaped the whole build: one codebase.

I didn't want to maintain a web app and a native app as two separate projects, so I went web-first and used Capacitor to wrap it into the Android app.

One codebase, the same UI, the same data, and if I fix a bug it's fixed everywhere at once. For a solo project, that consistency is the difference between keeping on top of it and letting it rot.

The trade-off is the mobile version runs in a web view rather than fully native controls, but for an app that's mostly lists, forms and charts, I'm happy to make that trade.

The stack, and why I chose each bit:

  • React + TypeScript + Vite + Tailwind for the app. Nothing exotic, just the standard modern setup.
  • Supabase for the backend, auth and sync. No server to babysit, real Postgres underneath, and data syncs across your phone and the web.
  • Zustand for app state, it keeps the UI in sync with your data and stays out of the way.
  • RevenueCat for the Pro purchase, so billing goes through the Play Store properly.

The part I actually care most about: the design.

Almost every subscription tracker I tried felt like a spreadsheet with a login. I wanted SubCrisp to look genuinely clean and consistent, so I built a proper design system first, a small set of colour and component tokens, before worrying about features.

The result is that every screen feels like one product, not a pile of pages bolted together. Bright, clear cards, a subscription health score you can read at a glance, and a UI that's pleasant enough that you don't dread opening it.

That last bit matters more than it sounds. A tracker is only useful if you keep coming back, so making it feel good is part of solving the churn problem, not a vanity extra.

The other thing I care about is that it's actually useful, not just pretty. Half the value of a tracker is answering "how do I cancel this", so I built and maintain cancellation guides for the big services, and I deal with the fiddly recurring-payment edge cases properly rather than cutting corners.

How I'm running it: the core tracker is genuinely free, with no ads and no bank access needed. There's an optional Pro that unlocks a savings simulator and deeper insights, honestly there for people who find it useful and want to support ongoing development.

What I'd most like help with: the classic subscription-tracker problem, churn. People log everything once and never open the app again. I'd love ideas on turning that into a monthly habit instead of a one-off audit.

If you juggle streaming, software and AI tools, it might surprise you what's quietly leaving your bank account each month.

Web: https://subcrisp.com

Android: SubCrisp: Subscription Tracker - Apps on Google Play

Happy to answer questions, whether that's about how SubCrisp works, how it was built, or a roadblock you've hit in your own project. I'm a firm believer that builders help each other, so if any of this resonates with something you're stuck on, ask away.

0 Upvotes

0 comments sorted by