{% extends 'base.html' %} {% block title %}Stats studio · Stride{% endblock %} {% block head %}{% endblock %} {% block content %}
YOUR RUNNING / STATS STUDIO

Your runs. Your questions.

Write a query, explore the pattern, and inspect the runs behind it.

RUNNING QUERYA small language for a deeper look.
Checking query...Ctrl / Cmd Enter to run
{% if error %}{% endif %}
Whole-run metrics · {{ current_user.timezone }}
Lower pace values mean faster running.
Language reference & examples

Filter and compare

during last 6 months
where distance between 8 and 20 km
and pace <= 5:30 /km
and has cadence
and title contains "River"
sort by pace asc

Periods: days, weeks, calendar months, or YYYY-MM-DD to YYYY-MM-DD. Group by day, week or month. Comparisons: previous period or none. Operators: >, >=, <, <=, =, !=. Comments start with # on their own line.

Metrics · select up to six

{% for key, info in metrics.items() %}{% endfor %}

duration accepts h, min or s; distance accepts km or m. Use has / missing to select recorded sensor coverage.

Guided controls

Adjust the basic clauses without removing additional metrics and filters.

Show and
from runs during the last weeks, grouped by .
START WITHWeekly volumeLong-run progressionPace at similar heart rateRunning form
{% if results %}

{{ results.count }} matching {{ 'run' if results.count == 1 else 'runs' }}

{{ results.start }} – {{ results.end }} · {{ '%.1f'|format(results.distance) }} km{% if query.compare %}
Compared with {{ results.previous_start }} – {{ results.previous_end }} · {{ results.prior_count }} runs{% endif %}

{% if not results.count %}

No runs match this question.

Try a longer period or widen the distance and heart rate filters.

{% else %}
{% for card in results.cards %}
{{ card.label }}
{{ card.value }}{{ card.unit }}
{% if query.compare %}

Previous: {{ card.previous }} {{ card.unit }}{% if card.delta %} · {{ card.delta }} {{ 'sec/km' if card.key == 'pace' else card.unit }}{% endif %}

{% endif %}

{{ card.coverage }} of {{ results.count }} runs with usable data

How this is calculated

{{ card.definition }}{% if card.key in ('cadence','power','ground_contact','stride_length') %} Coverage counts runs, not sensor recording time.{% endif %}

{% endfor %}
TRENDS / {{ query.group|upper }}

Your question over time

Solid: current · Dashed: previous
{% for card in results.cards %}

{{ card.label }} {{ card.unit }}

{% endfor %}

Select a current-period point to see its contributing runs below. Missing data leaves a gap; comparison runs are aligned by elapsed days.

{% endif %}
BEHIND THE NUMBERS

Contributing runs

{% for card in results.cards %}{% endfor %}{% for row in results.rows %}{% for value in row['values'] %}{% endfor %}{% else %}{% endfor %}
RUN / LOCAL DATEDISTANCE{{ card.label|upper }} · {{ card.unit }}
{{ row.title }}
{{ row.date }}
{{ row.distance }} km{{ value }}
No matching runs.
Page {{ results.page }} of {{ results.pages }} · up to 25 runs per page{% if results.page > 1 %}Previous{% endif %}{% if results.page < results.pages %}Next{% endif %}
{% endif %}
{% endblock %} {% block scripts %}{% endblock %}