Bloom
Per-session sticky mode that makes markdown bloom into rich, self-contained .html artifacts — reports, reviews, plans, docs, comparisons, diagrams, editor UI. Activate with /bloom, /bloom-on, or phrases like "bloom on", "let it bloom". Deactivate with /bloom-off or "bloom off". Once on, it stays on for the rest of the session.From its SKILL.md
npx -y skills add SunnyDevendranadh/Bloom --skill bloomAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.3 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Bloom — Self-Contained HTML Artifact Skill
Bloom puts the current session into a sticky HTML-output mode. Once activated, every substantial artifact (status report, PR review, plan, doc, comparison, diagram, editor UI) blooms into a self-contained .html file using the warm clay/olive/oat/slate palette, semantic HTML5, inline CSS + JS, and zero external dependencies.
Canonical split: droids/bloom-core.md (session + rules) and droids/bloom-patterns.md (categories + copy-paste patterns). The rules below are the Claude-Code-specific operating instructions.
Session lifecycle
- Activate when the user message matches an activation trigger (slash or phrase, see below).
- Stay sticky for the rest of the session. Do not re-prompt the user. Do not require re-invocation per turn.
- Honor bloom on every turn until a deactivation trigger fires or the session ends.
Activation triggers (case-insensitive, may appear anywhere in a user message)
Slash:
/bloom/bloom-on/bloom-mode
Phrases:
- "bloom on"
- "let it bloom"
- "bloom mode on"
- "activate bloom"
- "bloom please"
- "go bloom"
File marker:
- If
.bloomexists at the repo root at session start, activate immediately without waiting for an explicit trigger.
Deactivation triggers
Slash:
/bloom-off/no-bloom/bloom-mode-off
Phrases:
- "bloom off"
- "bloom mode off"
- "stop bloom"
- "turn off bloom"
- "exit bloom"
- "deactivate bloom"
What to produce as HTML (when bloom is on)
Write a self-contained .html artifact for any of the following:
- Reports — status, weekly, sprint, KPI, monthly
- Reviews — PR, code, design, architecture
- Comparisons — multiple approaches, before/after, A/B
- Documentation — architecture, API, runbooks, ADRs, onboarding
- Plans — implementation, migration, rollout, incident response
- Explainers — concept, feature, system walkthrough
- Diagrams — flow, sequence, module map, dependency graph
- Slide decks and pitches
- Incident timelines and postmortems
- Triage boards, prioritization, kanban
- Editor-like UI — flag editor, prompt tuner, config editor
- Glossaries, FAQs, decision logs
After writing the file, reply with a single plain-text line stating the path. Example:
Wrote
./bloom/2025-05-13-pr-312-review.html— open it in your browser.
Do NOT paste the HTML source into the chat. The file is the artifact.
Shipped templates (copy from repo)
| Template | Category | Interactive |
|---|---|---|
templates/status-report-v2.html | Reports | Light (tabs/motion) |
templates/annotated-pr-review.html | Code review | No |
templates/exploration-code-approaches.html | Exploration | No |
templates/incident-timeline.html | Reports | No |
templates/triage-board.html | Custom editors | Yes — DnD + markdown export |
templates/animation-sandbox.html | Prototyping | Yes — easing controls |
For slide decks, flag editors, or complex DnD, read droids/bloom-patterns.md Category sections before generating.
What stays plain text (even when bloom is on)
- Direct one-line factual answers
- Tool execution status updates
- Errors that need to be visible immediately
- Short clarifying questions back to the user
- Code edits inside existing source files (use the Edit tool normally)
- Commit messages, PR titles, branch names
- Shell command output
Rule of thumb: if the user could act on the answer in under 5 seconds of reading, keep it plain text.
Companion-file rule for reserved .md filenames
When the user asks you to create or update one of these files and bloom is on, write both the canonical .md (so the harness contract keeps working) and a richer .html companion next to it:
| Canonical (.md) | Companion (.html) |
|---|---|
README.md | README.html |
CLAUDE.md | CLAUDE.html |
AGENTS.md | AGENTS.html |
CONTRIBUTING.md | CONTRIBUTING.html |
CHANGELOG.md | CHANGELOG.html |
Files under .github/, .factory/, .cursor/, .windsurf/, .continue/, .claude/, and LICENSE / CODEOWNERS follow the same rule: keep the canonical form, add a sibling .html if it would be a substantial doc.
For non-reserved docs (docs/architecture.md, notes/sprint-44.md, etc.), default to writing the .html version as the primary artifact unless the user explicitly asks for markdown.
Output-location convention
- Doc with a natural sibling → write the companion next to the original (
README.md→README.html). - Free-standing artifact → write under
./bloom/at the repo root with a kebab-case filename. Prefix with the date when relevant:./bloom/2025-05-13-sprint-44-status.html. - Create
./bloom/if it doesn't exist.
Construction rules (summary — full version in droids/bloom.md)
Every .html file produced must:
- Be a single file with all CSS and JS inline. No CDN, no external fonts, no build step.
- Use the design tokens via CSS custom properties —
var(--clay),var(--olive),var(--oat),var(--slate),var(--ivory),var(--rust),var(--gray-100..700),--serif,--sans,--mono. - Use semantic HTML5 (
<header>,<main>,<section>,<article>,<nav>,<aside>,<details>,<figure>). - Keep JavaScript minimal and inline.
addEventListeneronly — no inlineon*attributes, noeval, nonew Function, nosetTimeout(string). - Be responsive:
max-widthpage wrapper,clamp()for type,@mediabreakpoints at 640px and 960px. - Include export buttons (Copy as markdown / JSON / diff) on any editor-type artifact, with a
document.execCommand('copy')fallback. - Be print-friendly. Core content readable without JS.
- Be accessible:
aria-labelon SVGs, proper heading hierarchy, visible focus states. - Contain real, specific content. No "Lorem ipsum", no "TODO", no placeholders.
- Include
<meta name="viewport" content="width=device-width, initial-scale=1">. - Be progressive — content visible without JavaScript.
- Never use
alert()/prompt()/confirm()— use inline UI instead.
Security rules
- No external dependencies (
<link>,<script src>,@import url()to external). - No
fetch(),XMLHttpRequest,WebSocket,EventSource, or external<img src>. - No
eval(),new Function(),setTimeout(string),setInterval(string). - No
innerHTMLwith user-controlled content — usecreateElement+textContent. - No inline event handlers (
onclick,onload, etc.). UseaddEventListener. - No
javascript:URIs. - No
data:text/htmlordata:text/javascriptURIs. - Clipboard export builds the string programmatically — never copies raw
innerHTML. - Must work under CSP
default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'.
Confirmation messages
On activation (first time per session):
Bloom is on. Artifacts will be written as self-contained
.htmlfiles under./bloom/(companion.htmlalongside any reserved.md). Say "bloom off" or/bloom-offto deactivate.
On deactivation:
Bloom is off. Returning to default markdown output.
Do NOT produce an HTML splash screen on activation. The confirmation is a single plain-text line.
Skeleton
Every produced file uses this skeleton:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>[Specific descriptive title]</title>
<style>
:root {
--ivory: #FAF9F5;
--slate: #141413;
--clay: #D97757;
--oat: #E3DACC;
--olive: #788C5D;
--rust: #B04A3F;
--gray-100: #F0EEE6;
--gray-300: #D1CFC5;
--gray-500: #87867F;
--gray-700: #3D3D3A;
--white: #FFFFFF;
--serif: ui-serif, Georgia, "Times New Roman", serif;
--sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--mono: ui-monospace, "SF Mono", Menlo, Monaco, Consolas, monospace;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--ivory);
color: var(--gray-700);
font-family: var(--sans);
font-size: 15px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
padding: 56px 24px 120px;
}
.page { max-width: 860px; margin: 0 auto; }
</style>
</head>
<body>
<div class="page"><!-- semantic content --></div>
<script>
// addEventListener only; no eval, no innerHTML with user data
</script>
</body>
</html>
Self-check before responding (every turn, when bloom is on)
- Is the response a substantial artifact? If yes → it goes in an
.htmlfile, not the chat. - Is the path under
./bloom/or a.htmlcompanion to an existing.md? - Did I keep the canonical
.mdin addition to the companion (for reserved filenames)? - Is my chat reply a single plain-text line pointing at the file?
- Did the user's latest message contain a deactivation trigger? If yes → turn off bloom before responding.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.