dinero
Tools and scripts to manage my personal finances. Your own Mint/YNAB, self hosted.
- Plaid for collecting transactions from financial institutions
- SQL Database for storing transactions
- I personally use Postgres but any SQLAlchemy compatible DB should work
- This README uses SQLite
- I use NocoDB as a viewer/explorer with filters and groups by Account, Category and so on
- I use Metabase to create dashboards
- Your imagination is the limit here!
- You can read more about how I use this + some screenshots in my wiki.
- Inspired by yyx990803/build-your-own-mint.
Requirements
Plaid
- Create a Plaid account
- You need development access to handle multiple accounts
- You can use it on development mode for free up to 100 accounts
- I asked for production access and it was simple, just fill the form and say you are not a company and that you will use it for personal use
- Get your
client_idandsecretfrom the Plaid dashboard
Logging in to Banks
Use the plaid/quickstart to login to your institution.
Once you've linked the bank save the ACCESS_TOKEN. in the config file. See settings below.
Database
Simply write the SQLAlchemy connection string in the config file.
Config
The project reads it's config from ~/.config/dinero/config.toml.
You can see a sample in config.sample.toml.
For Plaid you need to set the token for each institution:
[plaid.tokens]
bank_1 = "access-development-XXXXXXXXXXXXXXXX"
bank_2 = "access-development-YYYYYYYYYYYYYYYY"
And a mapping to make the Account ID human readable:
[plaid.account_id_to_name]
THIS_IS_A_LONG_ID_1_XXXXXXXXXXXXXXXXXXXXXX = "Bank 1 Checking"
THIS_IS_A_LONG_ID_2_YYYYYYYYYYYYYYYYYYYYYY = "Bank 2 Credit Card"
Usage
After you have the requirements and config file.
Install by cloning the repo and installing the dependencies using your favorite Python environment manager.
Create DB and tables:
dinero init-db
Get new transactions and add them to the database:
dinero transactions
Example output:
2023-09-21 11:06.45 [info ] Transactions downloaded name=XXX records=49
2023-09-21 11:06.45 [info ] Transactions pending name=XXX records=1
2023-09-21 11:06.45 [info ] Transactions not pending name=XXX records=48
2023-09-21 11:06.58 [info ] Loaded table recods=662 year=2023
--------------------------------------------------------------------------------
My Bank - Checking
--------------------------------------------------------------------------------
2023-09-21 11:06.58 [info ] Queried transactions n=17
2023-09-21 11:06.58 [info ] Pending transactions n=0
2023-09-21 11:06.58 [info ] New transactions to be added n=2
2023-09-21 11:06.58 [info ] Transaction transaction={'Account': 'BoA Checking', 'Amount': XXX, 'Category': '', 'Date': '2023-09-20', 'Description': 'XXXX', 'Subcategory': ''}
2023-09-21 11:06.58 [info ] Transaction transaction={'Account': 'BoA Checking', 'Amount': XXX, 'Category': '', 'Date': '2023-09-20', 'Description': 'XXXX', 'Subcategory': ''}
2023-09-21 11:06.58 [info ] Existing transactions n=15
2023-09-21 11:06.58 [info ] Error transactions n=0
================================================================================
All accounts summary from 2023-08-22 to 2023-09-21:
================================================================================
Using Table for year: 2023
Records in table: 662
Transactions queried: 49
Pending transactions: 1
Transactions analysed (pending False): 48
New records to be inserted: 5
Existing transactions: 43
Errors transactions (not valid dates for table): 0
Insert transactions to the Table? [Y/n]
Generate a set of simple rules that will be used to categorize transactions:
just rules
Generate a dataset with all transactions in CSV and SQLite:
just dataset
Other
There is a handy function to generate a Pandas DataFrame with all transactions: I use this to do some analysis in a Jupyter Notebook.
from dinero import analysis
df = analysis.get_dataframe()
Contributions
While I am happy to accept any contributions this is 100% tailored to how I use it so I might reject stuff I won't use.
If you want to do other things such as connecting to Airtable (initially I used Airtable but the new pricing made it not worth it) you should fork this repo and make your own changes.
Metadata
Release files for dinero-tools 1.0.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 | Provenance | Actions |
|---|---|---|---|---|
| dinero_tools-1.0.0.tar.gz | 86.1 kB | With provenance | Details for dinero_tools-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dinero_tools-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for dinero_tools-1.0.0-py3-none-any.whl |
Total release size: 111.3 kB
Release files / dinero_tools-1.0.0.tar.gz
| Download URL | dinero_tools-1.0.0.tar.gz |
|---|---|
| Size | 86.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78b9b9745e31026895aea595238ccdac16af300e48d102c22a11eeeb0096badb
|
|
BLAKE2b-256 checksum How to use checksums |
fab540cc75df4f3ffd61fa7007f8aceca5750302f600b694a2b0bbd8a65d000d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 4, 2026.
Transparency logRelease files / dinero_tools-1.0.0-py3-none-any.whl
| Download URL | dinero_tools-1.0.0-py3-none-any.whl |
|---|---|
| Size | 25.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4a46bc6ca2e3b65e083ba01dda46515cea5bf21571604157e2631d45c6fea76d
|
|
BLAKE2b-256 checksum How to use checksums |
771fc22ae0e8b4785e8019fc04c0f85e6a679e353294887b1fdd58e87ff30794
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 4, 2026.
Transparency logSecurity for dinero-tools 1.0.0
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.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for dinero_tools-1.0.0.tar.gz
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 Mar 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.