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.
- 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_id
andsecret
from the Plaid dashboard
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.
Simply write the SQLAlchemy connection string in the config file.
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"
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
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()
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.