{% extends "base.html" %} {% block title %}Workouts · hevy2garmin{% endblock %} {% block head %} {% endblock %} {% block content %} {% if fetch_error %}
Failed to fetch workouts

{{ fetch_error }}. Check your Hevy API key in Settings.

{% endif %} {% for w in workouts %}
{{ w.title }} {% if w.status == 'uploaded' %} Uploaded {% if w.edited_since_sync %} Edited on Hevy {% endif %} {% elif w.status == 'matched' %} On Garmin{% if w.garmin_match and w.garmin_match.garmin_name %} as "{{ w.garmin_match.garmin_name }}"{% endif %} {% else %} Not on Garmin {% endif %}
{{ w.start_time[:10] }} at {{ w.start_time[11:16] }} · {{ w.exercises|length }} exercises
Hevy {% if w.garmin_match and w.garmin_match.garmin_id %} Garmin {% endif %} {% if w.status == 'uploaded' and w.edited_since_sync %} {% endif %} {% if w.status == 'uploaded' %} {% endif %}
{% for ex in w.exercises %} {% set normal_sets = ex.get('sets', [])|selectattr('type', 'equalto', 'normal')|list %} {% if normal_sets %} {% set weights = normal_sets|map(attribute='weight_kg')|select('number')|list %} {% set reps_list = normal_sets|map(attribute='reps')|select('number')|list %} {% set top_weight = weights|max if weights else 0 %} {% set top_reps = reps_list|max if reps_list else 0 %}
{{ ex.get('title') or ex.get('name', '?') }} {{ normal_sets|length }}x {{ "%.1f"|format(top_weight) }}kg ×{{ top_reps }}
{% endif %} {% endfor %}
{% if w.cal_info %}
Calories: {{ w.cal_info.total_kcal }} kcal
Duration: {{ w.cal_info.duration_min }} min
Avg HR: {{ w.cal_info.avg_hr }} bpm ({{ w.cal_info.hr_source }})
Weight: {{ w.cal_info.weight_kg }} kg
Age: {{ w.cal_info.age }}
VO2max: {{ w.cal_info.vo2max }}
Rate: {{ w.cal_info.kcal_per_min }} kcal/min
Total: {{ w.cal_info.total_kcal }} kcal ({{ w.cal_info.kcal_per_min }} × {{ w.cal_info.duration_min }})
Keytel Formula
kcal/min = (-95.7735 + 0.634 × {{ w.cal_info.avg_hr }} + 0.404 × {{ w.cal_info.vo2max }} + 0.394 × {{ w.cal_info.weight_kg }} + 0.271 × {{ w.cal_info.age }}) / 4.184
kcal/min = (-95.7735 + {{ "%.1f"|format(0.634 * w.cal_info.avg_hr) }} + {{ "%.1f"|format(0.404 * w.cal_info.vo2max) }} + {{ "%.1f"|format(0.394 * w.cal_info.weight_kg) }} + {{ "%.1f"|format(0.271 * w.cal_info.age) }}) / 4.184 = {{ w.cal_info.kcal_per_min }}
total = {{ w.cal_info.kcal_per_min }} × {{ w.cal_info.duration_min }} min = {{ w.cal_info.total_kcal }} kcal
HR · VO2max · Weight · Age
{% endif %} {% if hr_fusion_enabled and w.status in ('matched', 'uploaded') %}
Heart Rate Timeline (from Garmin watch)
Loading HR data from Garmin...
{% endif %}
{% if w.status == 'pending' %} {% endif %}
{% endfor %} {% if not workouts %}

No workouts found

Make sure your Hevy API key is set up in Settings.

{% endif %} {% if page_count > 1 %}
{% if page > 1 %} Prev {% else %} Prev {% endif %} Page {{ page }} of {{ page_count }} {% if page < page_count %} Next {% else %} Next {% endif %}
{% endif %} {% endblock %}