Managing personal finances shouldn't require a $15/month app. Here's how to build a powerful finance dashboard with Python in under 100 lines.
Why Python for Personal Finance?
- Free forever — no subscription, no ads, no data selling
- Fully customizable — track what matters to you
- Privacy-first — your data stays on your machine
- Extensible — add crypto, stocks, or anything else
What We're Building
A CLI finance tracker that:
- Logs income and expenses by category
- Calculates monthly savings rate
- Shows spending by category (with ASCII chart)
- Projects annual savings at current rate
The Code
#!/usr/bin/env python3
"""
Personal Finance Dashboard — 0€ budget
Track income, expenses, and savings in your terminal
"""
import json
import os
from datetime import datetime
from collections import defaultdict
DATA_FILE = "finance_data.json"
def load_data():
if os.path.exists(DATA_FILE):
with open(DATA_FILE) as f:
return json.load(f)
return {"transactions": []}
def save_data(data):
with open(DATA_FILE, "w") as f:
json.dump(data, f, indent=2)
def add_transaction(data):
print("\n📝 Add Transaction")
t_type = input("Type (income/expense): ").strip().lower()
if t_type not in ["income", "expense"]:
print("❌ Invalid type")
return
amount = float(input("Amount (€): "))
category = input("Category (e.g. Food, Rent, Salary, Freelance): ").strip()
note = input("Note (optional): ").strip()
data["transactions"].append({
"date": datetime.now().strftime("%Y-%m-%d"),
"type": t_type,
"amount": amount,
"category": category,
"note": note
})
save_data(data)
print("✅ Transaction saved!")
def show_dashboard(data, month=None):
if not data["transactions"]:
print("📭 No transactions yet. Add some first!")
return
if month:
txs = [t for t in data["transactions"] if t["date"].startswith(month)]
else:
month = datetime.now().strftime("%Y-%m")
txs = [t for t in data["transactions"] if t["date"].startswith(month)]
if not txs:
print(f"📭 No transactions for {month}")
return
income = sum(t["amount"] for t in txs if t["type"] == "income")
expenses = sum(t["amount"] for t in txs if t["type"] == "expense")
savings = income - expenses
savings_rate = (savings / income * 100) if income > 0 else 0
print(f"\n{'='*45}")
print(f"💰 FINANCE DASHBOARD — {month}")
print(f"{'='*45}")
print(f"📈 Income: €{income:>10.2f}")
print(f"📉 Expenses: €{expenses:>10.2f}")
print(f"💚 Savings: €{savings:>10.2f} ({savings_rate:.1f}%)")
print(f"{'='*45}")
categories = defaultdict(float)
for t in txs:
if t["type"] == "expense":
categories[t["category"]] += t["amount"]
if categories:
print("\n📊 Expenses by Category:")
max_val = max(categories.values())
for cat, val in sorted(categories.items(), key=lambda x: -x[1]):
bar_len = int(val / max_val * 20)
bar = "█" * bar_len + "░" * (20 - bar_len)
pct = val / expenses * 100 if expenses > 0 else 0
print(f" {cat:<15} {bar} €{val:.0f} ({pct:.0f}%)")
if savings_rate > 0:
annual = savings * 12
print(f"\n🚀 At this rate: €{annual:.0f} saved/year")
print()
def main():
data = load_data()
while True:
print("\n💼 Personal Finance Dashboard")
print("1. Add transaction")
print("2. View dashboard (current month)")
print("3. View all months")
print("4. Exit")
choice = input("\nChoice: ").strip()
if choice == "1":
add_transaction(data)
elif choice == "2":
show_dashboard(data)
elif choice == "3":
months = sorted(set(t["date"][:7] for t in data["transactions"]))
for m in months:
show_dashboard(data, m)
elif choice == "4":
print("👋 Goodbye!")
break
if __name__ == "__main__":
main()
Running It
python3 finance_dashboard.py
No pip install. No API keys. Just Python's standard library.
Sample Output
=============================================
💰 FINANCE DASHBOARD — 2026-03
=============================================
📈 Income: €3,200.00
📉 Expenses: €1,847.00
💚 Savings: €1,353.00 (42.3%)
=============================================
📊 Expenses by Category:
Rent ████████████░░░░░░░░ €800 (43%)
Food ██████░░░░░░░░░░░░░░ €350 (19%)
Transport ████░░░░░░░░░░░░░░░░ €200 (11%)
Freelance tools ██░░░░░░░░░░░░░░░░░░ €97 (5%)
Other ████████░░░░░░░░░░░░ €400 (22%)
🚀 At this rate: €16,236 saved/year
Level Up: Add Crypto + Freelance Income
Want to track your crypto portfolio alongside regular finances? Add a CoinGecko API call (free tier) for live prices.
For freelancers specifically, the system works best when you:
- Track income by client/project
- Separate business vs personal expenses
- Calculate your effective hourly rate vs target
I built a complete Notion-based version that does all this automatically — see below.
Next Steps
- Freelancer income? — Track client payments by project
- Investor income? — Add dividend/staking income categories
- Multiple currencies? — Add ECB exchange rate API (free)
The 80/20 rule applies here: this 100-line script covers 80% of what any paid app offers.
Want a pre-built system? The Freelancer OS Notion Template (€19) includes a complete income tracker, client CRM, and financial dashboard — no Python required.
Or automate your entire freelance workflow with the AI Power Kit — 40 Prompts for Freelancers (€14.99).
Top comments (0)