Know what your subscriptions really cost — and never miss a cancellation deadline again.
Most of us have no idea what we actually spend on subscriptions each month. Streaming services, SaaS tools, insurance, the phone contract, the gym, a pile of small software licenses — individually they're easy to ignore, together they quietly add up to real money. And every one of them has a renewal date and, often, a notice period you have to hit to get out in time.
SubSentry pulls all of that into one place. Enter each subscription once and it shows you the total monthly and yearly burden, breaks spending down by category, and warns you in advance when a contract is about to renew or a cancellation window is closing.
SubSentry is local-first. There is no backend, no account, no sign-up and no cloud sync — by design. Every subscription you enter lives only in your browser's IndexedDB. The single way data ever leaves your device is the JSON export you trigger yourself, which you can use as a backup or to move to another machine. Sensitive contract and cost data never touches a server, because there is no server.
- Track subscriptions with amount, billing interval (weekly / monthly / quarterly / yearly), start date, contract end, notice period and category.
- Dashboard with total monthly and yearly cost, an active-subscription count and a category breakdown chart.
- Deadline alerts: "contract ends in X days" and "cancellation deadline approaching", colour-coded by urgency and sorted soonest-first.
- Interval normalization — everything is converted to comparable monthly and yearly figures.
- JSON import / export for backup and moving between devices, with a merge-or-replace choice on import.
- Dark / light theme that follows your OS by default, plus a responsive layout.
React 18 + TypeScript + Vite, Zustand for state, IndexedDB (via idb) for
storage, date-fns for the date math, Recharts for the category chart and
Tailwind CSS for styling. Tested with Vitest and React Testing Library.
git clone https://github.com/SciTee/subsentry.git
cd subsentry
npm install
npm run devOther scripts:
npm test # run the unit/component tests
npm run build # type-check and produce a production build
npm run lint # eslintThe export is a single JSON file you fully own:
{
"app": "subsentry",
"version": 1,
"exportedAt": "2026-05-16T10:00:00.000Z",
"subscriptions": [
{
"id": "…",
"name": "Netflix",
"amount": 17.99,
"currency": "EUR",
"interval": "monthly",
"startDate": "2024-03-01",
"endDate": null,
"cancellationPeriodDays": 0,
"category": "streaming"
}
]
}cancellationPeriodDays is the notice period in days you have to observe
before the contract end to cancel in time; 0 means it can be cancelled any
time and endDate may be null for open-ended subscriptions.
On import the file is validated entry by entry; a malformed file is rejected with a message pointing at the offending subscription rather than failing silently.
- Recurring reminders / browser notifications for upcoming deadlines
- Multi-currency totals with conversion
- Price-change history per subscription
- Optional PWA / offline install
MIT — see LICENSE.