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 movements files 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 movements files 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 movements files 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.
Native desktop app with local AI included. No Docker, no Terminal kept open.
📥 Download installer (DMG · MSIX · .deb · .rpm)
Step-by-step guide with screenshots → install & first launch
— or, from the terminal: —
The script detects your hardware, downloads the optimal AI model for your RAM (1–7 GB) and sets everything up — zero intervention.
The app appears in Launchpad / Start Menu / file manager, ready to use.
Developer or manual install? → Full guide
Only Docker Desktop required. Official container from GitHub Container Registry, browser at http://localhost:8501.
🆘 Need help? Open an issue on GitHub — bugs, questions, feature requests.
⭐ Like Spendif.ai? Give us a star — it helps us reach the official package registries (Homebrew Core, winget).
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.
brew install --cask spendifai.deb and .rpm packages as GitHub release assetswinget install SpendifAi.SpendifAiAreas 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.