{"id":15628815,"url":"https://github.com/danielfrg/dinero","last_synced_at":"2026-06-13T01:33:15.800Z","repository":{"id":196319259,"uuid":"694724417","full_name":"danielfrg/dinero","owner":"danielfrg","description":"Tools to manage my finances. My own Mint/YNAB","archived":false,"fork":false,"pushed_at":"2026-03-01T23:10:16.000Z","size":858,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-02T01:44:07.215Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielfrg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-09-21T15:05:59.000Z","updated_at":"2026-03-01T23:10:20.000Z","dependencies_parsed_at":"2026-03-04T18:03:25.176Z","dependency_job_id":null,"html_url":"https://github.com/danielfrg/dinero","commit_stats":{"total_commits":26,"total_committers":1,"mean_commits":26.0,"dds":0.0,"last_synced_commit":"50ede1fc2aad2195315e2295c04a90968e1ee6fe"},"previous_names":["danielfrg/dinero"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danielfrg/dinero","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfrg%2Fdinero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfrg%2Fdinero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfrg%2Fdinero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfrg%2Fdinero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielfrg","download_url":"https://codeload.github.com/danielfrg/dinero/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfrg%2Fdinero/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34269364,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-03T10:23:53.911Z","updated_at":"2026-06-13T01:33:15.781Z","avatar_url":"https://github.com/danielfrg.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dinero\n\nTools and scripts to manage my personal finances.\nYour own Mint/YNAB, self hosted.\n\n- [Plaid](https://plaid.com) for collecting transactions from financial institutions\n- SQL Database for storing transactions\n  - I personally use Postgres but any SQLAlchemy compatible DB should work\n  - This README uses SQLite\n  - I use [NocoDB](https://nocodb.com) as a viewer/explorer with filters and groups\n    by Account, Category and so on\n  - I use [Metabase](https://www.metabase.com/) to create dashboards\n  - Your imagination is the limit here!\n  - You can read more about how I use this + some screenshots [in my wiki](https://wiki.danielfrg.com/homelab/dinero/).\n- Inspired by [yyx990803/build-your-own-mint](https://github.com/yyx990803/build-your-own-mint).\n\n## Requirements\n\n### Plaid\n\n- Create a [Plaid account](https://dashboard.plaid.com/)\n- You need development access to handle multiple accounts\n  - You can use it on development mode for free up to 100 accounts\n- I asked for production access and it was simple, just fill the form and say\n  you are not a company and that you will use it for personal use\n- Get your `client_id` and `secret` from the [Plaid dashboard](https://dashboard.plaid.com/developers/keys)\n\n#### Logging in to Banks\n\nUse the [plaid/quickstart](https://github.com/plaid/quickstart.git)\nto login to your institution.\n\nOnce you've linked the bank save the `ACCESS_TOKEN`. in the config file. See [settings](#config) below.\n\n### Database\n\nSimply write the [SQLAlchemy](https://www.sqlalchemy.org) connection string\nin the config file.\n\n## Config\n\nThe project reads it's config from `~/.config/dinero/config.toml`.\nYou can see a sample in [config.sample.toml](config.sample.toml).\n\nFor Plaid you need to set the token for each institution:\n\n```toml\n[plaid.tokens]\nbank_1 = \"access-development-XXXXXXXXXXXXXXXX\"\nbank_2 = \"access-development-YYYYYYYYYYYYYYYY\"\n```\n\nAnd a mapping to make the Account ID human readable:\n\n```toml\n[plaid.account_id_to_name]\nTHIS_IS_A_LONG_ID_1_XXXXXXXXXXXXXXXXXXXXXX = \"Bank 1 Checking\"\nTHIS_IS_A_LONG_ID_2_YYYYYYYYYYYYYYYYYYYYYY = \"Bank 2 Credit Card\"\n```\n\n## Usage\n\nAfter you have the requirements and config file.\n\nInstall by cloning the repo and installing the dependencies using your favorite\nPython environment manager.\n\nCreate DB and tables:\n\n```terminal\ndinero init-db\n```\n\nGet new transactions and add them to the database:\n\n```terminal\ndinero transactions\n```\n\nExample output:\n\n```terminal\n2023-09-21 11:06.45 [info     ] Transactions downloaded        name=XXX records=49\n2023-09-21 11:06.45 [info     ] Transactions pending           name=XXX records=1\n2023-09-21 11:06.45 [info     ] Transactions not pending       name=XXX records=48\n2023-09-21 11:06.58 [info     ] Loaded table                   recods=662 year=2023\n--------------------------------------------------------------------------------\nMy Bank - Checking\n--------------------------------------------------------------------------------\n2023-09-21 11:06.58 [info     ] Queried transactions           n=17\n2023-09-21 11:06.58 [info     ] Pending transactions           n=0\n2023-09-21 11:06.58 [info     ] New transactions to be added   n=2\n2023-09-21 11:06.58 [info     ] Transaction                    transaction={'Account': 'BoA Checking', 'Amount': XXX, 'Category': '', 'Date': '2023-09-20', 'Description': 'XXXX', 'Subcategory': ''}\n2023-09-21 11:06.58 [info     ] Transaction                    transaction={'Account': 'BoA Checking', 'Amount': XXX, 'Category': '', 'Date': '2023-09-20', 'Description': 'XXXX', 'Subcategory': ''}\n2023-09-21 11:06.58 [info     ] Existing transactions          n=15\n2023-09-21 11:06.58 [info     ] Error transactions             n=0\n\n================================================================================\nAll accounts summary from 2023-08-22 to 2023-09-21:\n================================================================================\nUsing Table for year: 2023\nRecords in table: 662\nTransactions queried: 49\nPending transactions: 1\nTransactions analysed (pending False): 48\nNew records to be inserted: 5\nExisting transactions: 43\nErrors transactions (not valid dates for table): 0\n\nInsert transactions to the Table? [Y/n]\n```\n\nGenerate a set of simple rules that will be used to categorize transactions:\n\n```terminal\njust rules\n```\n\nGenerate a dataset with all transactions in CSV and SQLite:\n\n```terminal\njust dataset\n```\n\n### Other\n\nThere is a handy function to generate a Pandas DataFrame with all transactions:\nI use this to do some analysis in a Jupyter Notebook.\n\n```python\nfrom dinero import analysis\ndf = analysis.get_dataframe()\n```\n\n## Contributions\n\nWhile I am happy to accept any contributions this is 100% tailored to how I use\nit so I might reject stuff I won't use.\n\nIf you want to do other things such as connecting to Airtable\n(initially I used Airtable but the new pricing made it not worth it)\nyou should fork this repo and make your own changes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielfrg%2Fdinero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielfrg%2Fdinero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielfrg%2Fdinero/lists"}