```shell
/generate-report my awesome html report
```
Ask an agent to "write an HTML report" and it improvises the whole
document from scratch every time — its own CSS, its own layout, its own
guess at what looks good. That's expensive and inconsistent: every
report burns tokens re-deriving boilerplate it already wrote last time,
and every report looks different because there's no shared design to
fall back on.
`generate-report` fixes that by splitting the job in two. The agent's
only responsibility is **content and structure** — the topic, the facts,
which semantic tag fits each piece (a `<card>`, a `<stat>`, a
`<chart>`). A shared renderer, loaded from one `<script>` tag,
owns everything about how it looks.
**Content-only generation**
The agent never writes CSS, `class`, `style`, or a `<div>`. If it's
making a visual decision, it's off-spec.
**Lower token cost**
No boilerplate HTML/CSS to regenerate per report — just the small tag
vocabulary plus the actual content.
**Consistent UI, every time**
Every report shares one design system. Improve it once in the repo, every
report generated afterward picks it up automatically.
```bash
curl -fsSL https://generate-report-add5b3.gitlab.io/install.sh | bash
```
Then invoke it:
```
/generate-report draft a report about how to read a book
```
The agent writes `report-how-to-read-a-book.html` in the current
directory (or a path you give it) — open it in any browser, no server,
no build step.
- `cover` — hero header, once per document
- `section` — titled block, the main structural unit, also the vertical layout primitive (gap between children)
- `row` — horizontal flex layout, gap + per-child flex weight
- `markdown` — all prose, never hand-written `<p>`/`<ul>`
- `card` / `badge` — emphasis and inline claim-labeling
- `stat` / `chart` — quantitative content
- `image` / `divider` / `progress-bar` — media, separation, completion
Tables aren't a separate tag — write standard GFM table syntax inside
`markdown` and it renders as a real, styled table.
{fact:Fact} Reports load in a real browser, offline-editable, no server required.
{assumption:Assumption} The CDN needs network access at view-time — not fully offline.
{claim:Claim} Skipping the shared renderer and hand-writing HTML per report is the expensive default this replaces.
Fenced code blocks get syntax highlighting (highlight.js, auto-detected
from the fence language) and a click-to-copy button, no extra markup:
```js
function slugify(topic) {
return topic.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-");
}
```
Standard GFM table syntax, rendered by the JS parser — no `<table>`
tag, no raw HTML:
| Item | Status |
|---|---|
| Document billing pipeline runbook | {success:Done} |
| Load test checkout under 2x traffic | {warning:Open} |
- **Repo**: `gitlab.com/jinlei/generate-report`
- **Tag reference**: `SPEC.md` in the repo root
- **Skill instructions**: `skills/generate-report/SKILL.md`
- **Runtime**: served via GitLab Pages, latest push to `main`, no version pinning yet
- **Feedback / bugs**: `gitlab.com/jinlei/generate-report/-/issues`
To change the visual theme or add a tag, edit the repo directly — every
report generated afterward (and this page itself) picks it up
automatically via the CDN.
```bash
curl -fsSL https://generate-report-add5b3.gitlab.io/uninstall.sh | bash
```
Add `claude` or `codex` to remove just one. No network access needed.