The Ledger
Progress Map
{% include 'includes/ledger_nav.html' %}
{% with messages = get_flashed_messages(with_categories=true) %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endwith %} {% if just_advanced %}
Milestone advancement → now working on {{ just_advanced.title }}.
{% endif %}

One milestone at a time has focus. Earlier ones are done. Later ones are visible but not pressuring. Edit, reorder, add, or remove anytime — the sequence is yours.

    {% for m in milestones %}
  1. {# Header row: position + title + status glyph + drag handle #}
    {% if m.status == 'complete' %}✓ {% elif m.status == 'current' %}● {% else %}{{ m.position }} {% endif %}

    {{ m.title }}

    {% if m.status == 'complete' %} completed {{ (m.completed_at or '')[:10] }} {% elif m.status == 'current' %} current {% else %} locked {% endif %}
    {# Progress (current milestone only — biggest visual) #} {% if m.status == 'current' %}
    {{ m.progress.label }}
    {% if m.progress.percent is not none %}
    {{ '{:.1f}'.format(m.progress.percent) }}% to goal
    {% endif %} {% if m.condition_type in ('account_balance_ge', 'liquid_savings_months') and m.params %}
    Tracking {% if m.condition_type == 'account_balance_ge' %} account {{ m.params.account_slug or m.params.account_id }} {% else %} accounts {{ (m.params.account_slugs or ['checking','savings']) | join(', ') }} {% endif %}
    {% endif %}
    {# Contribute widget — only when target is a savings account (i.e., not 'checking'). Money in checking is operating capital; the goal should be funded from a deliberate transfer into a separate savings account. #} {% set target_slug = m.params.account_slug if m.condition_type == 'account_balance_ge' else None %} {% if target_slug and target_slug != 'checking' %} {% set target_acct = liquid_accounts | selectattr('slug', 'equalto', target_slug) | list %} {% if target_acct %}
    Contribute
    from {{ target_slug }}

    This will record a real account transfer (two snapshots — source down, destination up). Do the actual bank transfer too, then this and your bank stay in sync.

    {% endif %} {% elif target_slug == 'checking' %}

    Heads-up: this milestone is tracking your checking balance, but checking is operating capital — every dollar there is earmarked for upcoming bills, not goal savings. To make this a real "set money aside" milestone:

    1. Create a savings account in Accounts (e.g., name "Buffer", account type savings)
    2. Edit this milestone (Edit button below) → change account_slug from checking to your new savings slug
    3. A Contribute widget will appear here so you can deliberately move money toward the goal
    {% endif %} {# Sub-progress chips for the Debt-free milestone #} {% if m.condition_type == 'total_debt_zero' %}
    {# Completed kills first (from accounts table) #} {% for d in avalanche %} {% if loop.first %} {{ d.name }} {% else %} {{ d.name }} {% endif %} {% endfor %}

    Current target highlighted teal. Future targets in avalanche order to the right. As each dies the cascade carries forward — see projection.

    {% endif %} {% endif %} {# Why-paragraph #} {% if m.status == 'current' %}

    {{ m.why_text }}

    {% else %}
    why →

    {{ m.why_text }}

    {% endif %} {# Action buttons — confirm prompts use tojson so titles with apostrophes (Lindsay's exit ramp) don't break the JS string. #} {% if m.status == 'current' %}
    {% elif m.status == 'complete' %}
    {% else %}
    {% endif %} {# Inline edit form (hidden by default) #}
  2. {% endfor %}
{# ===== Add new milestone ===== #}
+ Add a milestone

Most people use the default template and customize as they go. You can also build your own from scratch.

{# ===== Recent milestone events ===== #} {% if recent_events %}
// Recent milestone events
{% for e in recent_events %} {% endfor %}
{{ e.created[:10] }} {{ e.milestone_title }} {{ e.event_type }}
{% endif %}
{% include 'includes/today_panel.html' ignore missing %} {% include 'includes/active_timer_strip.html' ignore missing %}