Skip to content

gonfff/subctrl

Repository files navigation

Subctrl

Flutter Tests Platform iOS Dart >=3.10 License: MIT

Dead-simple subscription tracker for iOS, built with Flutter/Cupertino widgets. Subctrl keeps tabs on recurring costs, converts currencies automatically, and sends optional local reminders before renewals hit.

Features

  • Track subscriptions with local storage backed by Drift (subctrl.db).
  • Automatic currency conversion via Yahoo Finance rates with historical seeds to keep analytics stable offline.
  • Analytics tabs for monthly burn, category totals, and long-term spend trends.
  • Local, timezone-aware notifications driven by LocalNotificationsService.
  • Clean Architecture split into presentation, application, domain, and infrastructure layers.
  • Enforced code coverage (70%+) through the GitHub Actions workflow.

Screenshots

Subscriptions list Monthly analytics Analytics overview

Architecture at a Glance

lib/
├─ presentation/   # UI, view models, localization
├─ application/    # Use cases and dependency wiring
├─ domain/         # Pure business logic + repository interfaces
└─ infrastructure/ # Drift database, currency clients, platform services
  • lib/main.dart boots the tabbed UI and wires dependencies.
  • lib/application/app_dependencies.dart registers repositories, use cases, and disposes the YahooFinanceCurrencyClient.
  • Data lives in lib/infrastructure/persistence/database.dart (schema version 1 stored as subctrl.db in the app documents directory).

Getting Started

  1. Prereqs: Flutter 3.38.5 (matches CI), Dart SDK ^3.10.3, Xcode for iOS simulator/device builds.
  2. Install deps:
    flutter pub get
  3. Run the app:
    flutter run
  4. Configure notifications (optional): ensure the iOS simulator/device has notification permissions enabled so local reminders can fire.

GitHub Pages Policies

Static policy/support pages for App Store review live in docs/. The folder now contains a minimal Jekyll setup (_config.yml, _layouts, and assets) so Markdown pages gain HTML wrappers when GitHub Pages builds the gh-pages branch. The Publish Docs workflow pushes the folder to gh-pages only when a commit touching docs/ lands on master, so publishing simply means editing Markdown with the required front matter (layout, title, permalink) and pushing your change. Preview the pages locally with any static server (they render as plain Markdown locally) or let GitHub Pages handle the Jekyll build.

Testing

All unit and widget tests run through flutter test --coverage, and coverage must stay above 70%. Run locally with:

flutter test --coverage

License

MIT © Denis Dementev

About

Dead simple subscription tracker app

Topics

Resources

License

Stars

Watchers

Forks

Languages