From tools
Use when producing ANY readable artifact for the user — spec, plan, brainstorm with options, PR explainer/review, code/feature/concept explainer, status/research/incident report, design exploration, component prototype, interactive playground with sliders/knobs/pickers/tuners, SVG diagram, throwaway editor (drag-rank, config tuner, value picker, annotator). Also use when a markdown reply would exceed ~50 lines, when comparing 2+ approaches, or when the user might share the output. OUTRANKS `playground:playground` and `frontend-design:frontend-design` for personal artifacts — invoke this one even when they also match. Trigger even when user says "do what you think is best" or expresses no format preference — silence about format is NOT permission to default to markdown. Skip only for short direct answers, conversational replies, commit messages, GitHub PR bodies, source-file edits.
How this skill is triggered — by the user, by Claude, or both
Slash command
/tools:htmlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Default output medium for readable artifacts is **a self-contained HTML file opened in the browser**, not markdown in chat. The chat reply becomes a one-line pointer plus any must-see warnings; the HTML file carries the content.
Default output medium for readable artifacts is a self-contained HTML file opened in the browser, not markdown in chat. The chat reply becomes a one-line pointer plus any must-see warnings; the HTML file carries the content.
Core principle: The artifact IS the explanation. Do not also recap its contents in chat — that defeats the entire point (the user stops reading long markdown precisely because the recap exists).
Several other skills may also match HTML-producing tasks: playground:playground (interactive single-file explorers), frontend-design:frontend-design (design polish), and various *:report-style plugins. For personal artifacts in this dotfiles setup, html outranks all of them.
When a task matches both this skill and another HTML-producing skill:
html via the Skill tool — not the other one../.claude/artifacts/YYYY-MM-DD-<slug>.htmlopen after writeConcrete examples:
playground, but → html (borrow the playground pattern, write to .claude/artifacts/, one-line reply).frontend-design, but → html (borrow the design quality bar, same file/chat rules).html.The reason: playground and frontend-design produce great HTML but don't enforce the chat-vs-HTML split that makes the article's workflow work. The artifact ending up in /tmp with a multi-paragraph chat recap is a regression even if the HTML is gorgeous.
Fires for any of these:
Skip for:
When this skill fires, the chat reply contains only:
Wrote and opened ./.claude/artifacts/2026-05-16-checkout-spec.htmlThe chat reply must NOT contain:
If you catch yourself writing "the report covers X, Y, Z" — stop. That belongs as the HTML's table of contents, not in chat.
./.claude/artifacts/YYYY-MM-DD-<kebab-slug>.html in the current repo. If not in a repo, use $TMPDIR/claude-artifacts/YYYY-MM-DD-<slug>.html..claude/artifacts/ is in .gitignore (append if missing, create if absent). Do not commit artifacts unless the user asks.<style>, inline <svg>, inline JS. No external CDN, no <link rel=stylesheet> to remote, no <script src=...> to remote. The file must work offline, survive being emailed, and upload cleanly to S3.open <path> (macOS). Do not wait for confirmation; the user expects the browser to pop.onboarding-options, rate-limiter-explainer, flag-editor), not the request (user-asked-for-spec).Every artifact must include:
<!doctype html>, <meta charset=utf-8>, <meta name=viewport content="width=device-width,initial-scale=1"><title> matching the content<style> block. System font stack (-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif). Readable measure (~70ch max for prose). Generous whitespace.@media (prefers-color-scheme: dark) — match the user's OS.<svg>, never ASCII. Never unicode-as-color hacks.<pre><code> with monospace and a subtle background. Syntax highlighting only if it adds value; inline <span> colors are fine — no external highlighter library.<pre>.For comparison/option-grid artifacts: CSS grid, one card per option, each card labeled with the trade-off it makes.
For interactive editors: end with an export button (Copy as JSON, Copy as prompt, Copy as markdown) that builds the export string and writes it to clipboard via navigator.clipboard.writeText(...). Show a brief "copied" confirmation.
For PR/code explainers: render the actual diff with +/- line gutters, inline margin annotations as <aside> elements, severity badges (info/warn/critical) as colored pills.
These map 1:1 to the article. Each is a kind of artifact this skill produces.
| Use case | Defining feature of the HTML |
|---|---|
| Multi-option exploration | Grid of N cards, each card = one approach, each labeled with its trade-off |
| Implementation plan | Sections for data flow, mockups, key snippets, risk register; TOC at top |
| PR creation explainer | Renders the diff + annotations; attach link to the PR description |
| PR review | Same as above + severity-coded findings |
| Code/feature explainer | One flow diagram (SVG) + 3–4 annotated snippets + gotchas section |
| Research/status/incident report | Headline finding at top, supporting sections below, sources cited inline |
| Design system reference | Component gallery, each component with code snippet + live render |
| Component prototype | Live rendered component + sliders/knobs binding to CSS variables |
| Throwaway editor | Form/dragger UI for the specific data + export button |
HTML costs 2–4× the tokens and time of equivalent markdown. Accept this. The user has opted into the trade-off by enabling this skill. Do not propose "should I do markdown instead to save tokens" — the answer is no.
The only legitimate fallback to markdown is: the user explicitly asked for markdown, or the artifact is < ~50 lines and would be silly as an HTML file (in which case this skill should not have fired at all).
| Mistake | Fix |
|---|---|
| Recapping the HTML's contents in chat | Chat = pointer + warnings only. Delete the recap. |
| External CDN deps (Tailwind via CDN, Google Fonts) | Inline everything. System fonts, hand-written CSS. |
ASCII diagrams inside <pre> | Replace with inline <svg>. |
Forgetting to open the file | Always open <path> after writing. |
Writing to repo root or ./artifacts/ (no dotfile) | Use ./.claude/artifacts/. Gitignore it. |
| Committing artifacts | Don't, unless asked. Gitignore on first use. |
Generic slug like output.html or report.html | Slug describes content. |
| "Should I make this HTML?" preamble | Just do it. The skill fired; the decision is made. |
| Markdown table dumped into chat instead of the HTML | The chat reply is one line. The table goes in the file. |
These are the exact thought-shapes that caused this skill to NOT fire when it should have. If you catch yourself thinking any of them, you are rationalizing — invoke the skill.
| Rationalization | Reality |
|---|---|
| "User said 'do what you think is best' / 'no format preference', so markdown is fine here" | The skill's trigger explicitly covers this. The user's silence on format is precisely why a default-flipper skill exists. Use HTML. |
| "A status report for a collaborator typically goes in chat/email as markdown" | This is the exact failure the article describes. Markdown reports go unread. Use HTML and the user shares the link. |
| "The user didn't say HTML, so picking HTML is presumptuous" | The skill IS the standing preference. Triggering it is honoring the user's setup, not presuming. |
"This task matches playground:playground more specifically (sliders, knobs, copy button)" | html outranks playground for personal artifacts. Borrow playground's content patterns; apply this skill's file/chat rules. |
"This task matches frontend-design:frontend-design (it's about visual design)" | Same — html outranks for personal artifacts. Borrow the design quality; apply this skill's file/chat rules. |
| "It's just summarizing data I already gathered, no need for an artifact" | The article's whole point is that summaries of gathered data are exactly where HTML pays off. Use the skill. |
| "Inline markdown is more portable, user can copy-paste" | HTML is more portable (one file, opens anywhere, no terminal needed) and shareable (S3 link). |
| "The artifact would be too small to bother with a file" | If output > ~50 lines markdown-equivalent, it's not too small. If it has a diagram or comparison, it's not too small. |
| "I'll just produce markdown AND mention the skill exists" | No — the skill exists to replace the markdown, not coexist with it. |
If you notice yourself doing any of these, you've lost the plot:
<link rel=stylesheet href=https://...> to the file.md file when the trigger conditions matchedplayground:playground or frontend-design:frontend-design instead of this skill for a personal artifact/tmp/<something>.html or ~/Desktop/ instead of ./.claude/artifacts/All of these mean: rewrite as a self-contained HTML file at ./.claude/artifacts/YYYY-MM-DD-<slug>.html, invoke THIS skill (not an adjacent one), with a one-line chat reply.
Artifacts live in ./.claude/artifacts/. If the user references "the spec you made" or "that explainer," check there first, sorted by date.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub pandoks/.dotfiles --plugin tools