| data | ||
| docs | ||
| images | ||
| notebooks | ||
| queries | ||
| scripts | ||
| src | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| lazy_beancount.bat | ||
| lazy_beancount.sh | ||
| LICENSE | ||
| main.py | ||
| Makefile | ||
| pylock.toml | ||
| README.md | ||
| requirements-extra.txt | ||
| requirements.txt | ||
| start.sh | ||
Lazy Beancount is Beancount accounting system packaged in Docker with batteries included:
- Fava with fava-dashboards
- and filter presets feature
- Beancount-import for automatic transaction categorisation and review UI:
- Importers set up to work out of the box:
- Wise, Monzo, Revolut, IBKR (Evernight/beancount-importers, uabean)
- more importers can be integrated/enabled on request
- configuration for multiple accounts via YAML config file
- UI for statement file upload
- Importers set up to work out of the box:
- Additional web interfaces (Streamlit-based) for:
- regularly providing total values of the accounts for automatic balancing (to be replaced by beantab)
- fetching currency rates / commodity prices (to be replaced by fava-currency-tracker)
- Pre-installed plugins:
- collections:
- beancount-lazy-plugins (valuation, filter_map, balance_extended, currency_convert, and more)
- beancount_reds_plugins (rename_accounts, effective_date, zerosum, and more),
- autobean (stock_split, share, and more)
- large plugins: fava-dashboards, fava-portfolio-returns, fava_investor
- smaller ones: beancount_share, beancount_interpolate, generate_base_ccy_prices
- collections:
- Configuration generator allows to define any number of accounts (cash, investments, savings, crypto, any other assets)
- Multiple currencies and auto-conversions between them
- Extensive configuration example with comments, including common useful shortcuts and solutions to common problems
- All tested together (manually) in a coherent setup
with the goal to enable gradual and incremental migration of personal finances into Beancount.
Full guide is located at https://lazy-beancount.xyz/. The approach follows these principles:
- Some of the values should be tracked precisely (e.g. net worth)
- Other things are an approximation (e.g. in expenses breakdown, unclassified or some misclassified entires are ok)
- Data entry should be automated or easy
- But it should be possible to track things to any level of precision if you choose to
Screenshots
Dashboard
Custom fava-dashboards setup (data/dashboards.tsx) with the following tabs:
| Tab | What it shows |
|---|---|
| Overview | Net worth trend, monthly income vs expenses, top expense categories |
| Assets | Balance history across all accounts, asset allocation breakdown |
| Accounts | Per-account balances and recent transaction history |
| Super | Super balance history (UniSuper + PSSap), FY SG contributions, voluntary contributions, concessional cap usage, projection to retirement with adjustable growth/salary/inflation/extra-contrib variables |
| Income and Expenses | Monthly income and expense totals by category, savings rate |
| Expenses Detailed | Drill-down into expense categories by month |
| Subscriptions | Recurring subscription spend tracking |
| Sankey | Cash flow diagram from income through expenses and savings |
| Projection | FIRE progress: accessible assets vs target (25× annual expenses), path-to-FIRE projection chart |
| Tax | Australian tax summary for current FY: gross income, estimated tax, Medicare levy, MLS (avoided with PHI), PAYG withheld, refund/liability estimate, tax-deductible donations, work expenses, union fees |
| Savings | Savings rate over time, breakdown of where savings go |
⚙️ Setup
🐳 Docker-compose: recommended
Make sure you have Docker installed first. Then:
git clone https://github.com/Evernight/lazy-beancount
cd lazy-beancount/example_data
env UID=$(id -u) GID=$(id -g) docker compose up
This will pull repository with the example and config templates, and also pull and run the latest version of the package from the Docker Hub. The service will start at http://localhost:8777/ by default.
Fava is also available on port 5003, importer interface is available on port 8101 (ports are overridable via config in docker-compose.yml).
On Mac you can also remove user parameter from docker-compose.yaml and just use docker compose up
Update image to the latest version from time to time using docker compose pull
🐳 Docker
You can pull image from the public repository:
docker pull vandereer/lazy-beancount:latest
or build it yourself:
git clone https://github.com/Evernight/lazy-beancount
cd lazy-beancount
docker build . -t vandereer/lazy-beancount:latest
To start, run:
./lazy_beancount.sh example_data
Use ./lazy_beancount.sh data when you want to start adding your own data under the data directory.
Commands are available in the container as:
docker exec -it lazybean bean-price example_data/main.bean -i --date=2024-01-05
You can also run container using Podman, adding "podman" as an additional argument to the lazy_beancount.sh script (e.g. lazy_beancount.sh data podman).
Extra dependencies
Additional vandereer/lazy-beancount:extra image exists that will contain more optional dependencies defined in requirements-extra.txt
🐍 Local development: conda/venv
If you want to be able to upgrade individual packages and experiment with other (and your own) plugins or additional importers, use venv or conda to make sure you run correct dependencies. Conda is used in the example as it's a little bit easier to manage Python versions with it compared to venv.
First, clone this repository into your desired location
git clone https://github.com/Evernight/lazy-beancount
cd lazy-beancount
Install conda
brew install miniconda
Then create and activate the environment
conda create -n lazy-beancount-env python=3.12.11
conda activate lazy-beancount-env
Install required packages in the environment
pip3 install -r requirements.txt
Run Fava on your ledger from the repository folder
fava main.bean
Go to http://127.0.0.1:5000 and explore Fava.
Note
I'd not recommend exposing the ports, various system and data through a public server unless you really know what you're doing. This setup has not been developed and tested for security and authentication when run as a public service. If you're interested in self-hosting Lazy Beancount, vote for the feature or feel free to contribute ideas and code.
🙏 Acknowledgements
This is mostly an integration project and would not have been possible without all of the great code from authors and contributors of all the repositories mentioned above, the Beancount and plain text accounting community. Please support, star and otherwise contribute to respective projects.
🔗 Similar projects
See also:
💬 Feedback and contributions
- Feel free to create an issue or contribute a fix.
- lazy-beancount.xyz has giscus connected to enable commenting directly at pages.
- matrix chat for small questions.
