From AWS Bento Deck
Builds AWS-branded Bento presentations (.bento.html) from a DECK.md plan file with a three-phase workflow: plan, compile, and mandatory QA.
How this skill is triggered — by the user, by Claude, or both
Slash command
/aws-bento-deck:aws-bento-deckThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn a storyline into a finished AWS-branded `.bento.html` in three phases:
Turn a storyline into a finished AWS-branded .bento.html in three phases:
<Topic>.deck.md describing every slide (layout, title,
content slots, notes). The user reviews/edits this file — it IS the draft.
HARD STOP at the end: wait for user approval before building.<Topic>.bento.html (self-contained: Amazon Ember fonts, AWS logos,
architecture icons, brand gradients all ride inside).Never skip the plan for decks of 4+ slides. For quick 1–3 slide asks, you may plan inline in the conversation, but still show the slide list before building. QA is never skipped, regardless of deck size.
Output-format routing: this skill produces .bento.html only. If the
user says .pptx / PowerPoint, hand off to the PPTX skills. If they just
said "AWS 슬라이드"/"AWS presentation" with no format, ask once which format
they want before starting.
assets/AWS_Deck_Template.template.bento.html (in THIS
skill directory — resolve relative to this SKILL.md). Secondary copies,
if the bundled one is ever missing/corrupt:
~/workspace/bento/working/aws-port-slide1.json (same doc as editable
JSON) or a user-provided path. If none exists, STOP and tell the user.
The template is not just a style reference — it physically carries the
fonts, logos, 160 icons, gradient art, and doc.layouts; every build
starts from it (the shell is copied, so the bundled template is never
modified).references/layouts.md — every layout id, its content slots, when to use
it. Read BEFORE writing a plan (Phase 1).references/deck-format.md — the deck.md plan-file schema, including the
required narrative-contract front matter. Read BEFORE writing a plan.references/data-viz.md — chart type selection + chart standards. Read
when the material contains numbers to compare (Phase 1) and when
composing chart elements (Phase 2).references/design-system.md — type/color/gradient/icon/margin/
accessibility rules. Read BEFORE composing any layout: custom slide or
restyling layout elements (Phase 2).references/bento-schema.md — Bento format gotchas: the splice contract,
morph/state rules, media, dynamic fields. Read BEFORE Phase 2.references/qa.md — the full Phase 3 checklist. Read when entering QA.scripts/ — splice_deck.mjs (escape + splice + round-trip verify),
validate_deck.mjs (structural QA), render_slides.mjs (visual QA
screenshots).The deck.md is the single source of truth for the build — a thin plan makes a thin deck. Invest here: gather source material first, ask real questions, and write slide content that could be presented as-is.
1a. Gather source material (ALWAYS do this first). Ask the user what already exists before inventing anything:
"발표 내용의 근거가 될 자료가 있나요? — 기획 .md/노트, 기존 발표자료, 블로그/문서 링크, 스크린샷·다이어그램 이미지, 데모 시나리오 등. 경로나 링크를 주시면 검토해서 플랜에 반영합니다."
Then actually READ everything they give you (files, URLs, images) and mine it: exact numbers with sources, real quotes with attribution, product names, diagrams worth re-drawing vs embedding, code snippets, demo flows. Prefer the user's own claims and phrasing over generic marketing copy. When material contradicts itself, ask — don't pick silently.
1b. Ask for decisions you can't infer. Be proactive; batch questions in one round (use the AskUserQuestion tool when available). Typical decision points:
objective:/desired_action: —
every slide must serve it)> TODO: in the plan — NEVER invent
numbers, quotes, or customer names.1c. Structure the deck. Read references/layouts.md, then map the
storyline to slides. Every deck gets one cover (4 variants — pick by
mood; violet sweep is the default). The other furniture slides are
CONDITIONAL — include them for a reason, not by habit:
1d. Choose layouts by CONTENT SHAPE, not by order in the catalog —
layouts.md maps shapes (comparison, parallel items, big number, spectrum,
timeline, quote, photo, code, icon grid…) to layout ids. When nothing
fits, mark layout: custom and describe the composition; you'll hand-lay
it in Phase 2. Don't force content into a wrong layout. Variety rules:
bulleted slides in a row because it was easy is not).1e. Map content → Bento feature, not just layout (layouts place content;
features make it live — decide these IN the plan, as fx:/transition:
hints):
layout: custom + chart: data). Chart type + standards:
references/data-viz.md.fx: count-up on that textmorph-with-prev: true (builder keeps shared element ids; Bento's
signature move — e.g. a diagram gaining layers across slides, cover
gradient → section strip). Morph when it explains continuity or
change; don't manufacture shared elements just to have a morph.state-of: <parent slide> + a link: on the trigger element)fx: stagger
Motion restraint: motion must explain state change, sequence, or
causality — or set the stage (covers/dividers MAY carry one ambient
motion like ken-burns; not required). Pick 1–3 signature motion patterns
per deck and reuse them consistently; avoid looping animation that
explains nothing. Test: remove every motion — the deck must still make
its argument. (Motion is also invisible in PDF export and to
motion-sensitive viewers.)1f. Write <Topic>.deck.md per references/deck-format.md, one section
per slide. Front matter carries the narrative contract (objective:,
audience:, desired_action: — required; thesis:/duration_minutes:
optional). Each slide gets: layout id, title, the layout's named slots
filled, notes: (speaker notes — REQUIRED, write real ones), and optional
purpose: / takeaway: / image: / transition: / fx: hints. Density
bar: every slot filled with final copy (not "TBD" except explicit > TODO:
gaps), real numbers with sources, speaker notes a presenter could actually
speak. Sanity pass before showing the user: read only the slide TITLES top
to bottom — they should tell the story and land on the objective by
themselves. A slide that serves no objective: gets cut or rethought. If
you can't fill a slide's slots concretely, go back to 1a/1b — not to build.
1g. Review round (HARD STOP). Show the user the file path and a
one-line-per-slide summary (slide · layout · title). Flag open > TODO:
items and the decisions you made on their behalf. WAIT for approval or
edits before building (unless they said "just build it"). The user editing
the deck.md directly and saying "rebuild" is a normal loop — Phase 2 must
compile whatever the file says, not what this conversation remembers.
Read references/bento-schema.md first; read references/design-system.md
before any layout: custom composition. Content composition (steps 1–5) is
judgment work you do yourself; the splice and verification (step 6+) go
through scripts/ — never hand-roll the escaping.
#bento-doc block from the template HTML — its type is
application/bento+json; the escaped \u003c decodes back to < for free
when you JSON.parse).format, version,
size, theme, fonts, layouts, and every entry in assets that the
final deck references (fonts + logos + gradients always; icons/images only
if used — prune the rest to keep the file lean; icons weigh ~3KB each,
keeping all is acceptable when unsure). Drop the template's slides
and template:true. Set title, meta (author/company/event); omit
docId (the app mints one) — never reuse the template's.html from the plan, drop
unfilled placeholder text elements ONLY if the layout marks them
placeholder (they auto-hide anyway). For layout: custom, compose
elements directly (text/rect/svg/image/chart/table) following
design-system.md.id = kebab topic slug (stable, unique), background from
the layout, transition from the plan (default fade; use morph when
consecutive slides share element ids), notes from the plan verbatim.image: <path>): embed as data URI in assets
(img-<slug>), reference via "src": "asset:img-<slug>", fit: cover.
Warn above ~2MB per image.node scripts/splice_deck.mjs <template.bento.html> <doc.json> <out.bento.html>
It owns the <-escaping correctness requirement (see bento-schema.md
"splice contract"), replaces only the #bento-doc block content in a
COPY of the shell, and round-trip verifies. If the script is
unavailable, replicate exactly the contract by hand — the escape and
the round-trip check are both non-negotiable.<Topic>.bento.html where the user asked (default ~/Documents).
The deck is NOT done yet — Phase 3 is mandatory.Read references/qa.md and work through all three stages:
node scripts/validate_deck.mjs <out.bento.html>;
fix every ERROR, consciously triage every WARN.node scripts/render_slides.mjs <out.bento.html> <qa-dir> (fallback: Playwright MCP), then actually LOOK at every slide
PNG against the defect checklist in qa.md.Do not deliver after JSON validation alone. Fix → re-splice → re-render
affected slides → re-inspect, until clean. Then report what was checked and
fixed, and offer to open the file — it boots straight into the editor.
Creates, edits, and verifies skills using a test-driven development approach with pressure scenarios and subagents.
npx claudepluginhub aws-samples/sample-apj-sup-sa --plugin aws-bento-deck