Understand your personal finances. Forget Excels, try Whisper Money.
Go to file
Víctor Falcón c5df59c285 feat: add multiple chart view modes for net worth evolution (#37)
## Summary

- Add four view modes for net worth and account balance charts:
- **Stacked Accounts**: existing stacked bar chart showing balances by
account
  - **Line**: net worth line chart with linear/log scale toggle
  - **Change**: bar chart showing MoM%, YoY%, Rolling 12M changes
- **Waterfall**: bridge chart showing Start -> Change -> End transition

- Add Vitest for frontend unit testing with 52 tests covering all
calculation functions
- Proper sign handling for liabilities (credit cards and loans subtract
from net worth)
- Log scale disabled with warning when net worth includes zero or
negative values
- Shared components and logic between dashboard and account detail
charts

## New Files

- `vitest.config.ts` - Vitest configuration
- `resources/js/lib/chart-calculations.ts` - Pure computation functions
- `resources/js/lib/chart-calculations.test.ts` - 52 unit tests
- `resources/js/hooks/use-chart-views.ts` - Shared chart view state hook
- `resources/js/components/charts/` - Reusable chart components

## Test plan

- [x] Dashboard net worth chart shows view toggle and all four views
work
- [ ] Account detail page chart shows view toggle and three views work
(no stacked)
- [x] Line chart scale toggle works (log disabled with warning when
applicable)
- [x] Change chart series toggle (MoM, YoY, 12M EUR, 12M %) works
- [x] Waterfall chart month selector works
- [x] All 52 unit tests pass (`bun run test`)
- [x] Build succeeds (`bun run build`)
- [x] Dark mode styling correct
2025-12-30 07:22:19 +01:00
.cursor Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
.github/workflows feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
app feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
bootstrap Reapply "swap horizon -> queue:work on mysql" 2025-12-30 07:22:18 +01:00
config Reapply "swap horizon -> queue:work on mysql" 2025-12-30 07:22:18 +01:00
database feat: Implement drip email campaign system (#35) 2025-12-30 07:22:18 +01:00
docker Add retry mechanism to email mailables and update supervisor config 2025-12-30 07:22:18 +01:00
public mail: whisper money logo on header 2025-12-30 07:22:18 +01:00
resources feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
routes fix: rong schedule import 2025-12-30 07:22:18 +01:00
src/lib/crypto E2E Encryption 2025-11-07 14:21:25 +00:00
storage Import CSV 2025-11-08 14:17:11 +00:00
tests feat(queue): Implement queueable email jobs with rate limiting 2025-12-30 07:22:18 +01:00
traefik feat(traefik): Add secure headers middleware to WhisperMoney service 2025-11-14 09:17:09 +01:00
.editorconfig Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
.env.example Reapply "swap horizon -> queue:work on mysql" 2025-12-30 07:22:18 +01:00
.gitattributes Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
.gitignore feat: Implement drip email campaign system (#35) 2025-12-30 07:22:18 +01:00
.mcp.json Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
.php-cs-fixer.dist.php Execute browser tests on CI (#10) 2025-12-03 16:26:30 +01:00
.prettierignore Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
.prettierrc Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
CLAUDE.md Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
Dockerfile feat(Docker): Optimize build process by removing unnecessary steps and adjusting environment variables 2025-11-24 18:53:24 +01:00
LICENSE.md Add Creative Commons license 2025-11-26 17:07:20 +01:00
README.md Update README: reformat community section and fix repository URL 2025-12-12 19:33:16 +01:00
artisan Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
boost.json Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
bun.lock feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
components.json Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
compose.yaml feat: Implement drip email campaign system (#35) 2025-12-30 07:22:18 +01:00
composer.json Reapply "swap horizon -> queue:work on mysql" 2025-12-30 07:22:18 +01:00
composer.lock Reapply "swap horizon -> queue:work on mysql" 2025-12-30 07:22:18 +01:00
eslint.config.js Y3:0 2025-11-26 12:01:49 +01:00
package-lock.json Add recharts dependency for dashboard visualizations 2025-12-01 10:30:26 +01:00
package.json feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
phpunit.xml Execute browser tests on CI (#10) 2025-12-03 16:26:30 +01:00
tsconfig.json Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
vite.config.ts Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
vitest.config.ts feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00
vitest.setup.ts feat: add multiple chart view modes for net worth evolution (#37) 2025-12-30 07:22:19 +01:00

README.md

Whisper Money

Whisper Money

CC BY-NC 4.0

The most secure way to understand your finances.

Whisper Money is a privacy-first personal finance application that helps you track, categorize, and understand your spending—all while keeping your financial data encrypted and secure.

💬 Join our Community: Whether you're a user looking for help or a developer wanting to contribute, we'd love to have you in our Discord server! Share feedback, ask questions, discuss new features, or just hang out with fellow privacy enthusiasts.

Features

  • 🔐 End-to-end encryption — Your financial data stays private
  • 🏦 Bank account management — Track multiple accounts in one place
  • 📊 Transaction categorization — Automatic and manual categorization
  • 🤖 Automation rules — Set up rules to auto-categorize transactions
  • 📈 Financial insights — Understand your spending patterns

Tech Stack

  • Backend: Laravel 12, PHP 8.4
  • Frontend: React 19, Inertia.js v2, TypeScript
  • Styling: Tailwind CSS v4
  • Database: MySQL
  • Cache/Queue: Redis
  • Testing: Pest v4

Running Locally

Prerequisites

  • Docker & Docker Compose
  • Composer
  • Node.js / Bun

Setup

  1. Clone the repository:
git clone https://github.com/whisper-money/whisper-money.git
cd whisper_money
  1. Copy the environment file:
cp .env.example .env
  1. Start the Docker services:
docker compose up -d
  1. Install dependencies and setup the application:
composer setup
  1. Start the development server:
composer run dev

This will concurrently start:

  • PHP development server
  • Queue worker
  • Log viewer (Pail)
  • Vite dev server

The application will be available at https://whispermoney.test.

License

This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.