Understand your personal finances. Forget Excels, try Whisper Money.
Go to file
Víctor Falcón e5eca1eacb
feat: Add label support to single transaction update endpoint (#75)
## Summary
- Added label update support to the single transaction `update()`
endpoint
- Previously, labels could only be updated via the bulk update endpoint
- Now both endpoints support label updates with consistent behavior

## Changes
- **UpdateTransactionRequest**: Added `label_ids` validation (array of
UUIDs that must belong to user)
- **TransactionController@update**: Now handles label updates alongside
other attributes
  - Syncs labels when `label_ids` is provided
  - Reloads labels relationship for fresh data in events
  - Fires single `updated` event after all changes
- **AssignTransactionToBudget listener**: Ensures labels are loaded
fresh after queue serialization
- **Tests**: Added 6 comprehensive tests covering all label update
scenarios

## Behavior
- **Don't send `label_ids`** → labels unchanged (partial update)
- **Send `label_ids: []`** → removes all labels
- **Send `label_ids: [uuid1, uuid2]`** → replaces labels with these

## Testing
When labels are updated, the `TransactionUpdated` event fires and the
transaction is automatically assigned to matching budgets (via queued
listener).

All tests pass (29 tests, 134 assertions).

Fixes the issue where transactions wouldn't appear in budget after
adding a matching label via the single transaction update endpoint.
2026-01-24 17:54:54 +01:00
.cursor Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
.github Add production Docker setup for easy self-hosting with the CI-built image (#42) 2025-12-30 07:22:19 +01:00
app feat: Add label support to single transaction update endpoint (#75) 2026-01-24 17:54:54 +01:00
bootstrap Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
config feat: New discord offer 2026-01-10 10:27:32 +01:00
database feat: Load transactions history on budget created (#72) 2026-01-22 11:10:15 +01:00
docker chore: Fix caddy container 2026-01-17 20:02:14 +01:00
public chore: Simplify IndexedDB sync by moving to Inertia shared props (#63) 2026-01-19 19:15:26 +01:00
resources feat: Load transactions history on budget created (#72) 2026-01-22 11:10:15 +01:00
routes Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +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
templates/coolify fix: auto-regenerate APP_KEY if invalid format (missing base64: prefix) 2025-12-30 07:22:19 +01:00
tests feat: Add label support to single transaction update endpoint (#75) 2026-01-24 17:54:54 +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 feat: Add PostHog (#70) 2026-01-20 10:47:59 +01:00
.env.production.example Add production Docker setup for easy self-hosting with the CI-built image (#42) 2025-12-30 07:22:19 +01:00
.gitattributes Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
.gitignore feat: Automated setup script for local deployment (#58) 2026-01-16 15:57:12 +01:00
.mcp.json Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +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
.release-it.json feat: add version tracking with git tags and changelog 2025-12-30 07:22:19 +01:00
CHANGELOG.md chore: release v0.1.7 2026-01-21 15:57:29 +01:00
CLAUDE.md Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
Caddyfile chore: Fix caddy container 2026-01-17 20:02:14 +01:00
Dockerfile chore: Simplify IndexedDB sync by moving to Inertia shared props (#63) 2026-01-19 19:15:26 +01:00
Dockerfile.production feat: Automated setup script for local deployment (#58) 2026-01-16 15:57:12 +01:00
LICENSE.md Add Creative Commons license 2025-11-26 17:07:20 +01:00
README.md docs: Update README 2026-01-17 19:47:15 +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 PostHog (#70) 2026-01-20 10:47:59 +01:00
components.json Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
compose.yaml fix: MYSQL_EXTRA_OPTIONS env var 2026-01-19 18:18:23 +01:00
composer.json fix: typo in composer dev command 2026-01-22 15:07:37 +01:00
composer.lock Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
docker-compose.production.yml Add production Docker setup for easy self-hosting with the CI-built image (#42) 2025-12-30 07:22:19 +01:00
eslint.config.js Y3:0 2025-11-26 12:01:49 +01:00
package-lock.json chore: release v0.1.7 2026-01-21 15:57:29 +01:00
package.json chore: release v0.1.7 2026-01-21 15:57:29 +01:00
phpunit.xml fix: Check IDOR vulnerabilities (#60) 2026-01-17 09:58:52 +01:00
tsconfig.json Set up a fresh Laravel app 2025-11-07 12:01:36 +00:00
vite.config.ts Push sourcemap to bugsink 2025-12-31 12:56:25 +01: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
whispermoney fix: Wrong whispermoney script path 2026-01-16 18:48:44 +01:00

README.md

Whisper Money

Deutsch | Español | français | 日本語 | 한국어 | Português | Русский | 中文

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.

🎮 Try the Demo: Experience Whisper Money with our demo account - no registration required!

💬 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

The easiest way to get started is using our automated setup script:

bash <(curl -fsSL https://whisper.money/setup.sh)

After installation, just visit https://whisper.money.local in your browser.

Manual Setup

If you prefer to set up manually:

  1. Clone the repository:
git clone https://github.com/whisper-money/whisper-money.git
cd whisper-money
  1. Run the setup script:
whispermoney install

Available Commands

Once installed, you can use the wispermoney command for common tasks:

# Start all services
whispermoney start

# Stop all services
whispermoney stop

# Upgrade to latest version
whispermoney upgrade

# Interactive menu
whispermoney

Development Server

For active development with hot reloading:

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://whisper.money.local or http://localhost:8000 (direct PHP server).

Running with Docker (Production Image)

For testing the production Docker image locally:

  1. Copy the production environment file:
cp .env.production.example .env
  1. Start the services:
docker compose -f docker-compose.production.yml up -d

The application will be available at http://localhost:8080.

To use a different port, set APP_PORT:

APP_PORT=3000 docker compose -f docker-compose.production.yml up -d

Deploying to Coolify

Whisper Money can be easily deployed to Coolify using our Docker Compose template.

Quick Deploy

  1. In Coolify, create a new resource and select Docker Compose
  2. Choose Empty Compose File as the source
  3. Paste the contents from our template: 👉 whisper-money.yaml
  4. Deploy!

The template includes:

  • Whisper Money application container
  • MySQL 8.0 database with health checks
  • Persistent volumes for data and storage
  • Auto-generated database credentials

Required Environment Variables

Variable Description
RESEND_API_KEY Email service API key (for password resets, notifications)

Note: APP_KEY and APP_URL are auto-configured. The container generates an APP_KEY on first startup if not provided.

Optional Environment Variables

Variable Default Description
DRIP_EMAILS_ENABLED true Enable drip emails (welcome, onboarding, feedback)
HIDE_AUTH_BUTTONS false Hide login/register buttons on landing page
SUBSCRIPTIONS_ENABLED false Enable Stripe subscriptions
STRIPE_KEY - Stripe publishable key
STRIPE_SECRET - Stripe secret key
STRIPE_WEBHOOK_SECRET - Stripe webhook signing secret

License

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