dvm-finance
Integrated personal-finance app: download, parse, categorize, and review bank statements locally. Merges the abn-analyst analyzer and the abn-download downloaders into a single, local, single-user web application. No login, no charts, no LLM — rules + manual categorization, tables, and an audit trail.
Install & run (PyPI)
With PyPI, simply:
pip install dvm-finance
dvm-finance
Or with uv for no-venv installation:
uvx dvm-finance
For development from a local checkout / wheel:
uvx --from /path/to/abn-combined dvm-finance
uvx --from dist/dvm_finance-0.1.0-py3-none-any.whl dvm-finance
First run
dvm-finance # serves http://127.0.0.1:8000 and prints the URL
On first start the app creates its data directory (SQLite DB, downloaded
statements, snapshot exports) and migrates the schema automatically. Defaults to
the platform user-data dir (macOS: ~/Library/Application Support/dvm-finance/);
override with --data-dir or DVM_FINANCE_DATA_DIR. Other flags: --port
(default 8000) and --host (default 127.0.0.1).
The app binds to 127.0.0.1 and has no authentication — do not widen the
bind address on an untrusted network.
An empty install offers three ways in: migrate a legacy database (below), upload statement files on the Upload tab (MT940/STA, ABN XLS, generic CSV, PayPal TXT, Wise CSV, SEB CSV), or download directly from the Download tab.
Migrating from abn-analyst
One-time, idempotent import of all transactions, rules + conditions, budgets and
manual categorizations from a legacy abn_analyst.db (opened read-only):
dvm-finance migrate-legacy /path/to/abn_analyst.db
Re-running skips already-present rows. A per-table summary is printed.
Sharing data with a second person
- Export (Snapshots tab): one click writes a versioned, gzipped-JSON snapshot of transactions, rules, budgets and change reports, offered as a download.
- Import (their machine): upload the file on the Snapshots tab. The merge is incoming wins — new records are inserted, conflicting records (including manual categorizations and rule edits) are overwritten by the snapshot; local records absent from the snapshot are never deleted. The database is backed up first and an import report is stored for review.
- Second-user setup is two commands:
uvx dvm-finance, then import a snapshot in the browser.
Security note: snapshot files contain your full financial data and are not encrypted. Exchange them only over a channel you trust.
Downloads
-
ABN AMRO: click "Start ABN download" — a headed Chromium opens; authenticate with the ABN AMRO app; statements are fetched, saved and imported automatically. Requires Playwright browsers:
playwright install chromium
The app works fine without them (upload/rules/trends); the Download page shows install instructions when they are missing.
-
PayPal: start Chrome with remote debugging first, log in to PayPal, then click "Start PayPal download":
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9226 --user-data-dir=~/.chrome/debugdir \ https://www.paypal.com/reports/dlog
Development
source ~/venv/bin/activate
pip install -e ".[dev]"
playwright install chromium
ruff check . # lint
pytest # unit + integration (e2e/slow deselected)
pytest --cov=abn_combined # coverage (fails under 80%)
pytest -m e2e # Playwright end-to-end flows (headless Chromium)
dvm-finance --data-dir ./devdata # run against a scratch data dir
See docs/architecture.md, docs/developer.md and docs/product.md for design
notes, and docs/core-beliefs.md for the project's golden principles.
Metadata
Release files for dvm-finance 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dvm_finance-1.6.0.tar.gz | 197.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dvm_finance-1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 452.0 kB
Release files / dvm_finance-1.6.0.tar.gz
| Download URL | dvm_finance-1.6.0.tar.gz |
|---|---|
| Size | 197.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbe624955a3c48288839c9f613f61f9b5c94fcda20ff2032edadc84f62ca26e0
|
|
BLAKE2b-256 checksum How to use checksums |
397f2b119595af1dea22076e5f2d0a06a2585e647628160f50d17d36cad04aec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logRelease files / dvm_finance-1.6.0-py3-none-any.whl
| Download URL | dvm_finance-1.6.0-py3-none-any.whl |
|---|---|
| Size | 254.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c1594c064b8c75bb555ac64099083819e3deda09899d9d10aec4d028411e2f52
|
|
BLAKE2b-256 checksum How to use checksums |
259704c6f4abfb41de44534b8c81caf516fe7c026dcb57ef9e57372b1312df38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency log