Find and cancel hidden subscriptions by scanning your bank statement.
Privacy-first: your bank data is parsed locally in the browser. Nothing is uploaded.
Live Demo · Features · Getting Started · Contributing
Upload a bank statement (PDF or CSV), and SubscripKiller finds every recurring subscription charge — Netflix, Spotify, gym memberships, forgotten trials — then shows you exactly how to cancel each one.
Built for European consumers with support for 19 banks across Germany, France, UK, and US.
- Bank statement scanning — PDF and CSV parsing powered by PDF.js and PapaParse, running 100% in your browser
- 1,100+ subscription detection — AI-powered matching engine identifies recurring charges
- Cancel guides — Step-by-step instructions for 30+ services with difficulty ratings
- 19 bank guides — How to download your statement from Deutsche Bank, Sparkasse, N26, Barclays, Chase, and more
- 9 languages — English, German, French, Spanish, Portuguese, Dutch, Italian, Japanese, Chinese
- Privacy-first — Raw bank data never leaves your device. Only transaction descriptions are sent for matching.
- Google login — Optional account to save scan history
- Stripe payments — Unlock full results for a one-time fee
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Auth | Auth.js v5 (Google + Email) |
| Database | Neon (Serverless Postgres) |
| ORM | Drizzle |
| Payments | Stripe |
| i18n | next-intl |
| Styling | Tailwind CSS v4 |
| PDF Parsing | PDF.js |
| CSV Parsing | PapaParse |
| Deployment | Vercel |
- Node.js 18+
- A Neon database (free tier works)
- Google OAuth credentials
- Stripe account (test mode works for development)
# Clone the repo
git clone https://github.com/molly554/subscripkiller_public.git
cd subscripkiller_public
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env.local
# Edit .env.local with your credentials
# Push database schema to Neon
npx drizzle-kit push
# Start development server
npm run devOpen http://localhost:3000 to see the app.
See .env.example for the full list. You need:
| Variable | Required | Description |
|---|---|---|
AUTH_SECRET |
Yes | Auth.js secret (npx auth secret) |
AUTH_GOOGLE_ID |
Yes | Google OAuth Client ID |
AUTH_GOOGLE_SECRET |
Yes | Google OAuth Client Secret |
DATABASE_URL |
Yes | Neon Postgres connection string |
STRIPE_SECRET_KEY |
Yes | Stripe secret key |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY |
Yes | Stripe publishable key |
STRIPE_WEBHOOK_SECRET |
Yes | Stripe webhook signing secret |
src/
├── app/ # Next.js App Router pages
│ ├── api/ # API routes (auth, checkout, match, webhook)
│ ├── blog/ # Blog pages (9 posts)
│ ├── cancel/ # Cancel guide pages (30+ services)
│ ├── contact/ # Contact page
│ ├── history/ # Scan history (authenticated)
│ ├── scan/ # Core scan tool + bank guides
│ └── layout.tsx # Root layout with providers
├── components/ # React components
├── data/ # Static data (banks, cancel guides, blog posts)
├── i18n/ # Internationalization config
├── lib/ # Utilities (auth, db, stripe, parsers, matcher)
├── messages/ # Translation files (9 locales)
├── styles/ # Global CSS
└── types/ # TypeScript types
We welcome contributions! The easiest ways to help:
- Add a bank — Add PDF/CSV download instructions for your bank
- Add a cancel guide — Document how to cancel a subscription service
- Add a language — Translate the UI to a new locale
- Report bugs — Open an issue with steps to reproduce
See CONTRIBUTING.md for details.
See DESIGN.md for the complete design system including typography, colors, spacing, and logo specifications.
This project is licensed under the GNU Affero General Public License v3.0.
This means:
- You can use, modify, and distribute this software freely
- If you run a modified version as a network service, you must release your source code
- All derivative works must use the same license
Built with Next.js, deployed on Vercel. Powered by open-source tools and the community.