financial_planner 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- financial_planner-0.1.0/.gitignore +24 -0
- financial_planner-0.1.0/LICENSE +28 -0
- financial_planner-0.1.0/LLM_SETUP.md +109 -0
- financial_planner-0.1.0/PKG-INFO +125 -0
- financial_planner-0.1.0/README.md +92 -0
- financial_planner-0.1.0/examples/demo/config/categories.yaml +65 -0
- financial_planner-0.1.0/examples/demo/config/config.yaml +82 -0
- financial_planner-0.1.0/examples/demo/config/rules.yaml +33 -0
- financial_planner-0.1.0/examples/demo/config/sources.yaml +25 -0
- financial_planner-0.1.0/examples/demo/data/harbor_checking_2025.csv +201 -0
- financial_planner-0.1.0/examples/demo/data/northwind_card_2025.csv +462 -0
- financial_planner-0.1.0/installer/README.md +90 -0
- financial_planner-0.1.0/installer/icon/financial-planner.svg +19 -0
- financial_planner-0.1.0/installer/icon/make-icons.sh +43 -0
- financial_planner-0.1.0/installer/icon/tray.svg +7 -0
- financial_planner-0.1.0/installer/macos/app/Financial Planner.app/Contents/Info.plist +16 -0
- financial_planner-0.1.0/installer/macos/app/Financial Planner.app/Contents/MacOS/launch +28 -0
- financial_planner-0.1.0/installer/macos/assemble-app.sh +34 -0
- financial_planner-0.1.0/installer/macos/make-dist.sh +39 -0
- financial_planner-0.1.0/installer/macos/make-local-app.sh +33 -0
- financial_planner-0.1.0/installer/manifest/pixi.toml +16 -0
- financial_planner-0.1.0/installer/shared/bootstrap.sh +68 -0
- financial_planner-0.1.0/pixi.lock +3683 -0
- financial_planner-0.1.0/pyproject.toml +102 -0
- financial_planner-0.1.0/scripts/make_demo_data.py +236 -0
- financial_planner-0.1.0/src/financial_planner/__init__.py +12 -0
- financial_planner-0.1.0/src/financial_planner/__main__.py +19 -0
- financial_planner-0.1.0/src/financial_planner/assets/AppIcon.icns +0 -0
- financial_planner-0.1.0/src/financial_planner/assets/app_icon.png +0 -0
- financial_planner-0.1.0/src/financial_planner/assets/tray.png +0 -0
- financial_planner-0.1.0/src/financial_planner/cli.py +310 -0
- financial_planner-0.1.0/src/financial_planner/config.py +263 -0
- financial_planner-0.1.0/src/financial_planner/desktop.py +515 -0
- financial_planner-0.1.0/src/financial_planner/launcher.py +185 -0
- financial_planner-0.1.0/src/financial_planner/rules.py +206 -0
- financial_planner-0.1.0/src/financial_planner/schema.py +529 -0
- financial_planner-0.1.0/src/financial_planner/server.py +258 -0
- financial_planner-0.1.0/src/financial_planner/share.py +209 -0
- financial_planner-0.1.0/src/financial_planner/sources.py +368 -0
- financial_planner-0.1.0/src/financial_planner/state.py +79 -0
- financial_planner-0.1.0/src/financial_planner/summary.py +272 -0
- financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/categories.yaml +34 -0
- financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/config.yaml +33 -0
- financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/rules.yaml +9 -0
- financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/sources.yaml +19 -0
- financial_planner-0.1.0/src/financial_planner/templates/new_plan/data/.gitkeep +0 -0
- financial_planner-0.1.0/src/financial_planner/web/app.css +337 -0
- financial_planner-0.1.0/src/financial_planner/web/app.js +3656 -0
- financial_planner-0.1.0/src/financial_planner/web/index.html +233 -0
- financial_planner-0.1.0/tests/conftest.py +105 -0
- financial_planner-0.1.0/tests/test_cli.py +115 -0
- financial_planner-0.1.0/tests/test_config.py +114 -0
- financial_planner-0.1.0/tests/test_desktop.py +125 -0
- financial_planner-0.1.0/tests/test_rules.py +99 -0
- financial_planner-0.1.0/tests/test_server.py +112 -0
- financial_planner-0.1.0/tests/test_share.py +110 -0
- financial_planner-0.1.0/tests/test_sources.py +100 -0
- financial_planner-0.1.0/tests/test_summary.py +105 -0
- financial_planner-0.1.0/web/build.mjs +30 -0
- financial_planner-0.1.0/web/package-lock.json +1958 -0
- financial_planner-0.1.0/web/package.json +19 -0
- financial_planner-0.1.0/web/src/api.ts +50 -0
- financial_planner-0.1.0/web/src/app.css +337 -0
- financial_planner-0.1.0/web/src/app.ts +111 -0
- financial_planner-0.1.0/web/src/format.ts +62 -0
- financial_planner-0.1.0/web/src/index.html +233 -0
- financial_planner-0.1.0/web/src/main.ts +108 -0
- financial_planner-0.1.0/web/src/model.ts +764 -0
- financial_planner-0.1.0/web/src/types.ts +180 -0
- financial_planner-0.1.0/web/src/ui/categorize.ts +447 -0
- financial_planner-0.1.0/web/src/ui/college.ts +135 -0
- financial_planner-0.1.0/web/src/ui/explorer.ts +339 -0
- financial_planner-0.1.0/web/src/ui/future.ts +195 -0
- financial_planner-0.1.0/web/src/ui/help.ts +159 -0
- financial_planner-0.1.0/web/src/ui/planner.ts +295 -0
- financial_planner-0.1.0/web/src/ui/retire.ts +411 -0
- financial_planner-0.1.0/web/src/ui/scenarios.ts +494 -0
- financial_planner-0.1.0/web/src/ui/settings.ts +903 -0
- financial_planner-0.1.0/web/src/ui/theme.ts +63 -0
- financial_planner-0.1.0/web/test/model.test.ts +337 -0
- financial_planner-0.1.0/web/tsconfig.json +16 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# environments
|
|
2
|
+
.pixi/
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.pyc
|
|
5
|
+
.pytest_cache/
|
|
6
|
+
*.egg-info/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
|
|
10
|
+
# frontend
|
|
11
|
+
web/node_modules/
|
|
12
|
+
|
|
13
|
+
# app state written next to a plan (planner edits, scenarios)
|
|
14
|
+
.financial_planner/
|
|
15
|
+
|
|
16
|
+
# never commit real financial data: only the fake demo data is tracked
|
|
17
|
+
*.csv
|
|
18
|
+
!examples/demo/data/*.csv
|
|
19
|
+
!tests/fixtures/*.csv
|
|
20
|
+
|
|
21
|
+
.DS_Store
|
|
22
|
+
|
|
23
|
+
# desktop app builds
|
|
24
|
+
installer/dist/
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, brookie
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Setting up a plan with an AI assistant
|
|
2
|
+
|
|
3
|
+
These are instructions for an AI coding assistant (one that can read files and run commands) to set
|
|
4
|
+
up a Financial Planner plan with a person. To use them, open a terminal in your plan folder, start
|
|
5
|
+
your assistant, and say:
|
|
6
|
+
|
|
7
|
+
> Read `<path to financial_planner>/LLM_SETUP.md` and help me set up my financial plan in this
|
|
8
|
+
> folder.
|
|
9
|
+
|
|
10
|
+
**Before you start:** the assistant will read your bank exports and what you tell it. Only use an
|
|
11
|
+
assistant and account you trust with financial data, and review what it writes.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Instructions for the assistant
|
|
16
|
+
|
|
17
|
+
You are helping a person build a plan for the Financial Planner app. Follow these steps in order.
|
|
18
|
+
Ask one small group of questions at a time, explain briefly why you're asking, accept "skip" or "I
|
|
19
|
+
don't know" (use the defaults), and confirm before writing files.
|
|
20
|
+
|
|
21
|
+
### 0. Privacy rules (always)
|
|
22
|
+
|
|
23
|
+
- Use generic names in the config: "Partner A", "Partner B", "Child 1". If the person gives real
|
|
24
|
+
names, suggest generic ones and use those unless they insist.
|
|
25
|
+
- Never write birthdates (ages only), account numbers, addresses, employer names or Social Security
|
|
26
|
+
numbers into the config. Generic labels like "Employer A pension" are fine.
|
|
27
|
+
- Keep the plan folder outside any public repository. If the folder is inside a git repository,
|
|
28
|
+
warn the person and suggest adding `data/` and `.financial_planner/` to `.gitignore` (or not
|
|
29
|
+
committing the plan at all).
|
|
30
|
+
- Don't upload, paste or send the person's data anywhere other than the files in the plan folder.
|
|
31
|
+
- If CSV descriptions contain card or account numbers, point that out.
|
|
32
|
+
|
|
33
|
+
### 1. Create the plan folder
|
|
34
|
+
|
|
35
|
+
If `config/` doesn't exist in the working folder, run:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
financial_plan init .
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
(or `pixi run financial_plan init .` / `python -m financial_planner init .`, whichever works). This
|
|
42
|
+
writes `config/config.yaml`, `sources.yaml`, `categories.yaml` and `rules.yaml` with comments.
|
|
43
|
+
Every field is documented in the wiki's Config Reference
|
|
44
|
+
(https://github.com/brookisme/financial_planner/wiki/Config-Reference); the other wiki pages
|
|
45
|
+
(Data Sources, Categories, Categorizing and Rules) explain each part in detail.
|
|
46
|
+
|
|
47
|
+
### 2. Household (`config/config.yaml` › `household`)
|
|
48
|
+
|
|
49
|
+
Ask, for each adult (one or more):
|
|
50
|
+
- age; take-home (net) pay per month and where it came from (pay stub, average of recent months);
|
|
51
|
+
- expected yearly raise above inflation (default 0);
|
|
52
|
+
- Social Security estimate at 67 (from their statement; a rough guess is fine) and when they plan
|
|
53
|
+
to claim (default: when retiring);
|
|
54
|
+
- pensions: name, monthly estimates by retirement age if they have them (e.g. from a pension
|
|
55
|
+
estimate tool), years of service so far;
|
|
56
|
+
- retirement accounts (401k, 403b, IRA): name, balance, monthly contribution.
|
|
57
|
+
|
|
58
|
+
The first partner is the "primary": the retirement-age slider is their age. Ask what age they're
|
|
59
|
+
thinking of retiring at (`assumptions.retirement.default_age`).
|
|
60
|
+
|
|
61
|
+
For each child: age, 529 balance and monthly contribution, the kind of college to plan for
|
|
62
|
+
(`public`, `flagship`, `private`, or custom schools under `assumptions.college.schools`), and the
|
|
63
|
+
graduation month if they know it.
|
|
64
|
+
|
|
65
|
+
### 3. Savings, investments, assumptions
|
|
66
|
+
|
|
67
|
+
- Other monthly income; monthly transfers to savings (`savings`); brokerage / stock accounts
|
|
68
|
+
(`investments`: balance, a return % or 0 to leave it off, monthly additions).
|
|
69
|
+
- Retirement assumptions: health insurance cost after retiring, tax rate in retirement (10-15% is a
|
|
70
|
+
common rough figure). Keep the default return / inflation unless they have a view.
|
|
71
|
+
|
|
72
|
+
### 4. Data sources (`config/sources.yaml`)
|
|
73
|
+
|
|
74
|
+
1. List the CSVs in `data/`. If there are none, ask the person to export 12 months of transactions
|
|
75
|
+
from each bank and card website as CSV and save them in `data/`.
|
|
76
|
+
2. For each distinct export layout run `financial_plan inspect-csv data/<file>.csv --name "<label>"`.
|
|
77
|
+
It prints the columns, sample rows and a suggested source entry.
|
|
78
|
+
3. Check the suggestion against the sample: the date column, the description column(s), and the
|
|
79
|
+
amount sign. Internally money out must be positive. For one signed column, set
|
|
80
|
+
`outflow: negative` if purchases are negative in the file, `positive` if purchases are positive.
|
|
81
|
+
For separate columns use `amount: {debit: <out column>, credit: <in column>}`.
|
|
82
|
+
4. Use a glob in `files` (e.g. `data/visa*.csv`) so future exports are picked up.
|
|
83
|
+
5. Run `financial_plan validate .` and fix any problems it reports.
|
|
84
|
+
|
|
85
|
+
### 5. Categories and rules (`categories.yaml`, `rules.yaml`)
|
|
86
|
+
|
|
87
|
+
1. Start from the starter categories. Ask whether to add or rename any (e.g. Coffee, Pets,
|
|
88
|
+
Childcare). Mark transfers, card payments, paychecks and savings/529 transfers as
|
|
89
|
+
`kind: ignore`; irregular big costs (property tax, a one-off purchase) as `kind: one_time`;
|
|
90
|
+
money coming in that offsets spending (reimbursements, refunds) as `kind: credit`.
|
|
91
|
+
2. Run `financial_plan categorize . --unmatched` to see what no rule catches.
|
|
92
|
+
3. Propose rules in small batches, grouped by merchant: prefer `contains` on a distinctive word,
|
|
93
|
+
`matches` for several merchants (`'COFFEE|CAFE'`), `similar_to` for merchants with changing
|
|
94
|
+
store numbers, `field: category` + `equals` to reuse the bank's own category, and filters
|
|
95
|
+
(`direction`, `min_amount`) when a word is ambiguous. Show the person the batch, then write it.
|
|
96
|
+
Put specific rules above general ones (first match wins).
|
|
97
|
+
4. Ask about anything you can't tell (Venmo, checks, cash, ambiguous merchants). Don't guess
|
|
98
|
+
silently.
|
|
99
|
+
5. Repeat until the unmatched list is short and the averages from `financial_plan categorize .`
|
|
100
|
+
look right to the person.
|
|
101
|
+
|
|
102
|
+
### 6. Finish
|
|
103
|
+
|
|
104
|
+
1. Run `financial_plan validate .` once more.
|
|
105
|
+
2. Start the app with `financial_plan start .` and suggest they look at the planner strip, then
|
|
106
|
+
Settings › Categorize to fix any remaining rows by clicking them.
|
|
107
|
+
3. Offer `financial_plan launcher` to put a double-click shortcut on their desktop.
|
|
108
|
+
4. Remind them: the plan folder holds private data; keep it off the internet and out of public
|
|
109
|
+
repositories.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: financial-planner
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A local, private household budget and long-term financial planner driven by CSVs and YAML.
|
|
5
|
+
Project-URL: Homepage, https://github.com/brookisme/financial_planner
|
|
6
|
+
Project-URL: Documentation, https://github.com/brookisme/financial_planner/wiki
|
|
7
|
+
Project-URL: Issues, https://github.com/brookisme/financial_planner/issues
|
|
8
|
+
Author: Brookie Guzder-Williams
|
|
9
|
+
License: BSD-3-Clause
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: 529,budget,household,personal finance,planner,retirement
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Office/Business :: Financial
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: fastapi>=0.110
|
|
23
|
+
Requires-Dist: pydantic>=2.6
|
|
24
|
+
Requires-Dist: ruamel-yaml>=0.18
|
|
25
|
+
Requires-Dist: uvicorn>=0.29
|
|
26
|
+
Provides-Extra: desktop
|
|
27
|
+
Requires-Dist: pillow>=10; extra == 'desktop'
|
|
28
|
+
Requires-Dist: pystray>=0.19; extra == 'desktop'
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
<sub>🤖 <b>Built with Claude.</b> This project was developed heavily with <a href="https://www.anthropic.com/claude">Claude</a> (Anthropic's AI assistant) using Claude Code.</sub>
|
|
35
|
+
|
|
36
|
+
# Financial Planner
|
|
37
|
+
|
|
38
|
+
A private, local household budget and long-term planner. Point it at the CSV exports from your bank
|
|
39
|
+
and credit cards, describe your household (in the app or in YAML), and explore your monthly budget,
|
|
40
|
+
college savings, retirement and how spending changes over time.
|
|
41
|
+
|
|
42
|
+
**Full documentation: [the wiki](https://github.com/brookisme/financial_planner/wiki).**
|
|
43
|
+
|
|
44
|
+
<p align="center"><img src="https://raw.githubusercontent.com/brookisme/financial_planner/main/assets/app-overview.png" height="350" alt="The Financial Planner app, showing the monthly planner and the retirement section with fictional demo data"></p>
|
|
45
|
+
|
|
46
|
+
## Contents
|
|
47
|
+
|
|
48
|
+
- [Features](#features)
|
|
49
|
+
- [Privacy first](#privacy-first)
|
|
50
|
+
- [Quick start](#quick-start)
|
|
51
|
+
- [Your own plan](#your-own-plan)
|
|
52
|
+
- [Commands](#commands)
|
|
53
|
+
- [Development](#development)
|
|
54
|
+
- [License](#license)
|
|
55
|
+
|
|
56
|
+
## Features
|
|
57
|
+
|
|
58
|
+
- **Monthly planner**: every category at its average; change any number and see what's left over.
|
|
59
|
+
- **Explore spending**: monthly charts, top merchants and every transaction.
|
|
60
|
+
- **College 529s**: a projection for each child against the cost of college.
|
|
61
|
+
- **Retirement**: income at each retirement age from pensions, accounts, investments and Social Security.
|
|
62
|
+
- **Spending over time**: how costs change as children leave home and after retiring.
|
|
63
|
+
- **Scenarios**: save, compare and share what-ifs, or share the whole plan as one file.
|
|
64
|
+
- **Settings and categorizing in the app**: no YAML editing required (but it's there if you want it).
|
|
65
|
+
|
|
66
|
+
## Privacy first
|
|
67
|
+
|
|
68
|
+
Everything runs on your computer and nothing is uploaded. Your plan folder holds real financial
|
|
69
|
+
data: **keep it out of public repositories and off the internet**, and use generic names (Partner A,
|
|
70
|
+
Child 1). See [Privacy and Safety](https://github.com/brookisme/financial_planner/wiki/Privacy-and-Safety).
|
|
71
|
+
|
|
72
|
+
## Quick start
|
|
73
|
+
|
|
74
|
+
Install [pixi](https://pixi.sh), then:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git clone https://github.com/brookisme/financial_planner.git
|
|
78
|
+
cd financial_planner
|
|
79
|
+
pixi run demo
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Your browser opens at http://127.0.0.1:8765 with a fictional demo household.
|
|
83
|
+
|
|
84
|
+
## Your own plan
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pixi run financial_plan init ~/MyFinancialPlan # create a plan folder
|
|
88
|
+
pixi run financial_plan start ~/MyFinancialPlan # open it
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Put your bank and card CSV exports in `~/MyFinancialPlan/data/`, then click the **gear (Settings)**
|
|
92
|
+
at the top right to add your household, connect the CSVs and categorize. On a Mac,
|
|
93
|
+
`pixi run financial_plan launcher` adds a **Financial Planner** app to Applications (menu-bar icon,
|
|
94
|
+
opens in the browser). A no-code download is described in the
|
|
95
|
+
[Desktop App](https://github.com/brookisme/financial_planner/wiki/Desktop-App) page.
|
|
96
|
+
|
|
97
|
+
Step-by-step guide: [Quick Start](https://github.com/brookisme/financial_planner/wiki/Quick-Start).
|
|
98
|
+
Want an AI assistant to set it up with you? See [LLM_SETUP.md](https://github.com/brookisme/financial_planner/blob/main/LLM_SETUP.md).
|
|
99
|
+
|
|
100
|
+
## Commands
|
|
101
|
+
|
|
102
|
+
| Command | What it does |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `financial_plan init [dir] [--demo]` | Create a plan folder (blank, or a copy of the demo). |
|
|
105
|
+
| `financial_plan start [dir]` | Open the app. |
|
|
106
|
+
| `financial_plan validate [dir]` | Check the config and CSVs. |
|
|
107
|
+
| `financial_plan inspect-csv FILE` | Show a CSV's columns and a suggested source entry. |
|
|
108
|
+
| `financial_plan export [dir]` / `import FILE` | Share a whole plan (config + data) as one .zip. |
|
|
109
|
+
| `financial_plan categorize [dir] [--unmatched]` | Category averages; rows no rule caught. |
|
|
110
|
+
| `financial_plan launcher` | Mac: add Financial Planner.app to /Applications. Elsewhere: a desktop shortcut. |
|
|
111
|
+
|
|
112
|
+
Details: [Command Line](https://github.com/brookisme/financial_planner/wiki/Command-Line).
|
|
113
|
+
|
|
114
|
+
## Development
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
pixi run -e dev test-all # Python + forecast-math tests
|
|
118
|
+
pixi run -e dev web-build # rebuild the web app
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
See [Development](https://github.com/brookisme/financial_planner/wiki/Development).
|
|
122
|
+
|
|
123
|
+
## License
|
|
124
|
+
|
|
125
|
+
BSD 3-Clause. Not financial advice: projections are rough and depend on the assumptions you enter.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<sub>🤖 <b>Built with Claude.</b> This project was developed heavily with <a href="https://www.anthropic.com/claude">Claude</a> (Anthropic's AI assistant) using Claude Code.</sub>
|
|
2
|
+
|
|
3
|
+
# Financial Planner
|
|
4
|
+
|
|
5
|
+
A private, local household budget and long-term planner. Point it at the CSV exports from your bank
|
|
6
|
+
and credit cards, describe your household (in the app or in YAML), and explore your monthly budget,
|
|
7
|
+
college savings, retirement and how spending changes over time.
|
|
8
|
+
|
|
9
|
+
**Full documentation: [the wiki](https://github.com/brookisme/financial_planner/wiki).**
|
|
10
|
+
|
|
11
|
+
<p align="center"><img src="https://raw.githubusercontent.com/brookisme/financial_planner/main/assets/app-overview.png" height="350" alt="The Financial Planner app, showing the monthly planner and the retirement section with fictional demo data"></p>
|
|
12
|
+
|
|
13
|
+
## Contents
|
|
14
|
+
|
|
15
|
+
- [Features](#features)
|
|
16
|
+
- [Privacy first](#privacy-first)
|
|
17
|
+
- [Quick start](#quick-start)
|
|
18
|
+
- [Your own plan](#your-own-plan)
|
|
19
|
+
- [Commands](#commands)
|
|
20
|
+
- [Development](#development)
|
|
21
|
+
- [License](#license)
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
- **Monthly planner**: every category at its average; change any number and see what's left over.
|
|
26
|
+
- **Explore spending**: monthly charts, top merchants and every transaction.
|
|
27
|
+
- **College 529s**: a projection for each child against the cost of college.
|
|
28
|
+
- **Retirement**: income at each retirement age from pensions, accounts, investments and Social Security.
|
|
29
|
+
- **Spending over time**: how costs change as children leave home and after retiring.
|
|
30
|
+
- **Scenarios**: save, compare and share what-ifs, or share the whole plan as one file.
|
|
31
|
+
- **Settings and categorizing in the app**: no YAML editing required (but it's there if you want it).
|
|
32
|
+
|
|
33
|
+
## Privacy first
|
|
34
|
+
|
|
35
|
+
Everything runs on your computer and nothing is uploaded. Your plan folder holds real financial
|
|
36
|
+
data: **keep it out of public repositories and off the internet**, and use generic names (Partner A,
|
|
37
|
+
Child 1). See [Privacy and Safety](https://github.com/brookisme/financial_planner/wiki/Privacy-and-Safety).
|
|
38
|
+
|
|
39
|
+
## Quick start
|
|
40
|
+
|
|
41
|
+
Install [pixi](https://pixi.sh), then:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/brookisme/financial_planner.git
|
|
45
|
+
cd financial_planner
|
|
46
|
+
pixi run demo
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Your browser opens at http://127.0.0.1:8765 with a fictional demo household.
|
|
50
|
+
|
|
51
|
+
## Your own plan
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pixi run financial_plan init ~/MyFinancialPlan # create a plan folder
|
|
55
|
+
pixi run financial_plan start ~/MyFinancialPlan # open it
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Put your bank and card CSV exports in `~/MyFinancialPlan/data/`, then click the **gear (Settings)**
|
|
59
|
+
at the top right to add your household, connect the CSVs and categorize. On a Mac,
|
|
60
|
+
`pixi run financial_plan launcher` adds a **Financial Planner** app to Applications (menu-bar icon,
|
|
61
|
+
opens in the browser). A no-code download is described in the
|
|
62
|
+
[Desktop App](https://github.com/brookisme/financial_planner/wiki/Desktop-App) page.
|
|
63
|
+
|
|
64
|
+
Step-by-step guide: [Quick Start](https://github.com/brookisme/financial_planner/wiki/Quick-Start).
|
|
65
|
+
Want an AI assistant to set it up with you? See [LLM_SETUP.md](https://github.com/brookisme/financial_planner/blob/main/LLM_SETUP.md).
|
|
66
|
+
|
|
67
|
+
## Commands
|
|
68
|
+
|
|
69
|
+
| Command | What it does |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `financial_plan init [dir] [--demo]` | Create a plan folder (blank, or a copy of the demo). |
|
|
72
|
+
| `financial_plan start [dir]` | Open the app. |
|
|
73
|
+
| `financial_plan validate [dir]` | Check the config and CSVs. |
|
|
74
|
+
| `financial_plan inspect-csv FILE` | Show a CSV's columns and a suggested source entry. |
|
|
75
|
+
| `financial_plan export [dir]` / `import FILE` | Share a whole plan (config + data) as one .zip. |
|
|
76
|
+
| `financial_plan categorize [dir] [--unmatched]` | Category averages; rows no rule caught. |
|
|
77
|
+
| `financial_plan launcher` | Mac: add Financial Planner.app to /Applications. Elsewhere: a desktop shortcut. |
|
|
78
|
+
|
|
79
|
+
Details: [Command Line](https://github.com/brookisme/financial_planner/wiki/Command-Line).
|
|
80
|
+
|
|
81
|
+
## Development
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pixi run -e dev test-all # Python + forecast-math tests
|
|
85
|
+
pixi run -e dev web-build # rebuild the web app
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
See [Development](https://github.com/brookisme/financial_planner/wiki/Development).
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
BSD 3-Clause. Not financial advice: projections are rough and depend on the assumptions you enter.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# kind: spending (regular, averaged) | one_time (kept out of averages, optional toggle)
|
|
2
|
+
# credit (money in that can offset spending) | ignore (transfers, payments, paychecks)
|
|
3
|
+
# kids_gone_pct / retired_pct: how the category changes once the kids leave / after retiring.
|
|
4
|
+
|
|
5
|
+
categories:
|
|
6
|
+
# Essentials
|
|
7
|
+
- {name: Housing, group: Essentials}
|
|
8
|
+
- {name: Utilities, group: Essentials, kids_gone_pct: -15}
|
|
9
|
+
- {name: Groceries, group: Essentials, kids_gone_pct: -35}
|
|
10
|
+
- {name: Kids' school, group: Essentials, kids_gone_pct: -100}
|
|
11
|
+
- {name: Kids' activities, group: Essentials, kids_gone_pct: -100}
|
|
12
|
+
- {name: Health & Wellness, group: Essentials, kids_gone_pct: -15, retired_pct: 20}
|
|
13
|
+
- {name: Insurance, group: Essentials, retired_pct: -50}
|
|
14
|
+
- {name: Transportation, group: Essentials, kids_gone_pct: -15, retired_pct: -20}
|
|
15
|
+
- {name: Pets, group: Essentials}
|
|
16
|
+
# Flexible ("try 10% less" trims these)
|
|
17
|
+
- {name: Shopping & Household, group: Flexible, flexible: true, kids_gone_pct: -30}
|
|
18
|
+
- {name: Dining, group: Flexible, flexible: true, kids_gone_pct: -25}
|
|
19
|
+
- {name: Coffee, group: Flexible, flexible: true}
|
|
20
|
+
- {name: Travel, group: Flexible, flexible: true, kids_gone_pct: -15, retired_pct: 25}
|
|
21
|
+
- {name: Entertainment, group: Flexible, flexible: true, kids_gone_pct: -20, retired_pct: 10}
|
|
22
|
+
- {name: Subscriptions & Phone, group: Flexible, flexible: true, kids_gone_pct: -15}
|
|
23
|
+
# Unsorted
|
|
24
|
+
- {name: Venmo, group: Unsorted, kids_gone_pct: -30}
|
|
25
|
+
- {name: Cash & checks, group: Unsorted, kids_gone_pct: -30}
|
|
26
|
+
- {name: Other, group: Unsorted, kids_gone_pct: -20}
|
|
27
|
+
|
|
28
|
+
# One-time / yearly costs: shown as toggles under "Yearly and one-time costs"
|
|
29
|
+
- name: Income tax
|
|
30
|
+
kind: one_time
|
|
31
|
+
tax: true
|
|
32
|
+
default_on: true
|
|
33
|
+
label: Set aside for income tax
|
|
34
|
+
note: state payment
|
|
35
|
+
- name: Property tax
|
|
36
|
+
kind: one_time
|
|
37
|
+
tax: true
|
|
38
|
+
in_retirement: true
|
|
39
|
+
label: Set aside for property tax
|
|
40
|
+
- name: Furniture
|
|
41
|
+
kind: one_time
|
|
42
|
+
label: Include furniture / large household purchases
|
|
43
|
+
note: may come up again
|
|
44
|
+
|
|
45
|
+
# Credits (money in)
|
|
46
|
+
- name: Benefit reimbursements
|
|
47
|
+
kind: credit
|
|
48
|
+
default_on: true
|
|
49
|
+
offsets: Shopping & Household # shown as a line under Shopping & Household
|
|
50
|
+
label: Reimbursements
|
|
51
|
+
note: work benefit payments
|
|
52
|
+
- name: Federal tax refund
|
|
53
|
+
kind: credit
|
|
54
|
+
default_on: true
|
|
55
|
+
offsets: Income tax # nested under the income tax toggle
|
|
56
|
+
label: Subtract the federal refund
|
|
57
|
+
- name: Other credits
|
|
58
|
+
kind: credit
|
|
59
|
+
label: Other reimbursements & credits
|
|
60
|
+
note: mobile deposits and other money in
|
|
61
|
+
|
|
62
|
+
# Never counted
|
|
63
|
+
- {name: Paychecks, kind: ignore}
|
|
64
|
+
- {name: Transfers & payments, kind: ignore}
|
|
65
|
+
- {name: 529 contributions, kind: ignore}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Demo plan: an entirely fictional household. Copy this folder to start your own plan, or run
|
|
2
|
+
# `financial_plan init my_plan` for a blank one.
|
|
3
|
+
|
|
4
|
+
plan:
|
|
5
|
+
title: Household Budget
|
|
6
|
+
subtitle: A fictional two-partner household with two kids, built from a demo card and checking account.
|
|
7
|
+
months: 12 # average over the last 12 months of transactions
|
|
8
|
+
# today: 2026-01 # the plan's "now"; defaults to the month after the last transaction
|
|
9
|
+
|
|
10
|
+
household:
|
|
11
|
+
partners:
|
|
12
|
+
- id: alex
|
|
13
|
+
name: Alex
|
|
14
|
+
age: 46
|
|
15
|
+
take_home_monthly: 7220.84
|
|
16
|
+
take_home_note: two paychecks a month
|
|
17
|
+
raise_pct: 0
|
|
18
|
+
social_security:
|
|
19
|
+
at_67: 3100
|
|
20
|
+
pensions:
|
|
21
|
+
- name: Robotics pension
|
|
22
|
+
estimates: {55: 800, 60: 1900, 65: 3400}
|
|
23
|
+
service_years_now: 9
|
|
24
|
+
accounts:
|
|
25
|
+
- name: Old 401(k)
|
|
26
|
+
balance: 148000
|
|
27
|
+
monthly: 0
|
|
28
|
+
- id: jordan
|
|
29
|
+
name: Jordan
|
|
30
|
+
age: 44
|
|
31
|
+
take_home_monthly: 4120
|
|
32
|
+
take_home_note: clinic paycheck
|
|
33
|
+
social_security:
|
|
34
|
+
at_67: 2400
|
|
35
|
+
claim_age: 67
|
|
36
|
+
accounts:
|
|
37
|
+
- name: 403(b)
|
|
38
|
+
balance: 61000
|
|
39
|
+
monthly: 600
|
|
40
|
+
children:
|
|
41
|
+
- id: riley
|
|
42
|
+
name: Riley
|
|
43
|
+
age: 12
|
|
44
|
+
college_529: {balance: 38500, monthly: 500}
|
|
45
|
+
school: flagship
|
|
46
|
+
- id: casey
|
|
47
|
+
name: Casey
|
|
48
|
+
age: 7
|
|
49
|
+
college_529: {balance: 12400, monthly: 500}
|
|
50
|
+
school: flagship
|
|
51
|
+
|
|
52
|
+
other_income_monthly: 0
|
|
53
|
+
|
|
54
|
+
savings:
|
|
55
|
+
- id: emergency
|
|
56
|
+
name: Emergency savings
|
|
57
|
+
monthly: 500
|
|
58
|
+
|
|
59
|
+
investments:
|
|
60
|
+
- id: brokerage
|
|
61
|
+
name: Brokerage
|
|
62
|
+
balance: 22000
|
|
63
|
+
return_pct: 0 # 0 = off until you pick a rate
|
|
64
|
+
monthly: 0
|
|
65
|
+
|
|
66
|
+
assumptions:
|
|
67
|
+
retirement:
|
|
68
|
+
return_pct: 5.5
|
|
69
|
+
inflation_pct: 3
|
|
70
|
+
withdrawal_pct: 4
|
|
71
|
+
tax_pct: 12
|
|
72
|
+
health_insurance_monthly: 1100
|
|
73
|
+
default_age: 63
|
|
74
|
+
college:
|
|
75
|
+
schools:
|
|
76
|
+
public: {name: Public in-state, cost: 30000}
|
|
77
|
+
flagship: {name: Flagship in-state, cost: 42000}
|
|
78
|
+
private: {name: Private, cost: 68000}
|
|
79
|
+
default_preset: mid
|
|
80
|
+
|
|
81
|
+
default_category: Other
|
|
82
|
+
default_credit_category: Other credits
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Categorization rules. Row rules ("this row is X") always win; otherwise the first match wins.
|
|
2
|
+
# One condition per rule: row | equals | contains | matches (regex) | similar_to
|
|
3
|
+
# field: description (default), category (the bank's), source, any CSV column, or "*" for any.
|
|
4
|
+
# Optional filters: source, direction (debit|credit), min_amount, max_amount.
|
|
5
|
+
|
|
6
|
+
rules:
|
|
7
|
+
# never counted
|
|
8
|
+
- {category: Paychecks, contains: PAYROLL}
|
|
9
|
+
- {category: Transfers & payments, matches: 'PAYMENT THANK YOU|CARD PAYMENT|TRANSFER TO SAVINGS'}
|
|
10
|
+
- {category: 529 contributions, contains: COLLEGEPLAN 529}
|
|
11
|
+
|
|
12
|
+
# credits
|
|
13
|
+
- {category: Benefit reimbursements, contains: BENEFITS REIMBURSEMENT}
|
|
14
|
+
- {category: Federal tax refund, contains: IRS TREAS}
|
|
15
|
+
|
|
16
|
+
# one-time
|
|
17
|
+
- {category: Property tax, contains: COUNTY TAX COLLECTOR}
|
|
18
|
+
- {category: Income tax, contains: STATE TAX BOARD}
|
|
19
|
+
- {category: Furniture, contains: FURNITURE, min_amount: 500}
|
|
20
|
+
|
|
21
|
+
# spending
|
|
22
|
+
- {category: Housing, contains: MORTGAGE}
|
|
23
|
+
- {category: Utilities, contains: POWER & WATER}
|
|
24
|
+
- {category: Coffee, matches: 'COFFEE|CAFE|ESPRESSO'}
|
|
25
|
+
- {category: Groceries, matches: 'FRESH FIELDS|CORNER GROCER'}
|
|
26
|
+
- {category: Kids' school, contains: TUITION}
|
|
27
|
+
- {category: Kids' activities, matches: 'CAMP\b|DANCERS|TOY CASTLE'}
|
|
28
|
+
- {category: Pets, similar_to: PAWS & CLAWS PET SUPPLY}
|
|
29
|
+
- {category: Health & Wellness, contains: GYM}
|
|
30
|
+
- {category: Insurance, contains: INSURANCE}
|
|
31
|
+
- {category: Venmo, contains: VENMO}
|
|
32
|
+
- {category: Cash & checks, matches: '^ATM|^CHECK \d+'}
|
|
33
|
+
- {category: Other credits, contains: MOBILE DEPOSIT}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Each source is one kind of CSV export. Column names are whatever your bank uses.
|
|
2
|
+
|
|
3
|
+
sources:
|
|
4
|
+
- name: Northwind card
|
|
5
|
+
files: data/northwind_card_*.csv
|
|
6
|
+
date: {column: Transaction Date} # format is detected (here 2025-01-31)
|
|
7
|
+
description: Description
|
|
8
|
+
amount: {debit: Debit, credit: Credit} # separate money-out / money-in columns
|
|
9
|
+
category_column: Category # the card's own category, usable in rules
|
|
10
|
+
category_map: # card category -> plan category (when no rule matches)
|
|
11
|
+
Dining: Dining
|
|
12
|
+
Gas/Automotive: Transportation
|
|
13
|
+
Health Care: Health & Wellness
|
|
14
|
+
Entertainment: Entertainment
|
|
15
|
+
Airfare: Travel
|
|
16
|
+
Lodging: Travel
|
|
17
|
+
Other Travel: Transportation
|
|
18
|
+
Phone/Cable: Subscriptions & Phone
|
|
19
|
+
Merchandise: Shopping & Household
|
|
20
|
+
|
|
21
|
+
- name: Harbor checking
|
|
22
|
+
files: data/harbor_checking_*.csv
|
|
23
|
+
date: {column: Posting Date, format: '%m/%d/%Y'}
|
|
24
|
+
description: [Description, Memo] # several columns are joined with a space
|
|
25
|
+
amount: {column: Amount, outflow: negative} # one signed column; withdrawals are negative
|