A minimalist subscription tracker. Know exactly what you pay — every month.
CheckUrSubs helps you keep track of all your subscriptions — streaming, cloud storage, SaaS tools, mobile plans. See your total spend, upcoming charges, and a breakdown by category, all in one place.
It works as a PWA and installs to your home screen on iPhone and Android, no App Store required.
- Dashboard — total spend per month, per year, and the full subscription list
- Calendar — see exactly when and how much will be charged, day by day
- Upcoming — charges due in the next 7 days
- Analytics — spending by category and by service, with a monthly trend chart
- Multi-currency — RUB, USD, EUR, GBP and more, with live exchange rates
- Russian / English — full localization, auto-detected from the browser on first visit
- 11 categories — Entertainment, Work, Internet, Games, Education, VPN, Health, Banking, Telecom, AI, Other
- Autocomplete — recognizes 60+ popular services and fills in the logo and category automatically
- Monthly and yearly billing, with correct totals for each
- Swipe gestures — swipe left to delete, right to edit
- Undo delete — a 5-second window to change your mind
- Import and export — CSV and JSON, with duplicate detection on import
- Active — included in totals, shown in the calendar
- Paused — excluded from totals, hidden from the calendar
- Trial — shown in the calendar until the trial ends, excluded from totals, and switches to active automatically once it does
- Dark UI with a clean, native feel
- Auth via email/password or Google OAuth
- PWA — offline cache, home screen icon, no browser chrome
- Push notifications — a reminder 3 days before a billing date or trial end
- Onboarding — a short walkthrough that includes PWA install instructions
- Empty states — considered screens for when there's nothing to show yet
| Layer | Technology |
|---|---|
| UI | React 19, Tailwind CSS 4, Framer Motion |
| Build | Vite 7 |
| Testing | Vitest |
| CI | GitHub Actions (lint, test, build on every push and PR) |
| Backend | Supabase (Postgres, Auth, RLS, Edge Functions) |
| Push | Web Push API, VAPID, Supabase Edge Functions, pg_cron |
| Monitoring | Sentry (errors and session replays) |
| Analytics | PostHog (events, funnels, retention) |
| Deploy | Vercel |
| Icons | Lucide React |
# Clone
git clone https://github.com/casablanque-code/CheckUrSubs.git
cd CheckUrSubs
# Install dependencies
npm install
# Create env file
cp .env.example .env
# Fill in VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY
# Start the dev server
npm run devnpm run test # run the test suite once
npm run test:watch
npm run lint
npm run buildThese same four steps run in CI on every push and pull request.
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_keyGet these from the Supabase dashboard under Settings → API.
The main migration lives in supabase_migration.sql, push subscriptions in
push_migration.sql. Run both in the Supabase SQL Editor.
subscriptions table schema:
id uuid primary key
user_id uuid references auth.users
name text
price numeric
currency_code text
date text -- billing day, format "8 Mar"
period text -- 'monthly' | 'yearly'
category text
logo text
status text -- 'active' | 'paused' | 'trial'
trial_end date -- trial end date
created_at timestamptzpush_subscriptions table schema:
id uuid primary key
user_id uuid references auth.users
subscription text -- JSON Web Push subscription object
updated_at timestamptzRow Level Security is enabled — each user can only see their own data.
Implemented via the Web Push API and VAPID.
Deploy the edge function:
supabase functions deploy send-push-notifications --project-ref YOUR_REFSet secrets in Supabase:
VAPID_PUBLIC_KEY=...
VAPID_PRIVATE_KEY=...
Schedule — pg_cron triggers the function daily at 10:00 UTC (push_cron.sql).
A notification is sent 3 days before:
- a subscription's billing date
- a trial period's end date
# Preview
vercel
# Production
vercel --prodAdd the environment variables in the Vercel dashboard under Settings → Environment Variables.
iPhone: open in Safari, tap Share, then "Add to Home Screen".
Android: open in Chrome, open the menu, then "Install app".
Push notifications on iOS require the PWA to be installed (iOS 16.4+).
The app uses a custom service worker (sw.js):
- checks for updates on every app launch, not just every 24 hours
- activates new versions and reloads silently in the background
- gets a fresh cache-version tag injected by Vite on every build, so old caches are cleared automatically
- serves HTML and navigation network-first, and hashed JS/CSS assets cache-first
Sentry catches JS errors, unhandled promise rejections, and service worker failures, and includes session replay on errors.
Pull requests are welcome. CI runs lint, tests, and a build on every PR —
please make sure npm run test and npm run lint pass locally first.
MIT
