A desktop budgeting app inspired by the Japanese kakeibo (家計簿), a method of tracking household spending by category and reflecting on it each month, here implemented with an envelope-budgeting model. You give every yen a job by dividing your income across labelled envelopes, import your real bank transactions, and watch each envelope fill up or drain over the month.
Written in C++20 with Qt 6. The interface is bilingual (French / 日本語).
The figures in this screenshot are fictional sample data created for illustration. They do not represent any real account or transaction.
This is a personal tool, built for my own use and shared publicly as a portfolio piece rather than a product. I made it to manage one household's budget across two currencies, euros and yen, using the kakeibo approach.
Because it only ever needed to fit one person, the scope is intentionally narrow:
- Single-user desktop app. All data is stored locally, with no accounts and no backend.
- Built and tested on macOS and Fedora.
- The interface is French and Japanese only.
- The statement importers handle just the banks I use (Rakuten Bank, Rakuten Card, Mitsubishi UFJ).
You're welcome to read, fork, or adapt it, but it isn't meant to work out-of-the-box for a different setup.
- Envelope budgeting. Create envelopes with a monthly goal and a ceiling, mark some as savings, and track how full each one is at a glance.
- Bank statement import. Paste a raw statement and it is parsed automatically. Supported formats: Rakuten Bank, Rakuten Card (credit), and Mitsubishi UFJ. Full-width Japanese digits are normalised to ASCII.
- Automatic categorisation. Expenses are matched to envelopes by remembered description types. Unknown ones prompt you once and are then remembered.
- Dispatch page. Distribute your income across envelopes, evenly or to each goal, with per-envelope locking and full undo/redo before you apply.
- History and statistics. Filter expenses by envelope and date range, and see per-month and per-year averages.
- EUR / JPY conversion. Every amount is shown in yen and euros using live European Central Bank reference rates (no API key required).
- Backups and cloud snapshot. Daily local backups (30 kept) and an optional image snapshot of selected envelopes written to a sync folder.
Both platforms build from source. Requires CMake 3.16 or newer, a C++20 compiler and Qt 6 (Core, Gui, Widgets, Network, Concurrent).
brew install cmake qt
./scripts/bundle.sh
mv Kakeibo.app /Applications/bundle.sh produces Kakeibo.app and runs macdeployqt, which needs to be on
PATH. It prints ERROR: lines about QtVirtualKeyboard and codesign along
the way; those are noise, the build succeeded if the last line is
Bundling complete. Re-run it after a git pull to update, and drag the app to
the trash to uninstall.
sudo dnf install cmake gcc-c++ qt6-qtbase-devel google-noto-sans-cjk-fonts
./scripts/bundle-linux.shbundle-linux.sh installs into ~/.local for the current user: the binary as
~/.local/bin/kakeibo, a launcher in ~/.local/share/applications and an icon
in the hicolor theme, so the app shows up in the application menu under Office
(log out and back in if the menu cache is stale). Re-run it to update,
--uninstall to remove it, and PREFIX=/usr/local sudo -E for a system-wide
install.
The CJK font package is not optional: without it the 日本語 half of every label
renders as empty boxes. Other distributions are untested, but the script only
needs the equivalent packages — on Debian or Ubuntu,
sudo apt install cmake g++ qt6-base-dev fonts-noto-cjk.
Kakeibo asks for a folder to keep its daily backups in before it shows the
window, and for a sync folder for the cloud snapshot the first time state
changes; both are remembered, and the sync folder can be declined. The EUR/JPY
rate is fetched at startup, so with no connection the euro amounts show -
until the next launch.
State is stored as JSON under $XDG_DATA_HOME/kakeibo (or
~/.local/share/kakeibo, the same path on macOS): enveloppes.json,
specialEnveloppes.json, and the backup and cloud path config. Installing,
updating and uninstalling all leave that folder alone.
backups.json and cloudPath.json hold absolute paths. When a stored path does
not exist, Kakeibo asks for a folder once and remembers the new one.
Building without installing, for hacking on the code.
cmake -S . -B build
cmake --build build
./build/KakeiboOr use the helper:
./scripts/run.shThe bank-statement parser has unit tests (pure logic, no Qt required):
cmake --build build
ctest --test-dir build --output-on-failureinclude/core data model, parsing, persistence, backups, cloud sync
include/ui the Qt views (envelopes, history, stats, dispatch, import, etc.)
include/uiElements small reusable widgets
src/ implementations mirroring include/
external/json nlohmann/json (single header)
assets/ icons, compiled into the binary via assets.qrc
scripts/ run, bundle and formatting helpers
MIT. See LICENSE.
