Skip to content

Put the visual anchor on the landing page #216

Description

@iderex

decisions/0016-whether-the-pages-carry-pictures.md is landed and decides that
the landing page carries one current image as the visual anchor, with the plugin
pages staying textual. Nothing on this board holds the work that record
authorises, and two open issues wait on it by description rather than by number.

The record names what it left open and calls those build questions:

sed -n '/^It also does not decide which page/,$p' decisions/0016-whether-the-pages-carry-pictures.md
It also does not decide which page the landing image sits on beyond naming the
landing page, what it shows, or what element carries it. Those are build
questions, and the element in particular is one another issue is waiting on: the
row comparing an image's stated size against the file it names has nothing on
the markup side until a page states one, and the mark referenced from the head
of every page states none.

Run 2026-08-30 at 951bcb1.

No produced page carries an image element

The build writes one image and no page states a size for it. Every page
references the mark from its head with a link element, and a link element states
no width and no height:

go run . build > /dev/null && grep -rl -i '<img' dist | wc -l
0
grep -o 'rel="icon"[^>]*' dist/index.html
rel="icon" href="/icon.svg" type="image/svg&#43;xml" /

Run 2026-08-30 at 951bcb1. The entity in the type is the frame escaping an
attribute value, and a browser reads it back as image/svg+xml.

What is waiting on this, and why neither of the two can produce it

The last condition of #85 is that the dimensions written into the output are read
from the image file rather than from a template. The row that would decide it
prints what it is waiting for and names no issue that holds the work:

go run . invariants | grep image-dimensions-match-the-file
  image-dimensions-match-the-file: not decided, waiting on the first page that states a size for an image, in #85. [...] This row starts deciding on the day a page states a size for an image, which is an element that carries one rather than a second reference to the same mark

Run 2026-08-30 at 951bcb1, elided for length. #69 puts the reference in the head
of every page and says in its own words that a picture on a page is outside what
it authorises. So the issue that needs the second side of that comparison cannot
build it, the issue that produced the first side may not, and the row goes on
printing that it has nothing to decide over a tree that does write an image.

The budget allows exactly one and no more

The row that counts the landing page's requests counts the mark in the head
together with the image elements in the body, so the page asks for one today
against a record that allows two:

sed -n '2116,2117p' internal/invariant/invariant.go
	found := len(imgElement.FindAllIndex(body, -1)) + len(iconLink.FindAllIndex(body, -1))
	if found <= budget.LandingImages {
grep -n 'LandingImages = ' internal/budget/budget.go
42:	LandingImages = 2
go run . invariants | grep '  landing-page-asks'
  landing-page-asks-for-at-most-two-images: ok, 1 file(s) of every page the build produced

All run 2026-08-30 at 951bcb1. One image element in the body of that page is
inside the budget and a second one is not, so the count bounds this work rather
than being something to check after it.

What this issue answers before it can be built

What the picture shows. The record leaves it open and writes the constraint the
answer has to meet in its own timing argument: a screenshot is worth taking when
it shows something a reader can go and get, and a picture of software with no
release is work in progress presented as a product. Three of the twelve have a
finished release behind them:

jq -r '.repositories | to_entries[] | "\(.key)\t\(.value.finished)"' data/releases.json | sort -k2 -rn
Flowfin/jellyfin-plugin-sso	29
Flowfin/jellyfin-plugin-stats	1
Flowfin/jellyfin-plugin-requests	1
Flowfin/jellyfin-plugin-whisper-subtitles	0
[...]

Run 2026-08-30 at 951bcb1, elided for length. So the subject comes from those
three rather than from the twelve, and the reading that picks one belongs here.

The image itself comes from outside this tree. A photograph of a plugin is taken
against a running server, which is not something this repository builds or can
produce, so this issue lands the plumbing and the choice and carries the asset
rather than generating it. That is the one part of this work that does not
happen here, and it is named rather than discovered when the change is attempted.

The staleness the record argues about does not disappear at one image. What keeps
the single picture current is a person, and this issue says so rather than
implying that something checks it.

The means

Go and the templates the generator already renders every other page with, and the
asset in the tree beside the mark. The row that refuses an image with no usable
dimensions exists, the row that refuses a produced image with no alternative text
covers every produced page, and the byte budget is already counted over what the
build writes, so the artefact is testable by the suite that is here and needs no
language, runtime or dependency this tree does not carry. The format is decided
with the picture rather than inherited from the mark: the mark is an SVG because a
typographic mark stays text, and a photograph of software is not text, so a raster
format is what it takes and the byte budget is what bounds its size.

Done when

go run . build writes the landing image into the output; the produced landing
page carries it as an image element whose width and height are read from the image
file rather than typed beside it; the element carries alternative text saying what
the picture shows rather than that it is a picture; the landing page passes the
request count with the mark counted beside it and still fits the markup and
stylesheet budgets; the subject of the picture is written down here with the
reading that chose it; and what keeps it current is named rather than left to be
remembered.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions