{% from "components.html" import closer, scrim with context %} {% macro text(name, label, value, hint="", placeholder="", required=true, error="required", pattern="") -%} {{ label }} {% if required %}{{ error }}{% endif %} {% if hint %}{{ hint }}{% endif %} {%- endmacro %} {{ scrim("/images") }} Register image {{ closer("/images") }} A catalog row is immutable — a new build is a new version, and nothing here is ever edited. {{ text("id", "Image id", entry.id, "letters, digits, _ and -; the id is never reused", "image_epsilon") }} {{ text("name", "Name · optional", entry.name, placeholder="epsilon", required=false) }} {{ text("version", "Version", entry.version, placeholder="2026.09.2") }} {{ text("digest", "Digest", entry.digest, "the runner refuses a downloaded file with any other digest", "sha256:…", error="required · sha256 of the qcow2", pattern="sha256:[0-9a-f]{64}") }} {{ text("url", "Source url", entry.url, "https only, no credentials — the API stores it and never fetches it", "https://") }} {{ text("size", "Size · optional", entry.size, placeholder="4.2 GiB", required=false) }} {{ text("built", "Built · optional", entry.built, placeholder="YYYY-MM-DD", required=false) }} size, build date and name are whatever the operator states — the image may come from anyone; leave them empty when unknown {% if notice %}{{ notice }}{% endif %}
A catalog row is immutable — a new build is a new version, and nothing here is ever edited.
{{ notice }}