{% extends "base.html" %}{% block title %}Trance ยท {{ app_name }}{% endblock %} {% block body %}

๐ŸŒ€ Trance

Tones, a breath pacer, and a fixed length. Headphones on, on your side or your back โ€” not face-down, and not face-down in a hood. What this is and what is not watching you โ†’

{% if live %}

A sit is running โ€” {{ live.score_title }}, started {{ live.started_at|rel(now) }}.

๐ŸŒ€ back to it {% endif %} {#- ๐Ÿ”ด The left/right check is not decoration and it is not a formality. Binaural exists only as a difference between two ears: on one earbud each channel is a featureless sine and the effect is simply absent, while a speaker sums them into a real acoustic beat, which is a DIFFERENT stimulus. No API can tell โ€” destination.maxChannelCount reads 2 for a single AirPod and 8 on this machine. Only the human can answer. -#} {% if not channels_ok %}

First, one check

Three taps. Nothing is stored but the answer.

Play each one. If both sound like they are in the middle, or you only hear one, you are not set up for binaural โ€” use a speaker-safe score when there is one.

{% endif %}

Pick a sit

{% for s, sc in library.items() %} {% endfor %}

Length {% for m in lengths.get(slug, [30, 45, 60]) %} {% endfor %}

Ceiling is {{ ceiling }} minutes โ€” raise it in settings if you mean it.

Start โ†’

{% if recent %}

Recent sits

{{ t.real_sits }} of them ran twenty minutes or more, across {{ t.days }} day{{ '' if t.days == 1 else 's' }}.

{% for r in recent %} {#- โš ๏ธ NULL actual_seconds is an abandoned sit: nobody knows how long it played and the wall clock is not an answer. It prints as a dash, never as a number. -#} {% endfor %}
WhenScorePlannedActual
{{ r.started_at|local }} {{ r.score_title }} {{ r.planned_seconds|dur }}{% if r.actual_seconds is none %}โ€”{% else %}{{ r.actual_seconds|dur }}{% endif %} {{ r.outcome }}{% if r.interrupted_seconds %} ยท {{ r.interrupted_seconds|dur }} interrupted{% endif %}
{% endif %} {% endblock %} {% block scripts %}{% endblock %}