{% extends "ui/_layout.html" %} {% from "ui/_table_macros.html" import sort_header, pagination_footer with context %} {% 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. 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. #}
{# Free-text search across name / format / arch / source. Typing "freebsd" narrows the list to just the freebsd images. Carries the active sort + per_page through hidden inputs. #}
{% if sort.column != 'name' %}{% endif %} {% if sort.direction != 'asc' %}{% endif %} {% if page.per_page != per_page_choices[1] %}{% endif %} {% if q %} Clear Filtered by “{{ q }} {% endif %}
{{ sort_header('Name', 'name', sort, preserved) }} {{ sort_header('Content SHA', 'sha256', sort, preserved) }} {{ sort_header('Format', 'format', sort, preserved) }} {{ sort_header('Arch', 'arch', sort, preserved) }} {{ sort_header('Source', 'ref', sort, preserved) }} {% for u in unified %} {% set entry_src = u.sources|map(attribute='location')|first %} {% endfor %} {% if not unified %} {% endif %}
Status Action
{{ u.names[0] }} {% if u.sha256 %} {% else %} unset {% endif %} {{ u.format or "?" }} {% if u.arch %} {{ u.arch }} {% else %} {% endif %} {% 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.
{{ pagination_footer(page, preserved, label='images') }}
{# 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 %}