{# ============= header ============= #}
{% with messages = get_flashed_messages(with_categories=true) %}
{% for category, message in messages %}
{{ message }}
{% endfor %}
{% endwith %}
{# ============= total debt + cash runway side by side ============= #}
{# total debt card #}
Total Debt
${{ '{:,.2f}'.format(total_debt) }}
30-day Δ
{% if delta_30 is none %}
—
{% elif delta_30 < -1 %}
↓ ${{ '{:,.2f}'.format(-delta_30) }}
{% elif delta_30 > 1 %}
↑ ${{ '{:,.2f}'.format(delta_30) }}
{% else %}
— $0
{% endif %}
Interest / mo
${{ '{:,.2f}'.format(interest_burn) }}
Debt-free est.
{{ projection.debt_free_date or '—' }}
{# cash runway card #}
Cash Runway
{% if runway.checking_balance is none %}
{% else %}
${{ '{:,.2f}'.format(runway.checking_balance) }}
checking
Next payday {{ runway.next_payday }} ({{ runway.days_to_next_payday }}d)
Obligations ${{ '{:,.2f}'.format(runway.total_obligations) }}
Free to attack
${{ '{:,.2f}'.format(runway.free_to_attack) }}
{% if runway.obligations %}
{{ runway.obligations|length }} obligation{{ 's' if runway.obligations|length != 1 else '' }} between now and payday →
{% for o in runway.obligations %}
{{ o.description }} · {{ o.date }}
${{ '{:,.2f}'.format(o.amount) }}
{% endfor %}
{% endif %}
{% endif %}
{# ============= attack budget card (full width) ============= #}
Attack Budget
{% if budget.current_target %}
${{ '{:,.2f}'.format(budget.current_monthly) }} / mo →
{{ budget.current_target.name }}
@ {{ '{:.2f}'.format(budget.current_target.apr or 0) }}%
Watch the attack budget grow with each kill.
{% if budget.kill_sequence %}
{% for k in budget.kill_sequence %}
-
{{ k.account.name }}
est. kill: {{ k.projected_kill_month }} · then ${{ '{:,.0f}'.format(k.monthly_budget_after_kill) }}/mo to next target
${{ '{:,.2f}'.format(k.account.current_balance) }}
{% endfor %}
{% endif %}
{% else %}
All debts retired. The chart is clean.
{% endif %}
{# ============= pending confirmations ============= #}
{% if pending %}
Pending autopay confirmations ({{ pending|length }})
{% for p in pending %}
{{ p.account_name }}
· {{ p.tx_date }}
${{ '{:,.2f}'.format(p.amount) }}
{% endfor %}
Confirm in payday session →
{% endif %}
{# ============= avalanche debts table ============= #}
| Account |
Balance |
APR |
Minimum |
Allocation |
Next |
{% for d in avalanche %}
|
{{ d.name }}
{% if d.status == 'unknown' %}⚠{% endif %}
{% if d.stale_snapshot %}·{% endif %}
|
${{ '{:,.2f}'.format(d.current_balance) }} |
{% if d.apr %}{{ '{:.2f}'.format(d.apr) }}%{% else %}—{% endif %} |
${{ '{:,.2f}'.format(d.minimum_payment or 0) }} |
{% if d.attack_allocation %}${{ '{:,.0f}'.format(d.attack_allocation) }}{% else %}—{% endif %} |
{{ d.autopay_next_date or '—' }} |
{% endfor %}
{# ============= coming up (next 30) ============= #}
{% if coming_up %}
// Coming up (next 30 days)
{% for e in coming_up %}
| {{ e.event_date }} |
{{ e.description }} |
{% if e.direction == 'inflow' %}+${{ '{:,.2f}'.format(e.amount) }}
{% else %}−${{ '{:,.2f}'.format(e.amount) }}
{% endif %}
|
{% endfor %}
{% endif %}
{# ============= this-month activity ============= #}
// This month's activity
{% if this_month.n %}
Logged: ${{ '{:,.2f}'.format(this_month.s) }}
in debt payments across {{ this_month.n }} transaction{{ 's' if this_month.n != 1 else '' }}.
{% if last_payment %}
Last: ${{ '{:,.2f}'.format(last_payment.amount) }}
to {{ last_payment.account_name }} on {{ last_payment.tx_date }}.
{% endif %}
Full history →
{% else %}
Nothing logged this month yet.
{% endif %}
{# ============= page footer ============= #}
{# Today panel + active timer strip — ship continuity #}
{% include 'includes/today_panel.html' ignore missing %}
{% include 'includes/active_timer_strip.html' ignore missing %}