Parse bank statement PDFs, extract transactions, and export them as CSV.
This was initially built for personal use to make sense of my own bank statements. I'm putting it out here in case it helps someone else. It's not perfect — but it gets the job done.
- Upload a password-protected bank statement PDF
- Automatically extracts transactions (date, payee, amount, balance, category)
- Filter, search, and edit transactions in the browser
- Export to CSV
- Analytics dashboard with spending breakdowns, charts, and insights
HDFC, Canara, Union Bank, Federal Bank, SBI, Kotak, PNB, Kerala Gramin Bank
Adding a new bank? See CLAUDE.md for parser implementation guide.
| Layer | Tech |
|---|---|
| Frontend | React + Vite + Recharts |
| Backend | FastAPI + pdfplumber |
| Deploy | Cloudflare Pages + Render |
Backend (port 8000):
cd backend
pip install -r requirements.txt
uvicorn main:app --reloadFrontend (port 5173):
cd frontend
npm install
npm run dev| Variable | Description |
|---|---|
VITE_API_URL |
Backend API URL (e.g. https://your-backend.onrender.com/api) |
VITE_GTM_ID |
Google Tag Manager container ID |
VITE_CLARITY_PROJECT_ID |
Microsoft Clarity project ID |
Vite env vars are baked in at build time — changing them requires a redeploy.
| Variable | Description |
|---|---|
ALLOWED_ORIGINS |
Comma-separated frontend URLs for CORS |
- Frontend: Cloudflare Pages — root dir
frontend, buildnpm run build, outputdist - Backend: Render — uses
render.yaml, root dirbackend
This project is under active development. You will encounter issues:
- Parser errors — Bank statement formats vary widely. Some statements may fail to parse or return incomplete data. If you get 0 transactions, try selecting a different bank or check the debug logs.
- Payee extraction is imperfect — Some transactions may show "Unknown" payee or wrong categories. UPI and NEFT payees are usually accurate; others depend on narration format.
- PDF compatibility — Not all PDF layouts are handled. Encrypted PDFs with non-standard encryption may fail.
- Balance tracking — Running balance may be inaccurate if the parser misses rows.
- Analytics data — Charts are only as good as the parsed data. Garbage in, garbage out.
If something breaks, open an issue with the bank name and a screenshot of the debug logs.