{% extends "base.html" %} {% block content %}
{% if kept %} {# Kept boards render FIRST and look different on purpose: they are durable operator-facing things (the agent link board, standing reports) and the point of the lane is that they cannot be lost in a feed that turns over every day. No countdown — they have no expiry to advertise. #}

Kept · no expiry · {{ keep_marker }}

{% for b in kept %}
{% if b.thumb_url %} {% elif b.has_index %}
▦ page
{% elif b.kinds.video %}
▶ video
{% elif b.kinds.audio %}
♪ audio
{% else %}
◆ files
{% endif %} ★ kept
{{ b.name }}
{{ b.count }} item{{ '' if b.count == 1 else 's' }} · kept · ⬇ zip
{# Still no × here — a one-click wipe next to the durable stuff is a footgun. But "deliberate" must not mean "impossible from the UI", which is what it meant before: the only routes out were ssh or a hand-written API call. Release drops the sentinel and the board moves to the ephemeral lane, where the × already lives. Two deliberate acts, both reachable, and the first one is reversible. The confirm says "wipe it from there" rather than "let it expire" on purpose: releasing BUMPS the directory mtime, so the board's age resets and it survives another full TTL. Unkeep-and-wait is a 24h delay, not a delete. #}
{% endfor %}
{% if booths %}

Ephemeral · wiped {{ ttl_hours }}h after last activity

{% endif %} {% endif %} {% if not booths %} {% if not kept %}
No booths yet. Upload files above, or drop a folder into {{ data_dir }}.
{% endif %} {% else %}
{% for b in booths %}
{% if b.thumb_url %} {% elif b.has_index %}
▦ page
{% elif b.kinds.video %}
▶ video
{% elif b.kinds.audio %}
♪ audio
{% else %}
◆ files
{% endif %} {% if b.uploaded %}⬆ pickup{% endif %}
{{ b.name }}
{{ b.count }} item{{ '' if b.count == 1 else 's' }} · expires in {{ b.expires_in|dur }} · ⬇ zip
{% endfor %}
{% endif %} {% endblock %}