A small, single-user native app for macOS (iOS to follow) that tracks your subscriptions — renewal cycles, the last possible date to cancel, and costs — and reminds you before money goes out the door. Built with SwiftUI + SwiftData + Swift Charts.
Status: early WIP. Phase 1 (macOS) is the current focus. iCloud sync and a native iPhone app come in Phase 2. See the roadmap below.
Lots of AI and personal subscriptions, no single place tracking them. SubTracker answers: what am I paying, when does each renew, and when's the last day I can cancel before being charged again? — with local notifications so deadlines don't slip.
- Add subscriptions with cost (EUR), renewal cycle (weekly / monthly / quarterly / yearly / custom) and an optional last-cancel-by date.
- Local notifications 7 days and 1 day before each renewal and each cancel deadline (editable per subscription).
- A dashboard: monthly & yearly totals, spend-by-category breakdown, and an upcoming-deadlines timeline.
- Data persists via SwiftData; syncs across your devices via private iCloud (Phase 2).
The visual spec lives in design/ — open
design/index.html for an interactive native-macOS mockup
(sidebar nav, light/dark, Add/Edit sheet), and see
design/DESIGN.md for the design tokens and the
mockup → SwiftUI mapping.
Requires Xcode 16+ and XcodeGen.
# One-time: point the command line at full Xcode (needed by SwiftLint + xcodebuild)
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
brew install xcodegen swiftlint swiftformat pre-commit
pre-commit install # enable the git hooks
xcodegen generate # regenerate SubTracker.xcodeproj from project.yml
open SubTracker.xcodeproj # then ⌘R, or:
xcodebuild -scheme SubTracker -destination 'platform=macOS' buildRun the tests (UI tests need ad-hoc signing):
xcodebuild test -scheme SubTracker -destination 'platform=macOS' \
-enableCodeCoverage YES CODE_SIGN_IDENTITY="-" CODE_SIGNING_REQUIRED=NOThe .xcodeproj is generated (not committed); project.yml is the source of
truth. After cloning, run xcodegen generate first. Enable the git hooks with
pre-commit install.
- SwiftFormat + SwiftLint (configs in repo), enforced via pre-commit.
- Unit tests (Swift Testing) + UI/E2E tests (XCUITest); CI runs lint, format check, tests, and an 80% coverage gate on every push (GitHub Actions).
- Phase 1 — macOS (current): core app, persistence, notifications, dashboard, full test + CI setup.
- Phase 2 — iOS + iCloud sync: iPhone app, CloudKit private-DB sync, on-device notifications, TestFlight.
- Phase 3 — community polish:
CONTRIBUTING.md,CODE_OF_CONDUCT.md, issue/PR templates, README badges, tagged releases.
MIT © 2026 David Moch