# money Local tool that loads bank/card statements (Chase Visa, Ally, CVFCU PDFs; CVFCU "Account Details" page saved as PDF for recent activity; Capital One CSV) into `Bills_Tracker.xlsx` and shows a web dashboard. Imported statements are filed into `Statements/year/month/` and never read again. Savings and loan balances (Ally savings, CVFCU share, mortgage) go to a separate Accounts tab and page, never into spending or the budget. Everything runs locally; statements and the workbook are **never** committed or baked into the image. ## Run on ZimaOS / CasaOS Add the app: App Store -> Custom Install -> import `compose.yaml` (it follows the ZimaOS `x-casaos` format). Copy `Bills_Tracker.xlsx` into `/DATA/AppData/money/data/` (the app's data folder), then open the app's Web UI (port 8765). The image is built by Gitea Actions (`.gitea/workflows/build.yml`) and pushed to `git.necloud.us/nate/money`. Add a repository secret `REGISTRY_TOKEN` (a Gitea access token with `write:package`), and on the ZimaOS box run `docker login git.necloud.us` once so it can pull the private image. ## Run with plain Docker ```bash mkdir -p data && cp /path/to/Bills_Tracker.xlsx data/ TZ=America/New_York docker compose up -d # data is stored in /DATA/AppData/money/data on the host ``` ## Starting fresh `template/Bills_Tracker.template.xlsx` is a blank workbook (all tabs, formulas and charts; no data). The app's first-run screen has a "Create a blank workbook" button that copies it into the data folder. Then drop statements in; new payees land on the Lists tab as "Other / Unsorted" for you to categorize. `loader_rules.example.json` shows the private rules file format. ## Envelope budget The **Budget** page (`/budget`) turns each category into an envelope. Each month, assign your income to envelopes; the goal is "Ready to assign" = $0. Spending comes from the Bill Log, leftovers roll over, and overspending carries forward as a negative. Tools: *Copy last month*, *Suggest from spending* (3-month average) and *Move money*. Amounts are saved to a `Budget` tab in the workbook (one row per month and envelope), with a backup first. ## Categories New payees are categorized by built-in generic merchant rules (`seed_rules.py`); anything unknown lands in "Other / Unsorted". Use the **Categorize payees** card in the app (or the Lists tab) to set the rest. Your choices are saved in the workbook. ## Personal rules (not in git) Your name, card last-4 and similar live in `loader_rules.json` next to the workbook (git-ignored, not in the image): ```json {"own_names": ["JANE DOE"], "own_bank_hints": ["MY CREDIT UNION"], "csv_accounts": {"1234": "Capital One Card"}} ``` `own_names` lets the loader recognise transfers between your own accounts. Copy the file into the data folder (`/DATA/AppData/money/data/` on ZimaOS). ## Run without Docker ```bash python3 -m venv .venv && .venv/bin/pip install -r requirements.txt && .venv/bin/python app.py ``` `DATA_DIR` (default: this folder) is where statements, the workbook and `backups/` live. The app has no login. Publish it on localhost only, or put it behind your own authentication.