{% extends "base.html" %} {% block content %}
Income
${{ total_income | money }}
Spent
${{ (total_spending + total_bills) | money }}
Saved to Funds
${{ total_sinking | money }}
{{ 'Left Over' if net >= 0 else 'Over Budget' }}
${{ net | abs | money }}
{% if month_summary %}
How's it going?
{% for line in month_summary %}
{{ line | bold_md }}
{% endfor %}
{% endif %} {% if total_income > 0 %} {% set spent_pct = [(total_spending + total_bills) / total_income * 100, 100] | min | int %} {% set sinking_pct = [total_sinking / total_income * 100, 100 - spent_pct] | min | int %}
Where did the money go? ${{ total_income | money }} income this month
Spent {{ spent_pct }}% Saved {{ sinking_pct }}%
{% endif %} {% if spending_by_cat %}
{{ month_name }} Spending
{% for cat, amt in spending_by_cat | dictsort(by='value', reverse=true) %}
{{ cat }} ${{ "%.0f" | format(amt) }}
{% endfor %}
{% endif %}

Income

manage →
{% if income_by_stream %} {% for s in income_streams %} {% set amt = income_by_stream.get(s.name, 0) %} {% endfor %}
{{ s.name }} {{ s.owner }} ${{ amt | money }}
Total · {{ year }} YTD ${{ "%.0f"|format(income_ytd_total) }} ${{ total_income | money }}
{% else %}

No income logged yet. Log income →

{% endif %}

Bills This Month

calendar →
{% if monthly_bills %} {% for b in monthly_bills %} {% endfor %}
{{ b.name }} day {{ b.due_day }} {% if b.amount %}${{ b.amount | money }}{% else %}{% endif %}
Total ${{ total_bills | money }}
{% else %}

No bills this month. Manage bills →

{% endif %}
{% if sinking_contributions %}

Saved to Funds

manage →
{% for name, amt in sinking_contributions.items() %} {% endfor %}
{{ name }} ${{ amt | money }}
Total ${{ total_sinking | money }}
{% endif %}
{% if cash_accounts %}

Account Balances

manage →
{% for a in cash_accounts %} {% endfor %}
{{ a.name }} {{ a.type or '' }} ${{ (a.balance or 0) | money }}
Total Cash ${{ total_cash | money }}
{% else %}

Account Balances

No accounts added yet. Add accounts →

{% endif %}

Spending by Category

all transactions →
{% if spending_by_cat %} {% set max_spend = spending_by_cat.values() | max %} {% for cat, amt in spending_by_cat | dictsort(by='value', reverse=true) %} {% set budgeted = budgeted_by_cat.get(cat, 0) %} {% set over = budgeted > 0 and amt > budgeted %} {% endfor %}
CategoryBudgetedActual
{{ cat }} {% if budgeted %}${{ budgeted | money }}{% else %}{% endif %} ${{ amt | money }} {% if over %} over{% endif %}
Total {% if budgeted_by_cat %}${{ "%.2f"|format(budgeted_by_cat.values()|sum) }}{% endif %} ${{ total_spending | money }}
{% else %}

No categorized transactions yet. Review transactions →

{% endif %}
{% if recent %}

Recent Transactions

view all →
{% for t in recent %} {% endfor %}
{{ t.date }} {{ t.description }} ${{ t.amount | money }} {{ t.category }}
{% endif %}
{% if budgeted_by_cat %}

Budget vs Actual — {{ month_name }}

{% endif %}
🧾 {{ year }} Tax Estimate
${{ tax_estimate.total | money }} estimated owed  ·  ${{ tax_set_aside | money }} set aside  ·  {% if tax_still_needed > 0 %} ${{ tax_still_needed | money }} still needed {% else %} fully covered ✓ {% endif %}
View Details →
{{ month_name }} {{ year }} — Net
${{ "%.2f"|format(total_income) }} income − ${{ "%.2f"|format(total_spending + total_bills) }} spent − ${{ "%.2f"|format(total_sinking) }} saved
{% if net >= 0 %}+{% endif %}${{ net | money }}
{% endblock %}