{% extends "ui/_layout.html" %} {% block title %}Images - bty-web{% endblock %} {% block subnav %} {% endblock %} {% block intro %} {% from "ui/_intro_box.html" import render as intro_box %} {% call intro_box() %} The image catalog. Each entry references a URL (https or oras) the live env flashes from. v0.40+: bty-web doesn't host image bytes -- withcache holds them when warm, the upstream origin serves them when cold. The header carries three add-paths: Add image (a single URL), Upload catalog (a catalog.toml), and Fetch latest catalog (pull the bty release catalog). {% endcall %} {% endblock %} {% block content %}
Images {# Single-entry add: http(s):// trusts the upstream bytes on first flash; oras:// resolves the OCI manifest at add time. ``type="text"`` not ``url`` since browsers reject oras:// under HTML5 URL validation; the server-side Pydantic still validates. The most common add-path lives first so the operator's eye lands on it. #}
{% for u in unified %} {% set entry_src = u.sources|map(attribute='location')|first %} {% endfor %} {% if not unified %} {% endif %}
Name Content SHA Format Source Status Action
{{ u.names[0] }} {% if u.sha256 %} {% else %} unset {% endif %} {{ u.format or "?" }} {% if entry_src %} {% if entry_src.startswith('oras://') %} {% else %} {% endif %} {{ entry_src }} {% endif %} {% if entry_src %} {% endif %}
No catalog entries yet. Use Add image, Upload catalog, or Fetch latest catalog in the header above.
{# Catalog event slice (entry adds / deletes / imports). #} {% with events=image_events, title="Recent Events", link_to_full="/ui/events?subject_kind=catalog", card_id="images-activity" %} {% include "ui/_events_card.html" %} {% endwith %} {% endblock %}