This repository contains the full code to build a web application that aggregates and views personal finance data, in a similar way to the removed mint.com. It aims to be fast and functional, and its open source nature lends it to being customizable to individual use cases.
Compared to paid alternatives, you can save money, at the cost of having to manage details yourself, as paying for the aggregator API (eg Plaid) directly is cheaper than paying the $4-$10 a month full services cost. Unlike free services, your data is private, and not sold.
- Python backend, using the Django framework.
- HTML, CSS, and Javascript frontend
- PostgreSQL database, although this can be swapped out easily due to Django's ORM. You may wish to use SqLite instead if for personal use.
- Plaid to connect to financial institutions.
- Sendgrid as an email provider. (Sends verification and password reset emails, and emails administrators with errors and debug information.)
The webapp is functional in its current state (See our official webapp implementation above), but can be improved in a number of ways. Here are some examples:
This would allow for connecting to a broader range of institutions, and better international support
This is currently only tested in the US; it could use support for mixing different currencies, and aggregators that work better in other countries
Budget support is currently nascent.
Including examples
Make swapping in and out aggregators easier, through a decoupled API.
The frontend code is currently repetative and messy in places; there is room for improvement in terms of making it faster
The plotting libraries used on the Spending page (Plotly and plot.js) are currently large and bloated: Especially Plotly. A more compact, faster alternative would be a better match for this application's otherwise streamlined architecture.
If the environment variable DATABASE_URL
is present, this application is considered to be deployed,
which has several implications for how it operates. (See settings.py
for details.) If this is present, the
the following environment variables should be set up (if available):
SECRET_KEY
PLAID_CLIENT_ID
PLAID_SECRET
SENDGRID_KEY
If not deployed (DATABASE_URL
is not present), create a file called private.py
in the main
folder.
private.py
You must create a file main/private.py
in order to connect to plaid, and the email server. It will include
several variables, provided by Plaid and Sendgrid, through their accounts. Note that you if you
leave these blank, support for Plaid and/or email will be disabled.
Example contents:
PLAID_CLIENT_ID = "abc"
PLAID_SECRET_SANDBOX = "abc"
PLAID_SECRET_PRODUCTION = "abc"
SENDGRID_KEY = "abc"
The Database is configured via a URL. In production, this is configured via the DATABASE_URL
environment
variable. In dev use, it's configured by the DATABASE_URL
variable in settings.py
.
Currently, the frontend code is written in plain Javascript. This has the distinct advantage of avoiding a build step and configuration. However: The lack of strict typing and module support, makes the code fragile: We may change to Typescript in the future.