▗▄▄▄▖▄ ▄▄▄▄ ▄ ▄
█ ▄ █ █ █ █
█ █ █ █ ▀▀▀█
█ █ ▄ █
▀▀▀
▗▄▄▄▖▄ ▄ ▄▄▄▄ ▗▞▀▚▖▄▄▄▄ ▄▄▄ ▗▞▀▚▖ ▄▄▄
▐▌ ▀▄▀ █ █ ▐▛▀▀▘█ █ ▀▄▄ ▐▛▀▀▘▀▄▄
▐▛▀▀▘▄▀ ▀▄ █▄▄▄▀ ▝▚▄▄▖█ █ ▄▄▄▀ ▝▚▄▄▖▄▄▄▀
▐▙▄▄▖ █
▀
TinyExpenses is a lightweight self-hosted home budget tracker written in Rust. It stores data in CSV and TOML files and can be run directly or with Docker.
The goal is simple: track income and expenses without complex accounting software.
The budget model follows four main categories:
- Income
- Needs
- Wants
- Savings
A commonly used rule with this structure is the 50 / 30 / 20 rule:
- 50% Needs
- 30% Wants
- 20% Savings
git clone https://github.com/MateuszMyalski/tinyexpenses
cd tinyexpenses
mkdir logs
docker build -t tinyexpenses .
docker run \
-v ./accounts:/app/accounts \
-v ./logs:/app/logs \
-e SECRET_KEY=<32-char-secret> \
-p 8080:8080 \
-u 1000:1000 \
-d tinyexpenses
Then open:
http://localhost:8080git clone https://github.com/MateuszMyalski/tinyexpenses
cd tinyexpenses
cargo build --release
SECRET_KEY=<32-char secret key> ./target/release/tinyexpenses --bind <IP:PORT> --db <db path>- Yearly report with category totals and balance
- Monthly report optimized for mobile view
- Fast expense append form with search
- Budget planning (expected vs actual spending)
- Savings envelopes for tracking goals
- File-based database (CSV + TOML)
- Rolling logs for errors and suspicious activity
- API endpoint for adding expenses
- Simple account settings (currency, password, API token)
All user data is stored as plain files:
- CSV – expenses and income
- TOML – configuration
Advantages:
- easy backups (git, rsync, etc.)
- manual editing if needed
- no database server required
This also makes the system easier to audit.
TinyExpenses is designed to keep budgeting simple. A typical workflow looks like this:
- Define categories
- Add expenses and income
- Review reports
- (Optional) plan your yearly budget
You should be able to maintain your budget in a few seconds per transaction.
The system uses four main categories:
- Income – salary, freelance work, refunds, gifts, etc.
- Needs – essential expenses such as rent, food, transport, utilities
- Wants – non-essential spending such as restaurants, hobbies, subscriptions
- Savings – money set aside for long-term goals
Each entry in the system belongs to a subcategory, which itself belongs to one of the four main categories.
Example:
| Subcategory | Main category |
|---|---|
| Salary | Income |
| Groceries | Needs |
| Rent | Needs |
| Coffee | Wants |
| Vacation | Savings |
You define subcategories once and then reuse them when adding entries.
To add a new entry:
- Open Append report
- Select a subcategory
- Enter the date
- Enter the value
- (Optional) add a description
Each subcategory marked as an expense will decrease the account's yearly balance. Categories marked as income will increase it.
You can override this behavior by entering a negative value in the amount field (using “-”).
This is useful for cases like reimbursements. For example, if you made a purchase and later received a cashback, you can first log the expense, then log the compensation with a negative amount. The balance will reflect the net amount, while both entries remain visible in the records.
TinyExpenses provides two report views.
The yearly report is the main overview of your finances.
It shows:
- all transactions for the year
- totals per category
- total income
- total expenses
- current balance
This is the best place to review your full financial picture.
The monthly report shows the same data but grouped by month.
It is designed for quick review and works better on mobile devices.
All expenses are stored in a CSV file.
You can modify them in two ways:
- Using Edit report in the web interface
- Editing the CSV file directly
Editing the file manually is safe because the system uses a simple file-based structure.
The Plans module allows you to define expected income and expenses for the year.
The application will compare expected values vs actual values.
This makes it easy to detect:
- overspending
- unexpected expenses
- additional income
Savings can be separated into logical "envelopes".
Even if all money is in one bank account, envelopes allow you to track how much is already reserved for each goal.
Savings update automatically when entries belonging to the Savings category are added.
TinyExpenses exposes a simple API endpoint for adding expenses.
This allows integration with external tools such as:
- mobile shortcuts
- scripts
- automation tools
- personal finance bots
The endpoint requires an API token generated in account settings.
Example payload:
PUT /api/v1/<login>/report/append
Headers:
X-API-Key: <token>
Content-Type: application/json
Body:
{
"subcategory": "Coffee",
"date": "2026-03-12",
"value": "-12.3",
"description": "New beans in town!"
}
Each user account is stored in a directory.
Typical structure:
accounts/
user1/
year/
categories.csv
report.csv
plans.csv
savings.toml
config.toml
This design allows:
- easy backups
- manual editing
- version control using git
No database server is required.