VOOZH about

URL: https://dev.to/ottoaria/build-a-personal-finance-dashboard-with-python-zero-budget-zero-subscriptions-1i0j

⇱ Build a Personal Finance Dashboard with Python (Zero Budget, Zero Subscriptions) - DEV Community


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:

  1. Track income by client/project
  2. Separate business vs personal expenses
  3. Calculate your effective hourly rate vs target

I built a complete Notion-based version that does all this automatically — see below.

Next Steps

  1. Freelancer income? — Track client payments by project
  2. Investor income? — Add dividend/staking income categories
  3. 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).