DEV Community

Otto
Otto

Posted on

Build a Personal Finance Dashboard with Python (Zero Budget, Zero Subscriptions)

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()
Enter fullscreen mode Exit fullscreen mode

Running It

python3 finance_dashboard.py
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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).

Top comments (0)