Import files from all your banks. Spendify merges them, eliminates double-counting, classifies every transaction — and your data never leaves your disk.
Python · Streamlit · SQLite · Ollama · no account required
Every month: download, open Excel, paste, fix the signs, find the duplicates. And every time something doesn't add up.
Three bank statements from three different banking portals, incompatible CSV formats, dates in different formats, amounts with random signs. Merging them by hand takes hours and always produces errors.
The supermarket purchase appears in the credit card statement and in the current account as a monthly aggregate charge. Adding everything up, your expenses look double what they actually are. No common tool solves this automatically.
A wire transfer to a savings account is not an expense. But if you import both accounts, the same transaction appears twice — as an outflow from the current account and as an inflow on the savings account.
Classifying 300 transactions per month by hand is a job. Cloud apps do it, but they send your banking data to their servers and charge you a monthly subscription.
No banking integrations, no account, no per-file configuration.
Export bank statements as CSV or XLSX from your bank's portal. Works with any bank — Spendify automatically detects the format with no manual configuration.
Select all files at once, even from different banks, even from different years. Spendify detects the document type, corrects signs, eliminates double-counting between card and account, and classifies every transaction.
The unified ledger shows everything in one place: charts, filters, export, and the certainty that every euro is counted exactly once.
This is not a generic budgeting app. It is designed around the specific problems of people with multiple bank accounts.
When the credit card charges the monthly amount to the current account, Spendify recognises the relationship and removes the double-counting automatically.
Time window ±45 days · 3 matching phases: sliding window → subset sum for split amounts → partial reconciliation
A wire transfer from a current account to a savings account is neither an expense nor income: it is an internal transfer. Spendify recognises it by comparing amounts, dates, and account holder names in the descriptions — even if the two files were imported at different times.
Every transaction has a unique ID calculated from its content (SHA-256). If you import the same file twice, nothing happens. You can re-import your entire transaction history without fear of duplicates.
Categorisation uses four levels in sequence:
It is not just a slogan. It is the architecture.
Spendify uses Ollama locally by default: an AI engine that runs on your computer, with no internet connection. Your bank statements never leave your disk.
If you use OpenAI or Claude, Spendify automatically removes all identifying data before any remote call:
If the check fails, the call is blocked — not silently degraded.
Data is stored in a SQLite file on your computer. You can copy it, move it, back it up like any other file. No mandatory cloud, no account, no subscription.
Four profiles that find in Spendify something alternatives do not offer.
Current account + credit card + savings account + trading account? Spendify unifies them all into a single ledger without having to do anything manually.
If you use Excel for your expenses, Spendify can replace that routine: you import the files once, Spendify unifies and classifies, you review only the exceptions.
No mandatory remote backend, no account, no registration. Your banking data stays where it belongs: on your computer.
Open source Python project with modular architecture, LLM pipeline on structured data, full test suite. A starting point for experimenting or building custom integrations.
Only Docker Desktop required. No git clone, no configuration.
The script pulls the image from GitHub Container Registry, starts the container
and opens the browser at http://localhost:8501 automatically.
Optional local AI: the installer asks whether to add Ollama with gemma3:12b — downloaded in background (~8 GB). Works on Apple Silicon (arm64) and amd64.
To uninstall: curl -fsSL https://raw.githubusercontent.com/drake69/spendify/main/installer/uninstall.sh | bash
Developer or native install? → Full guide (Mac native · Linux Docker · Windows llama.cpp)
No LLM framework (no LangChain) — AI backends use the official SDKs directly.
Implement LLMBackend (3 methods) and register it in BackendFactory. Works with any OpenAI-compatible API.
Flow 2 recognises them automatically via LLM without code changes. The schema is saved and reused in subsequent imports.
From the Taxonomy page, without touching the code. The taxonomy is fully configurable from the interface.
The process_file() pipeline is completely separate from the UI — it can be exposed via FastAPI without changes.
Areas where contributions are most useful:
If your bank is not automatically recognised, open an issue with an anonymised CSV sample.
The suite covers the business logic layer but not yet the Streamlit interface. There is room to contribute.
The architecture already supports multiple languages for descriptions. The UI is in Italian — there is scope to add other languages.
Batch categorisation is the bottleneck with a local LLM. There is room for parallelisation.