Skip to content

Render every page into one shared frame #73

Description

@iderex

Depends on the landing page issue.

Five issues in this plan already say that something appears on every page. #51
puts the affiliation notice in the template so that a new page cannot ship
without it. #69 references the icon from the head of every page. #72 puts the
policy element in every page. #14 refuses a page with no lang attribute and no
title. #48 has to be reachable from wherever a reader is standing. Nothing in
the plan lands the thing all five of them write into.

The site as served has no frame at all, because it has one page and one file:

curl -sS https://flowfin.dev/ | grep -o -E 'href="[^"]*"' | sort -u
href="design-system.html"

Run 2026-08-08. One relative link on the landing page is the whole of the
navigation, and the second page links nothing back.

This issue lands one template that every page is rendered into, and it owns the
positions rather than the contents. What goes in each position is the issue that
already asks for it, so this one closes without deciding what the notice says or
what the policy permits.

The positions.

The head, which carries the character encoding, the viewport, the title and the
description for that page, the icon reference and the policy element. Every one
of those is a thing a page cannot be correct without and none of them is
something a page author should be able to forget.

A link that jumps a keyboard reader past the navigation to the content. On a
page with a navigation this is the difference between reaching the text with one
key and reaching it with as many keys as there are links, and it costs one
element.

The navigation itself, listing the pages a reader can reach. A set of pages with
no way between them is a set of files rather than a site, and the plugin pages in
particular are reached today by nothing at all.

The footer, which carries the affiliation notice, the privacy page and the legal
notice, and which is the reason those three are one link away from everywhere
instead of one link away from the landing page.

The frame is one file. A page that renders its own head is a page that will
carry a different one, and the whole value here is that the answer to "does
every page have this" is a property of one file rather than a search.

Every reference the frame writes is absolute from the site root, which is #68's
rule, and it is the frame that makes the rule cheap to hold: the plugin pages
sit one level down and the not-found page is served in response to a URL of any
depth.

Done when

Every produced page is rendered through one frame file and no page renders its
own head; a test that removes the affiliation notice from the frame reds the
invariant gate on every produced page rather than on one; every produced page
carries a link to the content that is the first focusable element, shown by the
headless run; the footer links resolve from a page at every depth the site
produces, including the not-found page; and adding a page to the build requires
no new frame.

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