Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create and edit Bento presentations — self-contained .bento.html decks whose document is JSON. Use whenever the user wants a slide deck or presentation: from scratch, from source material, or by improving an existing file.
.claude/skills/prism-shadow-bento-slides/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -72% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 71% | 0% |
A Bento deck is one self-contained .bento.html file. The document is plain JSON in a single block:
html<script type="application/bento+json" id="bento-doc"> { "format":"bento/slides", ... } </script>
Edit that block only, in place. Escape every < in the JSON as \u003c so it can never contain a literal </script>. Leave the rest of the file — the compressed runtime — untouched. In a chat context the user copies the JSON out instead (Save ▾ → Copy document JSON) and pastes the replacement back (Save ▾ → Replace from JSON…); window.bento.loadDoc(json) does the same from the console.
Adapted from the Bento project's own skill, https://bento.page/skills/bento-slides/SKILL.md (MIT, © 2026 The Bento/Suite authors). The authoritative schema and recipe reference is https://bento.page/agents.md.
If the user's message only invokes this skill (e.g. "use bento-slides skill") without a concrete request, ask what deck they want before doing anything: the topic, the source material to build it from, and whether to start from scratch or edit an existing .bento.html. Do not download anything or write a document until the goal is clear.
The user does not need Bento installed — the app ships inside every deck. When there is no .bento.html to edit, fetch the latest signed release and author into it:
bash# name the file after the deck's topic, e.g. Q4_Review.bento.html curl -fsSL https://bento.page/releases/slides/Bento_Slides.bento.html -o "<Topic>.bento.html"
On Windows without curl: iwr https://bento.page/releases/slides/Bento_Slides.bento.html -OutFile <Topic>.bento.html.
Verify the download contains id="bento-doc", then replace that block's JSON — it ships with a showcase deck, which is discarded. For a fresh document:
size and theme (including theme.fontFamily) are required; the app will not boot without them.stroke / strokeWidth, text needs fontFamily / align / valign. Missing fields render wrong or not at all.docId and collab entirely. The app mints a fresh identity and dormant collaboration credentials on first open.When done, offer to open it (open / xdg-open / start): the file boots straight into the editor with the finished deck. Aim for one pass from request to opened deck.
#bento-doc block and parse its JSON. Note doc.size (canonical 1280×720), doc.theme, existing element ids, and whether doc.template / doc.readonly are set.columns weights, rows of cells, a style object)id on both slides and transition:"morph" on the later one (Bento's signature move; reach for it liberally)stateOf plus an element link)path with a dash-march loop, or morph a highlight through the stepsfx:{countUp:true}id stable across slides so it morphs in placekind: video|audio); embed short clips as a data URI, link big ones by URL to keep the file smalltransition:"morph"?#bento-doc block (escaping < as \u003c), or return the replacement JSON. Never regenerate the whole HTML file.data must be plain numbers — {value,…} item objects coerce to 0, and only pie takes {name,value}. Colour by series, not per bar. option is pure JSON: template formatters only ({b} / {c} / {d}), never functions.doc.assets and referenced by "asset:<key>", so the file stays self-contained.media element (kind: video|audio) embeds short clips as a data URI in src, or references a URL for big files. autoplay runs only in present mode and needs muted:true for video. Do not embed large videos — they bloat the file.docId when editing an existing deck; it is the document's identity. Fresh decks omit it and the app mints one.template:true means every open mints a fresh deck; readonly:true means the file boots straight into the show with no editor.Working examples of every technique: open any template at https://bento.page and read its #bento-doc block.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,422 | 21,210 | +29% | 1 | 1 | 0% | 362 | 2,512 | +594% | 0 | 0 | — |
case-02 | fail→fail | 35,957 | 6,045 | -83% | 1 | 1 | 0% | 7,740 | 2,036 | -74% | 0 | 0 | — |
case-03 | fail→pass | 46,265 | 45,246 | -2% | 1 | 1 | 0% | 8,077 | 9,954 | +23% | 0 | 0 | — |
case-04 | fail→pass | 36,408 | 2,497 | -93% | 1 | 1 | 0% | 7,035 | 1,988 | -72% | 0 | 0 | — |
case-05 | pass→pass | 13,624 | 5,914 | -57% | 1 | 1 | 0% | 2,375 | 2,793 | +18% | 0 | 0 | — |
case-06 | fail→pass | 14,289 | 5,758 | -60% | 1 | 1 | 0% | 1,578 | 2,887 | +83% | 0 | 0 | — |
case-07 | fail→pass | 18,315 | 11,894 | -35% | 1 | 1 | 0% | 2,207 | 3,107 | +41% | 0 | 0 | — |
case-08 | pass→pass | 14,563 | 9,404 | -35% | 1 | 1 | 0% | 1,675 | 2,428 | +45% | 0 | 0 | — |
case-09 | pass→pass | 13,815 | 4,722 | -66% | 1 | 1 | 0% | 1,479 | 2,551 | +72% | 0 | 0 | — |
case-10 | fail→pass | 17,716 | 13,317 | -25% | 1 | 1 | 0% | 1,938 | 3,309 | +71% | 0 | 0 | — |
case-11 | fail→pass | 11,169 | 10,401 | -7% | 1 | 1 | 0% | 1,725 | 2,624 | +52% | 0 | 0 | — |
case-12 | fail→pass | 13,178 | 7,051 | -46% | 1 | 1 | 0% | 1,507 | 2,942 | +95% | 0 | 0 | — |
case-13 | pass→pass | 13,421 | 3,342 | -75% | 1 | 1 | 0% | 1,311 | 2,249 | +72% | 0 | 0 | — |
case-14 | fail→pass | 10,836 | 10,266 | -5% | 1 | 1 | 0% | 1,820 | 2,629 | +44% | 0 | 0 | — |
case-15 | fail→pass | 12,681 | 3,199 | -75% | 1 | 1 | 0% | 1,263 | 2,161 | +71% | 0 | 0 | — |
case-16 | fail→pass | 14,503 | 9,362 | -35% | 1 | 1 | 0% | 2,116 | 2,454 | +16% | 0 | 0 | — |
case-17 | pass→pass | 18,167 | 3,641 | -80% | 1 | 1 | 0% | 2,238 | 2,342 | +5% | 0 | 0 | — |
case-18 | fail→pass | 7,993 | 8,635 | +8% | 1 | 1 | 0% | 1,081 | 2,308 | +114% | 0 | 0 | — |
case-19 | fail→pass | 11,893 | 11,283 | -5% | 1 | 1 | 0% | 2,015 | 2,892 | +44% | 0 | 0 | — |
case-20 | fail→pass | 51,843 | 17,560 | -66% | 1 | 1 | 0% | 8,234 | 5,479 | -33% | 0 | 0 | — |
case-21 | pass→pass | 11,884 | 18,773 | +58% | 1 | 1 | 0% | 2,326 | 4,377 | +88% | 0 | 0 | — |
case-22 | pass→pass | 18,196 | 9,665 | -47% | 1 | 1 | 0% | 2,308 | 3,513 | +52% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.