treeline
Personal finance should be personal.
An open source, local-first finance app. Built on DuckDB.
I tried a few different finance apps and, while they brought convenience, they all lacked something—because the way I wanted to view my money didn't match The App's opinion of how I was supposed to view my money.
I want to tinker. I want to ask questions of my data that no product manager anticipated. I want my tools to grow with me as my needs change.
So I built Treeline.
Smart transaction management
Tag transactions with a keystroke. Set up rules to categorize automatically. Split transactions, hide duplicates, search across everything.
What you get
- A desktop app for Mac, Windows, and Linux
- Open source code you can inspect and audit
- Your data in a local DuckDB database
- Bank sync via SimpleFIN or Lunch Flow, or CSV import
- Quick tagging with customizable rules
- A plugin system for extending functionality
- Optional database encryption
- No account required, no subscription
Plugins
Extend Treeline with plugins. Add budgeting, subscription tracking, savings goals, cash flow projections, and more. Or build exactly what you need—the SDK gives you full access to your data.
Budget
Track spending against tag-based budget categories with rollovers.
Emergency Fund
See how long your emergency fund would last based on your actual spending patterns.
Savings Goals
Set savings targets and track your progress toward each goal.
Subscriptions
Automatically detects recurring charges from your transaction history.
Cash Flow
Plan ahead by scheduling expected income and expenses.
Net Worth Tracker
SoonTrack your total net worth over time. See how your assets and liabilities change month to month.
FIRE Calculator
SoonCalculate your path to financial independence based on your actual spending and savings rate.
Go deeper
Your data is a standard DuckDB file. When you want to ask questions no app anticipated, use the built-in SQL editor—or query directly from the terminal, a Jupyter notebook, or any tool that speaks SQL.
SELECT
dayname(transaction_date) AS day,
COUNT(*) AS transactions,
SUM(-amount) AS total_spent
FROM transactions
WHERE amount < 0
GROUP BY dayofweek(transaction_date), day
ORDER BY dayofweek(transaction_date) | day | transactions | total_spent |
|---|---|---|
| Sunday | 47 | $312.84 |
| Monday | 89 | $567.23 |
| Tuesday | 72 | $445.91 |
| Wednesday | 68 | $398.45 |
| Thursday | 81 | $523.67 |
| Friday | 124 | $891.32 |
| Saturday | 95 | $634.18 |
Get treeline
treeline is in beta. Download the app and join Discord to share feedback.