Delivery kit

Annex — Tier 1: self-contained HTML dashboards

Last changed 2026-08-17 · all documents · security & deployment

Applies when the deliverable is a single HTML file the client opens in their own browser, from their own file share. No server, no network calls, no data leaving their environment. This annex adds to baseline-runbook.md; it does not replace it.

The security argument for tier 1 used to be that the file is inert and offline. Half of that is still exactly true and half of it is not, and the distinction now matters:

So the honest version is: nothing leaves, and the only thing that runs is a small parser I wrote, on a file the user chose, inside the browser sandbox.

Two consequences the rest of this annex now has to carry. The parser is first-party and deliberately small — a few hundred lines using the browser's own DecompressionStream, DOMParser and FileReader — rather than a large third-party spreadsheet library, precisely so the added surface is readable and auditable. And the escaping discipline below stops being hygiene and becomes load-bearing, because the input is now genuinely untrusted rather than merely plausible.

Embedded data — the sensitivity check

A tier-1 dashboard usually carries its data inside the file. That means the file is the data: wherever it gets forwarded, the data goes too. Before I embed anything, I check:

For demos and anything public-facing the rule is absolute: synthetic data only, generated by a seeded script, and labelled in-page as sample data. No real client extract ever becomes a demo, not even lightly edited.

Escaping — text is text

Every value that comes from data is written with textContent (or an equivalent that escapes). innerHTML is reserved for markup I wrote by hand, never for a value read from a file. A spreadsheet cell containing a <script> tag is a realistic accident, not a hypothetical attack.

Checks before delivery:

The file reader, where a deliverable includes one

Optional, and stated as such: a dashboard either carries its data baked in, or ships as a viewer the client points at their own export. The second is stronger on data handling — the file is no longer the data, so it can be forwarded harmlessly — and weaker on the inert claim above. Which one applies is decided with the client, not defaulted.

Bundled dependencies

Everything the file needs is inside the file. No CDN, no web font fetch, no remote image, no analytics.

The pinned versions go in the handover note so the client knows what to review if an advisory lands later.

File distribution rules