ArtStroy logo
ArtStroy qa · ai · engineering
Documentation · May 22, 2026 · 7 min read

HTML Documentation Files Beat Markdown for AI Reports

AI agents default to markdown, but humans ignore raw .md on disk. Route read-only artifacts to self-contained HTML and keep markdown for repos and edits.

Split view of a plain markdown file and a styled HTML report opened in a browser

Your agent just wrote a perfect weekly test summary. Forty paragraphs, tables, risk callouts, links to flaky suites. You saved it as weekly-qa-summary.md in the repo root. A week later it is still there, unopened, next to eleven other summaries from the same routine.

Nothing was wrong with the content. The format was wrong for the audience — and the audience was you on a Monday morning, not GitHub rendering a README.

When Claude (or any coding agent) produces human-facing artifacts, a single self-contained HTML file gets opened, forwarded, and quoted. The same words in markdown feel like scratch notes. Same model, same prompt, different default format. This article adapts that workflow for QA engineers, DevOps leads, and anyone running Cursor or Claude Code on real projects.

The read vs edit split

Markdown won because it is easy to type and easy to diff in Git. Both reasons matter less when the writer is an AI.

QuestionDefault formatWhy
Will someone read this once and move on?HTML (.html)Opens in a browser, looks finished, shareable as a file or screenshot
Will someone edit this for weeks?Markdown (.md)Better in editors, diffs cleanly, platforms like GitHub render it
Will another agent parse it?MarkdownSkills, CLAUDE.md, and project memory files stay in .md
Does it live in the repo as living docs?MarkdownREADMEs, ADRs, Mermaid in Markdown

The routing rule from Kotrotsos fits ArtStroy workflows too: read = HTML, edit = markdown. When unsure, ask that one question before you accept the agent’s output.

What changes in practice

Three patterns show up in every team that tries this.

Status and test reports. A markdown wall of bullet points from Friday’s regression run gets skimmed once. The HTML version — one file, inline CSS, sections per suite, red/amber/green health chips — stays open in a tab during standup. Same data from the same CI export; the HTML version is the one someone screenshots for Slack.

Briefings and memos. Calendar + inbox summaries as .md land in a folder you never open on mobile. Styled HTML with two columns, time blocks, and print styles gets checked daily. Kotrotsos reported his personal briefing going from ~40% open rate to every morning after the format switch. Your mileage varies, but the mechanism is the same: designed surfaces beat raw text.

Client or stakeholder packs. Pen test summaries, release notes for non-engineers, audit evidence bundles. Markdown reads like a draft. HTML with typography, embedded inline SVG charts, and @media print reads like something you forward to a director.

The pattern is not “HTML is prettier.” It is perceived completeness. Humans treat rendered pages as done work.

Why markdown is the wrong default for AI output

The old argument: markdown is easy to write and you can convert later.

  • Easy to write — irrelevant when the agent writes both formats equally well.
  • Convert later — rarely happens. Files sit in artifacts/, reports/, or the desktop until someone deletes them.

Optimize for consumption now on whatever device is in hand. Phones and tablets do not love monospace .md in a file manager. Browsers already know how to render HTML.

That does not kill markdown. It reposition markdown as the format for collaboration and machines, not for “I will read this eventually.”

Wire it into agent config

One paragraph in project-level instructions changes defaults across sessions. In Claude Code that is CLAUDE.md; in Cursor, AGENTS.md or .cursor/rules/.

## Output format

For artifacts meant for humans to read (reports, briefings, summaries,
retros, status pages, memos, slide outlines):
- Default to one self-contained `.html` file with inline CSS
- Use semantic HTML (`main`, `section`, `h1`–`h3`)
- Include `@media print` (strip heavy backgrounds, sane page breaks)
- Light mode by default; max two accent colors; no CDN fonts unless required
- Save under `artifacts/` next to any markdown source if both are needed

For material that will be edited (README, specs, ADRs, skills, agent prompts):
- Keep markdown
- Prefer paths already used in the repo (e.g. docs/project_notes/)

When unsure: "Is this for someone to read or someone to edit?"
Read → HTML. Edit → markdown.

If you already run a project memory skill with docs/project_notes/*.md, leave that as markdown. Agents read it efficiently; humans edit it in PRs. Generate read-only weekly digests from those files as HTML exports when you need a report people actually open.

Formatting standards that survive email and archives

One file, no dependencies. Inline <style>, inline SVG for simple charts, no external font CDN unless you control the network. The file should survive email attachment, Slack upload, Notion embed, and compliance archive without broken links.

Print-friendly always. Roughly:

@media print {
  body { background: #fff; color: #000; }
  .no-print { display: none; }
  section { break-inside: avoid; page-break-inside: avoid; }
}

Executives still print. QA leads print audit packs. Plan for it.

Restrained design. Agents over-style unless constrained: gradients, icon soup, dark-mode toggles nobody asked for. Cap at two accent colors, generous whitespace, system-ui or one safe sans stack. You want “internal report,” not “landing page generator.”

Minimal template you can paste into a skill

Save this as a starter the next time a skill should emit HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>QA Weekly Summary — 2026-05-22</title>
  <style>
    :root { --accent: #0d9488; --muted: #64748b; }
    body { font-family: system-ui, sans-serif; line-height: 1.55; max-width: 52rem; margin: 2rem auto; padding: 0 1rem; color: #0f172a; }
    h1 { font-size: 1.5rem; border-bottom: 2px solid var(--accent); padding-bottom: 0.5rem; }
    section { margin: 2rem 0; }
    .badge { display: inline-block; padding: 0.15rem 0.5rem; border-radius: 4px; font-size: 0.85rem; }
    .ok { background: #dcfce7; color: #166534; }
    .warn { background: #fef9c3; color: #854d0e; }
    .bad { background: #fee2e2; color: #991b1b; }
    @media print { body { margin: 0; } .no-print { display: none; } }
  </style>
</head>
<body>
  <main>
    <h1>QA Weekly Summary</h1>
    <section>
      <h2>Regression</h2>
      <p><span class="badge ok">412 passed</span> <span class="badge warn">3 flaky</span> <span class="badge bad">1 failed</span></p>
    </section>
  </main>
</body>
</html>

Point your report-generating skill at this structure instead of a markdown template. Tokens are cheap; attention is not.

When markdown still wins

Stay on markdown for:

  • Repo-native docs — README, OpenAPI specs, architecture notes rendered by GitHub or your doc platform.
  • Long-lived editable drafts — article MDX, specs in flux, anything reviewed in PRs as text.
  • Agent-to-agent context — skills, rules, memory files, prompts. Markdown structure is enough; HTML adds noise. See also token discipline for agent context — lean text payloads still matter there.
  • Diagrams-as-codeMermaid in Markdown stays the right tool when the diagram must live next to source and diff in Git.

HTML and markdown are not rivals. They are two lanes on the same highway.

What to do this week

Pick one recurring artifact: Friday regression summary, sprint retro, pentest readout, release checklist for stakeholders. Add the output-format block to AGENTS.md or CLAUDE.md. Re-run the same prompt. Open the .html in a browser and compare to last week’s .md.

Then update one skill that produces that artifact so HTML is the default output path. Ten minutes per skill. After a week, check which files you actually opened — the HTML ones usually win.

The larger picture

Labs are pushing “rendered output” everywhere: tool UIs over MCP, design artifacts in chat products, dashboards instead of log dumps. Your local fix is the same idea at workflow scale: stop shipping raw text to humans who will not parse it.

If you have been generating markdown reports nobody reads, you are not failing at AI. You are failing at format routing. One config paragraph and one habit change fix that.