diff --git a/content/assets/BUDGET.md b/content/assets/BUDGET.md
new file mode 100644
index 0000000..6b00994
--- /dev/null
+++ b/content/assets/BUDGET.md
@@ -0,0 +1,68 @@
+# Phase 7.4 — asset weight budget
+
+Measured 2026-10-26 on `.13` with `stat -c%s` and `gzip -9`. Every number below
+is a measurement of a file that is in this repository, not an estimate.
+
+## What is in the assets directory
+
+| Group | Files | Raw | Gzip (`-9`) |
+|---|---|---|---|
+| Diagrams (`diagrams/*.svg`) | 8 | 51,729 B | 8,943 B |
+| Code exhibits (`code/*.as`, `.js`, `.php`, `.ts`, `.hpp`, `.nix`) | 6 | 8,161 B | 2,989 B |
+| Client wall data (`logos/clients.yaml`) | 1 | 3,912 B | 1,288 B |
+| **Served payload total** | **15** | **63,802 B** | **13,220 B** |
+| Manifests and READMEs (build-time only, never served) | 5 | 15,955 B | — |
+
+## Per-asset
+
+| File | Raw | Gzip |
+|---|---|---|
+| `diagrams/01-homelab-topology.svg` | 7,079 | 2,169 |
+| `diagrams/02-agent-architecture.svg` | 6,027 | 1,971 |
+| `diagrams/03-rag-pipeline.svg` | 7,010 | 2,043 |
+| `diagrams/04-edge-architecture.svg` | 6,896 | 2,163 |
+| `diagrams/05-distributed-audio.svg` | 6,833 | 1,997 |
+| `diagrams/06-media-pipeline.svg` | 5,694 | 1,718 |
+| `diagrams/07-cost-resource-engineering.svg` | 6,151 | 2,023 |
+| `diagrams/08-era-timeline.svg` | 6,039 | 1,930 |
+| `code/01-actionscript-class.as` | 958 | 495 |
+| `code/02-js-easing-core.js` | 1,848 | 584 |
+| `code/03-php-encode-op.php` | 2,295 | 765 |
+| `code/04-typescript-service-layer.ts` | 1,078 | 482 |
+| `code/05-embedded-cpp-interface.hpp` | 788 | 419 |
+| `code/06-nix-derivation.nix` | 1,194 | 724 |
+
+Rasters: **zero.** There are no PNG, JPEG, WebP or font files in this phase.
+That is a design outcome, not an oversight — every diagram is text-based SVG and
+every code exhibit is text, so the "optimise every image" requirement has no
+image to optimise yet. Phase 7.4 screenshots are deferred (see below).
+
+## The budget
+
+| Rule | Limit | Worst case today |
+|---|---|---|
+| Any single diagram | ≤ 7.5 KB raw / ≤ 2.5 KB gzip | 7,079 B / 2,169 B |
+| Any single code exhibit | ≤ 3 KB raw / ≤ 1 KB gzip | 2,295 B / 765 B |
+| Diagrams on one page | ≤ 2 | 2 (14.1 KB raw) |
+| Asset payload per page, gzipped | ≤ 12 KB | 4.3 KB (two diagrams + one exhibit) |
+| Web fonts | 0 | 0 — system font stack only |
+| JS required by any asset | 0 | 0 — SVG carries its own palette |
+
+Worst realistic page: an L2 page with two diagrams and one code exhibit is
+14,089 B raw, about **4.3 KB over the wire** after gzip and before the HTML, CSS
+and template overhead. The whole 15-file asset set is 13.2 KB gzipped, so even a
+page that loaded every one of them would stay inside a single small image's
+budget.
+
+## What is not yet measured, and why
+
+| Item | Status | Why |
+|---|---|---|
+| Full page weight (HTML + CSS + assets) | **not measured** | No page exists yet: Phase 2 owns the templates |
+| Lighthouse ≥ 95 / 95 | **not measured** | Needs a rendered page (Phase 2) served behind the edge (Phase 3). Nothing in this phase can stand in for it |
+| Screenshots and recordings (7.4) | **deferred** | The agent console is Phase 5 and the TUIOS fleet session has to be real work, not staged. Recording a console that does not exist would be a fabrication |
+| Home Assistant / Snapcast stills | **deferred** | Same reason: needs a live system and a judgement about whether a still adds what diagram 4 and diagram 5 already show |
+
+These are recorded as open rather than asserted. DoD items 4 and 5 cannot be
+closed until Phase 2 and Phase 3 produce a page to measure, and the measurement
+must be taken by whoever holds that page.
diff --git a/content/assets/README.md b/content/assets/README.md
new file mode 100644
index 0000000..f310fca
--- /dev/null
+++ b/content/assets/README.md
@@ -0,0 +1,73 @@
+# content/assets — authored exhibits
+
+Everything the site shows that is not Markdown prose. Authored in Phase 7; wired
+into templates by Phase 2's builder.
+
+```
+content/assets/
+├── BUDGET.md measured weights for every asset, and the budget
+├── VERIFY.md what was checked, with the output pasted in
+├── diagrams/ 8 SVGs, light and dark in one file each
+│ ├── README.md the visual language and the presentation contract
+│ └── manifest.yaml id, area, level, title, alt text per diagram
+├── code/ 6 verbatim excerpts, 212 lines, 5 eras
+│ ├── README.md the rules these follow
+│ └── manifest.yaml era, language, shows, rationale, honest note
+└── logos/
+ └── clients.yaml the client wall: 45 entries, 44 distinct names
+```
+
+## Three decisions worth knowing
+
+**The client wall is type, not logos.** Forty-five names in one typeface at one
+size on an even grid. Nothing is an image, so nothing can break, and no client is
+visually ranked above another. Ten client marks do exist in Simple Icons; none is
+enabled, because using a company's mark on a public portfolio is a permission
+question for Sam, not a design choice for an agent.
+
+**Diagrams carry both themes in one file.** Not two files that can drift: one
+`
+
+
+
+
+
+
+ Homelab topology — hosts, roles, trust boundaries
+
+ public internet
+
+ Visitors
+ no host access
+
+
+ .35 sam-Ubuntu1
+ public edge · 2 CPUs · 14 GiB
+
+
+ Caddy :443
+ the only public listener
+
+ Gitea · Immich · Wiki.js
+
+ Nextcloud · Penpot
+ terminates 443 for
+ *.lab.audasmedia.com.au
+
+
+ .13 nixos-desktop
+ runtime · 12 CPUs · 2.3 GiB free
+
+
+ Go app :8096
+ templ · HTMX · SSE · SQLite
+
+ Qdrant :6333 / :6334
+
+ Prefect worker
+ content/ → chunk → embed
+
+ OmniRoute
+ existing · the only model gateway
+
+ Whisper · Piper
+ speech in, speech out
+ every listener on 127.0.0.1
+
+ LAN
+
+ .27
+ sam-4screen-desktop
+
+
+ content/ + source
+
+ agent fleet
+ build / dev · no public
+ listeners
+
+ trust boundary — outside this boundary nothing is reachable from the internet
+ Public → Caddy :443 on .35 → LAN → 127.0.0.1 services on .13. New footprint ≤ 1.0 GiB · ≤ 4 containers.
+ Solid = network path. Dashed = trust boundary. Ports are those the app actually binds.
+ measured 2026-10-17 · reference/stack.md
+
diff --git a/content/assets/diagrams/02-agent-architecture.svg b/content/assets/diagrams/02-agent-architecture.svg
new file mode 100644
index 0000000..819ad38
--- /dev/null
+++ b/content/assets/diagrams/02-agent-architecture.svg
@@ -0,0 +1,98 @@
+
diff --git a/content/assets/diagrams/03-rag-pipeline.svg b/content/assets/diagrams/03-rag-pipeline.svg
new file mode 100644
index 0000000..b80f1ac
--- /dev/null
+++ b/content/assets/diagrams/03-rag-pipeline.svg
@@ -0,0 +1,106 @@
+
diff --git a/content/assets/diagrams/04-edge-architecture.svg b/content/assets/diagrams/04-edge-architecture.svg
new file mode 100644
index 0000000..41d466d
--- /dev/null
+++ b/content/assets/diagrams/04-edge-architecture.svg
@@ -0,0 +1,111 @@
+
diff --git a/content/assets/diagrams/05-distributed-audio.svg b/content/assets/diagrams/05-distributed-audio.svg
new file mode 100644
index 0000000..8541f78
--- /dev/null
+++ b/content/assets/diagrams/05-distributed-audio.svg
@@ -0,0 +1,111 @@
+
diff --git a/content/assets/diagrams/06-media-pipeline.svg b/content/assets/diagrams/06-media-pipeline.svg
new file mode 100644
index 0000000..f928939
--- /dev/null
+++ b/content/assets/diagrams/06-media-pipeline.svg
@@ -0,0 +1,92 @@
+
diff --git a/content/assets/diagrams/07-cost-resource-engineering.svg b/content/assets/diagrams/07-cost-resource-engineering.svg
new file mode 100644
index 0000000..44639cf
--- /dev/null
+++ b/content/assets/diagrams/07-cost-resource-engineering.svg
@@ -0,0 +1,95 @@
+
diff --git a/content/assets/diagrams/08-era-timeline.svg b/content/assets/diagrams/08-era-timeline.svg
new file mode 100644
index 0000000..8940f93
--- /dev/null
+++ b/content/assets/diagrams/08-era-timeline.svg
@@ -0,0 +1,106 @@
+
diff --git a/content/assets/diagrams/README.md b/content/assets/diagrams/README.md
new file mode 100644
index 0000000..dab0826
--- /dev/null
+++ b/content/assets/diagrams/README.md
@@ -0,0 +1,80 @@
+# Phase 7.2 — diagrams
+
+Eight diagrams, one visual language, light and dark in one file each.
+
+Authored 2026-10-26. Source of truth is the SVG files themselves: each one is
+self-contained, with no external font, image or script reference.
+
+## The language
+
+| Part | Rule |
+|---|---|
+| Canvas | `viewBox="0 0 960 540"`, `width`/`height` set so a bare file view is 1× |
+| Type | 19 px section title · 15 px heading · 13 px label · 12 px caption, all `ui-sans-serif` system stack |
+| Boxes | `rx=7`, 1.4 px stroke, four semantic tones: neutral, accent (the thing being described), teal (store / gateway), amber (guard, failure, limit) |
+| Arrows | solid = data or control flow, dashed = trust boundary or approximate relationship |
+| Colour | greys carry structure; one blue accent, one teal, one amber, nothing else |
+| Text | every `` is real text in the SVG, so it scales, selects and reads to a screen reader |
+
+Every file carries a **byte-identical `