Decompose your spending, track your real purchasing power.
After 10 years of manually recording every transaction and reconciling all accounts every morning in Firefly III, the dataset is rich enough for deeper questions: how has my real cost of living evolved? Is my discretionary spending growing faster than my income? Can I sustain my investment plan while keeping a comfortable margin?
Prismfly crosses that granular spending data with income tax records to answer those questions — with an interactive dashboard and a markdown report you can feed to an LLM for further analysis.
- Personal Inflation Index (ICVP): tracks how your cost of living evolves relative to a base year, compared against official CPI
- Lifestyle inflation elasticity: measures whether discretionary spending grows faster or slower than income
- Account-based savings tracking: net flow in main accounts as the most reliable savings metric
- Investment sustainability waterfall: monthly cascade from salary through needs, investment, and discretionary spending to free margin
- Interactive Plotly.js dashboard: 11 charts with zoom, pan, hover, legend toggle, range sliders, and stacked/grouped modes
- Markdown report: raw analytical data exportable for LLM-assisted analysis
- Shared expenses support: optional partner reimbursement tracking via Settle Up or similar
- Capital expenditure filtering: automatic exclusion via Firefly tags or description keywords
- uv
- Firefly III instance accessible on your network
.envfile withFIREFLY_URLandFIREFLY_TOKENpersonal.jsonwith your tax data and account structure (seepersonal.example.json)
# Fetch latest data from Firefly III and generate dashboard + report
uv run main.py
# Regenerate outputs from cached data only (no network)
uv run main.py --no-fetch
# Force re-download of all years (not just current)
uv run main.py --forceOutputs:
dashboard.html— interactive dashboard, open in any browserdashboard.md— raw metrics in markdown, for LLM analysis or external tools
For LLM-assisted discussion, provide both dashboard.md and CONTEXT.md (your manually maintained narrative context).
├── main.py # CLI entry point
├── src/
│ ├── config.py # Loads personal.json + public data (CPI)
│ ├── firefly.py # Firefly III API client (read-only)
│ ├── extract.py # Data extraction, pagination, and caching
│ ├── analyze.py # Basket classification, ICVP, elasticity, waterfall
│ ├── dashboard.py # Plotly.js HTML generation
│ └── report.py # Markdown report generation
├── personal.json # Your tax data, accounts, filters (gitignored)
├── personal.example.json # Template for personal.json
├── CONTEXT.md # Narrative context for LLM analysis (manual, gitignored)
├── data/ # Cached JSON (auto-generated, gitignored)
├── .env # API URL and token (gitignored)
├── dashboard.html # Generated dashboard (gitignored)
└── dashboard.md # Generated report (gitignored)
All personal data lives in personal.json (gitignored). See personal.example.json for the full schema. Key sections:
| Section | Purpose |
|---|---|
tax_data |
Annual gross/net salary by year |
salary_sources |
Employer names for income classification |
main_accounts |
Firefly account names + IDs for savings tracking |
partner_* |
Shared expense reimbursement config (optional) |
basket_map |
Firefly category → analytical basket mapping |
capital_tags / capital_keywords |
Capital expenditure detection |
renovation_tags |
One-off renovation exclusion from sustainability waterfall |
shield_accounts / investment_accounts / other_accounts |
Financial snapshot for the report |
11 interactive charts (Plotly.js):
- Quarterly spending — needs / discretionary / other, with stacked/grouped toggle
- Monthly explorer by basket — range slider, stacked/grouped/100% modes
- ICVP vs CPI — personal inflation vs official index
- Elasticity scatter — income variation vs discretionary spending variation
- Heatmap — average monthly spend by basket and year
- Distribution (%) — spending composition by basket
- Dining & leisure — EUR/month and % of salary (lifestyle inflation indicator)
- Monthly savings rate — with 3-month moving average
- Main accounts delta — annual net flow
- Income composition — salary, reimbursements, inheritance, other
- Sustainability waterfall — full per-basket breakdown from salary to free margin
Transaction data is cached as JSON in data/. Closed years are never re-fetched unless --force is used. The current year is always refreshed. Account balances are refreshed on every fetch run.
Update personal.json with each new tax year. Update IPC_ACUM / IPC_INTER in config.py with official CPI data.
- Subscription reclassification:
subs_education/subs_technologyinpersonal.json - Renovation one-offs: tag transactions in Firefly with the tags listed in
renovation_tags - Capital expenditures: tag with
capital_tagsor add description keywords tocapital_keywords
Update CONTEXT.md when personal circumstances, investment strategy, or major financial events change.