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.
Files changed (81) hide show
  1. financial_planner-0.1.0/.gitignore +24 -0
  2. financial_planner-0.1.0/LICENSE +28 -0
  3. financial_planner-0.1.0/LLM_SETUP.md +109 -0
  4. financial_planner-0.1.0/PKG-INFO +125 -0
  5. financial_planner-0.1.0/README.md +92 -0
  6. financial_planner-0.1.0/examples/demo/config/categories.yaml +65 -0
  7. financial_planner-0.1.0/examples/demo/config/config.yaml +82 -0
  8. financial_planner-0.1.0/examples/demo/config/rules.yaml +33 -0
  9. financial_planner-0.1.0/examples/demo/config/sources.yaml +25 -0
  10. financial_planner-0.1.0/examples/demo/data/harbor_checking_2025.csv +201 -0
  11. financial_planner-0.1.0/examples/demo/data/northwind_card_2025.csv +462 -0
  12. financial_planner-0.1.0/installer/README.md +90 -0
  13. financial_planner-0.1.0/installer/icon/financial-planner.svg +19 -0
  14. financial_planner-0.1.0/installer/icon/make-icons.sh +43 -0
  15. financial_planner-0.1.0/installer/icon/tray.svg +7 -0
  16. financial_planner-0.1.0/installer/macos/app/Financial Planner.app/Contents/Info.plist +16 -0
  17. financial_planner-0.1.0/installer/macos/app/Financial Planner.app/Contents/MacOS/launch +28 -0
  18. financial_planner-0.1.0/installer/macos/assemble-app.sh +34 -0
  19. financial_planner-0.1.0/installer/macos/make-dist.sh +39 -0
  20. financial_planner-0.1.0/installer/macos/make-local-app.sh +33 -0
  21. financial_planner-0.1.0/installer/manifest/pixi.toml +16 -0
  22. financial_planner-0.1.0/installer/shared/bootstrap.sh +68 -0
  23. financial_planner-0.1.0/pixi.lock +3683 -0
  24. financial_planner-0.1.0/pyproject.toml +102 -0
  25. financial_planner-0.1.0/scripts/make_demo_data.py +236 -0
  26. financial_planner-0.1.0/src/financial_planner/__init__.py +12 -0
  27. financial_planner-0.1.0/src/financial_planner/__main__.py +19 -0
  28. financial_planner-0.1.0/src/financial_planner/assets/AppIcon.icns +0 -0
  29. financial_planner-0.1.0/src/financial_planner/assets/app_icon.png +0 -0
  30. financial_planner-0.1.0/src/financial_planner/assets/tray.png +0 -0
  31. financial_planner-0.1.0/src/financial_planner/cli.py +310 -0
  32. financial_planner-0.1.0/src/financial_planner/config.py +263 -0
  33. financial_planner-0.1.0/src/financial_planner/desktop.py +515 -0
  34. financial_planner-0.1.0/src/financial_planner/launcher.py +185 -0
  35. financial_planner-0.1.0/src/financial_planner/rules.py +206 -0
  36. financial_planner-0.1.0/src/financial_planner/schema.py +529 -0
  37. financial_planner-0.1.0/src/financial_planner/server.py +258 -0
  38. financial_planner-0.1.0/src/financial_planner/share.py +209 -0
  39. financial_planner-0.1.0/src/financial_planner/sources.py +368 -0
  40. financial_planner-0.1.0/src/financial_planner/state.py +79 -0
  41. financial_planner-0.1.0/src/financial_planner/summary.py +272 -0
  42. financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/categories.yaml +34 -0
  43. financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/config.yaml +33 -0
  44. financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/rules.yaml +9 -0
  45. financial_planner-0.1.0/src/financial_planner/templates/new_plan/config/sources.yaml +19 -0
  46. financial_planner-0.1.0/src/financial_planner/templates/new_plan/data/.gitkeep +0 -0
  47. financial_planner-0.1.0/src/financial_planner/web/app.css +337 -0
  48. financial_planner-0.1.0/src/financial_planner/web/app.js +3656 -0
  49. financial_planner-0.1.0/src/financial_planner/web/index.html +233 -0
  50. financial_planner-0.1.0/tests/conftest.py +105 -0
  51. financial_planner-0.1.0/tests/test_cli.py +115 -0
  52. financial_planner-0.1.0/tests/test_config.py +114 -0
  53. financial_planner-0.1.0/tests/test_desktop.py +125 -0
  54. financial_planner-0.1.0/tests/test_rules.py +99 -0
  55. financial_planner-0.1.0/tests/test_server.py +112 -0
  56. financial_planner-0.1.0/tests/test_share.py +110 -0
  57. financial_planner-0.1.0/tests/test_sources.py +100 -0
  58. financial_planner-0.1.0/tests/test_summary.py +105 -0
  59. financial_planner-0.1.0/web/build.mjs +30 -0
  60. financial_planner-0.1.0/web/package-lock.json +1958 -0
  61. financial_planner-0.1.0/web/package.json +19 -0
  62. financial_planner-0.1.0/web/src/api.ts +50 -0
  63. financial_planner-0.1.0/web/src/app.css +337 -0
  64. financial_planner-0.1.0/web/src/app.ts +111 -0
  65. financial_planner-0.1.0/web/src/format.ts +62 -0
  66. financial_planner-0.1.0/web/src/index.html +233 -0
  67. financial_planner-0.1.0/web/src/main.ts +108 -0
  68. financial_planner-0.1.0/web/src/model.ts +764 -0
  69. financial_planner-0.1.0/web/src/types.ts +180 -0
  70. financial_planner-0.1.0/web/src/ui/categorize.ts +447 -0
  71. financial_planner-0.1.0/web/src/ui/college.ts +135 -0
  72. financial_planner-0.1.0/web/src/ui/explorer.ts +339 -0
  73. financial_planner-0.1.0/web/src/ui/future.ts +195 -0
  74. financial_planner-0.1.0/web/src/ui/help.ts +159 -0
  75. financial_planner-0.1.0/web/src/ui/planner.ts +295 -0
  76. financial_planner-0.1.0/web/src/ui/retire.ts +411 -0
  77. financial_planner-0.1.0/web/src/ui/scenarios.ts +494 -0
  78. financial_planner-0.1.0/web/src/ui/settings.ts +903 -0
  79. financial_planner-0.1.0/web/src/ui/theme.ts +63 -0
  80. financial_planner-0.1.0/web/test/model.test.ts +337 -0
  81. 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