{% 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 %} {# A cover blurred inside the booth must be blurred here too, or the front page undoes the censoring the booth page applied. #} {% 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
{# There IS a × here now (operator, 2026-09-21). The old rule was release-then-find-it-in-the-other-lane, on the theory that two deliberate acts protect durable boards. In practice it protects nothing and costs a hunt: the board you just released is loose in a feed that turns over, and you have to go find it to finish the job you had already decided on. The protection now lives in the CONFIRMATION, not in the number of lanes you must traverse — this one names the booth and says the word KEPT, where the ephemeral × just asks. A deliberate act, one click, reachable. Release still exists and is still the reversible option. Note it 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, which is exactly why a direct × was worth adding. #} {# ⚠ BOTH OF THESE WERE position:absolute ON THE SAME CORNER, and `release` is the later sibling, so it painted over the × completely: measured 30x22 px of overlap on a 30px button, and elementFromPoint at the ×'s centre returned the release form. The × was unclickable from the day it shipped. One flex row, positioned once, instead of two independently guessed offsets — so neither control can drift back on top of the other when a label changes width. #}
{% 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 %} {% if b.marks_open %}? {{ b.marks_open }} open{% endif %}
{{ b.name }}
{{ b.count }} item{{ '' if b.count == 1 else 's' }} · expires in {{ b.expires_in|dur }} · ⬇ zip
{# Promote to the kept lane. The /keep route and the `booth keep` CLI verb both predate this button; until 2026-09-19 the UI could only RELEASE a kept booth, never keep an ephemeral one, so the round trip was only closed if you had a shell. Reversible, so no confirmation — the × next to it is the destructive one and keeps its prompt. #}
{% endfor %}
{% endif %} {% endblock %}