Open-source project
whisper-money/whisper-money avatar
whisper-money/whisper-money

Whisper Money: a self-hosted Laravel and React finance tracker

Understand your personal finances. Forget Excels, try Whisper Money.

1,126 stars112 forksPHPNOASSERTION

At a glance

What is it?
Whisper Money is a privacy-first personal finance app built on Laravel 12 and React 19. It ships a one-line installer, a production Docker Compose file and a Coolify template, but its licence is non-commercial.
Who is it for?
Adopt Whisper Money if you want a self-hosted spending tracker you can read end to end, you are comfortable with PHP 8.4, MySQL and Redis, and you can live with a non-commercial licence. Skip it if you need bank feeds, mobile apps or a permissive licence for a paid service.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly PHP, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Whisper Money solves, and for whom

The README frames the project against spreadsheets: "Understand your personal finances. Forget Excels, try Whisper Money." The problem it targets is narrow and concrete. You have several bank accounts, you want transactions categorised without exporting CSVs into a spreadsheet every month, and you do not want that spending history sitting inside a hosted service that profiles you for advertising. The README states plainly that the project does not sell data and does not profile users for ads, and that the codebase is public so you can check where data goes.

That makes the audience specific. It is for people who already run a server or are willing to run Docker Compose, and who treat the database as the asset. It is also for developers who want to read the categorisation logic rather than trust a vendor's description of it. The feature list is deliberately short: bank account management, automatic and manual transaction categorisation, automation rules that categorise transactions for you, and spending insights. There is no investment tracking, no invoice handling and no accounting ledger. If you need double-entry bookkeeping, this is the wrong shape of tool.

The topics on the repository (budgeting, money-management, open-source, personal-finance, privacy, react, self-hosted) match that positioning. The homepage is whisper.money, and the README points to a demo account at whisper.money/login?demo=1 that requires no registration, which is the cheapest way to judge the interface before you install anything.

Architecture: Laravel 12, Inertia, MySQL and a queue

The stack is a conventional modern Laravel application. The README lists Laravel 12 and PHP 8.4 on the backend, React 19 with Inertia.js v3 and TypeScript on the frontend, Tailwind CSS v4 for styling, MySQL for storage, Redis for cache and queue, and Pest v4 for tests. Inertia is the important detail: there is no separate REST API between the React pages and the Laravel controllers, so the frontend is served from the same application and session handling stays in one place.

The compose.yaml file shows how the development services fit together. MySQL runs on host port 3307 by default (FORWARD_DB_PORT), Redis on 6380 (FORWARD_REDIS_PORT), and MailHog exposes SMTP on 1025 plus a dashboard on 8025. The php service is behind a "full" profile and maps port 8000, with DB_HOST set to mysql and DB_PORT to 3306 inside the network. That split matters: by default you get the backing services only, and the application container is opt-in.

The .env.example confirms the same layout for a manual install. DB_CONNECTION is mysql, DB_PORT is 3307, DB_DATABASE is whisper_money, SESSION_DRIVER is database, QUEUE_CONNECTION is database and CACHE_STORE is database, with REDIS_HOST on 127.0.0.1 and REDIS_PORT 6380. So a default install leans on MySQL for sessions, cache and the queue, and Redis is available but not the default driver for those three. That is a reasonable default for a single-user instance and a bottleneck if you ever run a large queue backlog.

The AI features (transaction categorisation and automation-rule suggestions) run through laravel/ai and default to Google Gemini. The README says the provider is configurable independently of the model and can point at any text provider laravel/ai supports, listing gemini, openai, anthropic, azure, groq, xai, deepseek, mistral, a self-hosted Ollama server, or openai-compatible. Each provider needs its own credentials, for example GEMINI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY or OLLAMA_URL.

Installing Whisper Money and categorising your first transaction

The README recommends the automated path. It is a single command that fetches and runs a setup script from whisper.money:

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

After that finishes, the README says to visit https://whisper.money.localhost in your browser. That hostname, rather than localhost, is what the script configures, and it matches APP_URL in .env.example.

If you would rather clone and set up by hand, the README gives two steps. Clone the repository, then run the installer command from inside the directory:

bash
git clone https://github.com/whisper-money/whisper-money.git
cd whisper-money
whispermoney install

The README attaches a warning to this: you must run whispermoney install before any other command, because commands such as start will not work without it. Once installed, the CLI covers the day-to-day operations:

bash
whispermoney start
whispermoney stop
whispermoney upgrade
whispermoney

The last one, with no argument, opens an interactive menu.

For a production-shaped test, the README describes using the production Docker image. Copy the production environment file and bring the stack up:

bash
cp .env.production.example .env
docker compose -f docker-compose.production.yml up -d

The application is then available at http://localhost:8080. To move it, set APP_PORT, for example APP_PORT=3000 docker compose -f docker-compose.production.yml up -d.

Deployment to Coolify follows the same pattern. Create a new resource, choose Docker Compose, select Empty Compose File, and paste the contents of templates/coolify/whisper-money.yaml from the repository. The template includes the application container, MySQL 8.0 with health checks, persistent volumes, and auto-generated database credentials. The only required environment variable listed is RESEND_API_KEY, for password resets and notifications; APP_KEY and APP_URL are auto-configured, and the container generates an APP_KEY on first startup if none is provided.

Once you are in, the first real task is categorisation. Add an account, import or enter transactions, and then set up automation rules so future transactions are categorised without manual work. If you want that categorisation to run locally, set AI_PROVIDER to ollama (the default is gemini) and point OLLAMA_URL at your own server, so transaction descriptions never leave your infrastructure.

Where Whisper Money falls short

The licence is the first constraint. The README carries a CC BY-NC 4.0 badge and links to LICENSE.md, and the repository metadata reports the licence as NOASSERTION. CC BY-NC 4.0 is a non-commercial licence. If you were hoping to run this as the basis of a paid service, or to embed it in a commercial product, the licence text is the thing to read before you write any code, and it is not a question this article can settle for you.

Second, there are no bank connections in the documented feature set. Accounts, transactions, categorisation, rules and insights are all listed; automatic bank syncing is not. In practice that means you are entering transactions yourself or importing them, which is exactly the spreadsheet chore the project claims to remove, minus the spreadsheet. Anyone who expects Plaid-style aggregation will be disappointed.

Third, the AI features depend on an external service by default. Gemini is the default provider, so out of the box your transaction descriptions go to Google unless you switch AI_PROVIDER to ollama or another endpoint you control. The privacy claim in the README is about data selling and ad profiling, and it is accurate as written, but "privacy-first" and "default AI provider is a cloud API" sit in tension until you change that variable.

Fourth, the operational surface is not small. PHP 8.4, MySQL, Redis, a queue worker, a scheduler and a Node/Bun build step all have to be healthy. The README does not document rollback for a failed whispermoney upgrade, and it does not describe a migration strategy between versions. The release history shows frequent small versions (v0.2.8, v0.2.9, v0.2.10 within about a month), which means upgrades arrive often and you should have your own database backup routine before running one. The last push to the repository was on 2026-09-10.

Whisper Money compared with Firefly III

Firefly III is the obvious alternative and the one people search for alongside this project. The difference is in the model rather than the feature checklist. Firefly III is a long-running PHP application built around double-entry accounting: accounts have types, transactions have opposing legs, and the data model is designed for people who want their finances to reconcile like a ledger. Whisper Money's documented feature list is account tracking, categorisation, automation rules and spending insights. It is built to answer "where did my money go this month", not "do my books balance".

That shows up in the surrounding choices too. Whisper Money is Laravel 12 with Inertia and React 19, so the interface is a modern single-page application rather than server-rendered Blade templates. It has an AI categorisation layer that Firefly III does not have in the same form, and it can point that layer at a local Ollama model. It also ships a Coolify template and a whispermoney CLI, which lowers the setup cost compared with assembling a Firefly III stack by hand.

The trade-off runs the other way as well. Firefly III's accounting rigour is the reason people stay with it, and Whisper Money's simpler model will feel thin if you need to track debts, assets or transfers between accounts with precision. If your goal is a categorised view of spending and you want AI to do the labelling, Whisper Money is the shorter path. If your goal is a set of books, Firefly III is the right tool and Whisper Money is the wrong one.

Maintenance, upgrades and licence cost

The repository is not archived and the last push was on 2026-09-10, so the project is being worked on. Releases are frequent and small: v0.2.8 on 2026-08-12, v0.2.9 on 2026-08-24 and v0.2.10 on 2026-09-07. The version in package.json matches, at 0.2.10. That cadence is a maintenance cost as much as a sign of activity. There is a whispermoney upgrade command, and the README presents it as the supported path, but it does not describe what happens if the upgrade fails halfway or how to move back to an earlier release.

The stack you are agreeing to maintain is PHP 8.4, MySQL 8.0, Redis, a Node toolchain (the Dockerfile installs Bun and the repository carries bun.lock alongside package-lock.json), and Playwright browsers if you want to run the browser tests. The Dockerfile itself notes that installing Playwright browsers requires node_modules to be present first, so the image build does not do it for you. The CI workflow in .github/workflows/ci.yml is the reference for what a passing build looks like.

On licensing, the README displays a CC BY-NC 4.0 badge and the repository metadata reports NOASSERTION, which means the automated licence detection could not classify it. Read LICENSE.md directly rather than relying on either signal. For an individual running this on their own server, the non-commercial restriction is unlikely to bite. For anyone planning to offer it as a hosted service or bundle it into something sold, the NC clause is the first thing to resolve, and that is a question for a lawyer, not for a review.

Editorial conclusion

Adopt Whisper Money if you want a self-hosted spending tracker you can read end to end, you are comfortable with PHP 8.4, MySQL and Redis, and you can live with a non-commercial licence. Skip it if you need bank feeds, mobile apps or a permissive licence for a paid service. Before committing, read LICENSE.md, check whether your AI provider credentials are set in .env, and confirm that the whispermoney upgrade path matches the version you deployed.

Frequently asked questions

What is Whisper Money?

It is a privacy-first personal finance application for tracking, categorising and understanding spending, built with Laravel 12, React 19 and MySQL. The README states that the project does not sell user data and does not profile users for ads, and the whole codebase is public.

Can I run Whisper Money with Docker?

Yes. The README documents copying .env.production.example to .env and then running docker compose -f docker-compose.production.yml up -d, which serves the app on http://localhost:8080. The port can be changed with the APP_PORT variable.

Does Whisper Money send my transaction data to an AI provider?

By default yes, because the AI features run through laravel/ai with Gemini as the default provider. The README states that AI_PROVIDER can be set to ollama or another supported provider so that processing stays on your own infrastructure and data never leaves it.

What licence does Whisper Money use?

The README shows a CC BY-NC 4.0 badge and links to LICENSE.md, and the repository metadata reports the licence as NOASSERTION. CC BY-NC 4.0 is non-commercial, so read LICENSE.md before using the code in a paid product.

How do I upgrade Whisper Money to a new version?

The README lists whispermoney upgrade as the command for upgrading to the latest version, alongside whispermoney start and whispermoney stop. The README does not document rollback, so take a database backup first.

Official sources

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. whisper-money/whisper-money on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/whisper-money-whisper-money.svg)](https://hysenlabs.com/projects/whisper-money-whisper-money)