Make A Deck
manalkaff/opendesign
A skill your agent uses when the user asks for a slide presentation.
Design rules for editing a slide page: canvas geometry, text height table, type scale, contrast pairs, spacing rhythm and which element type carries which content.
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install THU-MAIC/OpenMAIC slide-craft --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/agent-runtime/slide-craft .claude/skills/slide-craft && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .claude/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craftType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install THU-MAIC/OpenMAIC slide-craft --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/agent-runtime/slide-craft .agents/skills/slide-craft && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .agents/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install THU-MAIC/OpenMAIC slide-craft --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/agent-runtime/slide-craft .cursor/skills/slide-craft && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .cursor/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/THU-MAIC/OpenMAIC.git --path skills/agent-runtime/slide-craft--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install THU-MAIC/OpenMAIC slide-craft --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/agent-runtime/slide-craft .gemini/skills/slide-craft && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .gemini/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install THU-MAIC/OpenMAIC slide-craftInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/agent-runtime/slide-craft .github/skills/slide-craft && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .github/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install THU-MAIC/OpenMAIC slide-craft --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/THU-MAIC/OpenMAIC.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/agent-runtime/slide-craft .opencode/skills/slide-craft && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "slide-craft" agent skill from https://github.com/THU-MAIC/OpenMAIC/tree/main/skills/agent-runtime/slide-craft into .opencode/skills/slide-craft/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "slide-craft", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
slide-craftDesign rules for editing a slide page: canvas geometry, text height table, type scale, contrast pairs, spacing rhythm and which element type carries which content.
This is a standard to edit against, not a procedure: page-clone and pro-editing decide which pages to change, and this skill decides what a good page looks like afterward. It restates the rules the generator used, because patching one element gives you only that page's numbers. The canvas is 1000 by 562.5 with a 50px margin, so elements stay inside left 50 to 950 and top 50 to 512.5.
Alignment follows the page's existing grid: left-aligned content at left 60 or 80, centred content at (1000 - width) / 2, and right-aligned content at 1000 - width - 60. There is no alignment operation, so each position is an explicit number written to one element's own fields. Text boxes have 10px padding and heights come from a table by font size and line count at line-height 1.5, for example 14px up to 36px. The skill also covers the type scale, contrast pairs, spacing and rich-text structure.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7d324aa. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Slide Page Design Rules loads about 3.8k tokens when it runs. Until then it costs about 157 tokens; SKILL.md has 2,277 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from THU-MAIC/OpenMAIC at commit 7d324aa, republished under its MIT licence (© THU-MAIC). 2,277 words, ~3,821 tokens.
.claude/skills/slide-craft/SKILL.md (or your agent's skills folder).Every slide in this runtime was drawn under a long set of rules — the canvas, the height table, the type scale, the spacing standards. The generator that drew the page had all of them in front of it. When you patch one element, you have the page's numbers and nothing else, and the rules are the only way to tell a repair from a dent.
This is that rule set, restated for editing. It is about the page, not the process: which numbers a change has to stay consistent with, and which fields actually reach the screen.
The canvas is 1000 × 562.5. All elements respect a 50px margin, so the
live area is left ∈ [50, 950], top ∈ [50, 512.5], and an element's right
edge (left + width) stays ≤ 950, its bottom edge ≤ 512.5.
The page's own alignment grid, which existing elements are already on:
left = 60 or left = 80.left = (1000 - width) / 2 — recomputed, never guessed.left = 1000 - width - 60.Changing width on centred content changes left too, and they are two separate
writes. Read the neighbours' boxes first and land on the column they are already
using; a lone element 8px off the shared left edge reads as a mistake even though
nothing overflows.
There is no alignment operation. Every position is an explicit number you
write to that element's own left / top / width / height, one path per call,
computed from the neighbours you read. Aligning a row means giving each element the
number the row already uses — not asking the page to tidy itself.
A text element has 10px padding on all four sides, so its usable area is
(width - 20) × (height - 20), and heights come from one table
(line-height 1.5, padding included):
| Font size | 1 line | 2 lines | 3 lines | 4 lines | 5 lines |
|---|---|---|---|---|---|
| 14px | 43 | 64 | 85 | 106 | 127 |
| 16px | 46 | 70 | 94 | 118 | 142 |
| 18px | 49 | 76 | 103 | 130 | 157 |
| 20px | 52 | 82 | 112 | 142 | 172 |
| 24px | 58 | 94 | 130 | 166 | 202 |
| 28px | 64 | 106 | 148 | 190 | 232 |
| 32px | 70 | 118 | 166 | 214 | 262 |
| 36px | 76 | 130 | 184 | 238 | 292 |
When you replace an element's words, re-derive its height instead of keeping the old one:
characters_per_line = (width - 20) / font_size. Keep the longest line at
≤ 75% of that; past 100% the text wraps and takes a row you did not
budget.<p>, plus a wrap for
every paragraph over characters_per_line — then add ~0.8 of a line of
slack and round up.Height is a container, not a clamp: overflowing text spills past the box rather than shrinking, and the page shows the spill. The fix order is shorten the words, then step to the next table row, then widen the box — in that order, because a slide that needs a bigger box usually needs fewer words.
| Content | Size |
|---|---|
| Main title | 32-36px |
| Subtitle | 24-28px |
| Key points | 18-20px |
| Body | 16-18px |
| Caption | 14-16px |
Levels stay 2-4px apart and everything at one level uses one size. When you touch an element, take its size from the siblings that share its role on that page rather than from this table fresh — the page's own scale wins, and this table is how you recognise which level an element belongs to.
Size lives in the content HTML, as inline font-size on the <p> — there is
no font-size field to write. So changing a size means writing the whole content
string back, which means you have to know the markup you are replacing.
The content of a text element is an HTML string, and this page's CSS resets
most tag semantics. Four consequences decide how you write rich text:
<ul> / <ol> render without markers. The stylesheet's reset strips
list-style and the indent, and the rule that puts them back is scoped to
the browser editor — not to classroom playback. A list sent as
<ul><li>…</li></ul> comes out as bare unindented lines. Write bullets the
way the deck itself does: one <p> per item with the marker in the text,
<p style="font-size:18px;">• First point</p>.<h1>–<h6> are inert. The reset sets font-size: inherit and
font-weight: inherit on them, so a heading tag is a <p> with extra
characters. Size and weight come from inline font-size and
<strong>, which do work.<p> tags have no gap between them in a text element — only
line-height separates them. If two lines need air between them, raise the
element's lineHeight or split them into two elements; do not expect an
empty <p>, whose height still costs you a table row.<p> and the newline collapses to a space. Multi-line content must
arrive as real <p> tags, one per line.Anything that looks like a tag is passed through as markup and not escaped, so
prose containing < followed by a letter (if x<y> then) is read as HTML and
mangled. Send that as an escaped entity.
Supported inline styles are font-size, color, text-align, line-height,
font-weight and font-family; supported tags are <p>, <span>,
<strong>/<b>, <em>/<i>, <u>. Nothing else is a contract.
Before you change any colour, name the two things that will sit on top of each
other. Text is legible or not against its immediate backdrop, which is the
shape's fill if it sits on a shape, the text element's own fill if it has
one, and the page background otherwise.
Which field carries which colour:
| Ink | Field |
|---|---|
| Text element glyphs | defaultColor, or inline color in the content |
| Text element backdrop | fill (unset = the page shows through) |
| Shape label glyphs | text.defaultColor |
| Shape body | fill |
| Formula | color on the latex element |
| Rule / arrow | color on the line element |
A colour change is one write to the field the renderer actually reads —
defaultColor or the inline color inside the content for text,
text.defaultColor for a shape label, color for a latex or line element. Read
the source JSON first and preserve its inline spans. opacity on a text element fades the glyphs
and the fill together because it applies to the whole box — it is not a way
to soften a background behind live text.
Aim for ≥ 4.5:1 on body text and ≥ 3:1 on 24px-and-up titles. Two
calibration points from this deck's own palette: #333333 on white is about
12:1 and safe anywhere; the accent #5b9bd5 on white is about 3:1, which
passes for a 32px title and fails for 16px body. The pattern that always
works here is a pale tint fill with dark same-hue text — #1e40af on
#dbeafe, #166534 on #dcfce7, #92400e on #fef3c7, each around 6-7:1.
Recolouring one half of such a pair breaks it; recolour both or neither.
A label inside a card is not an independent element — its box is derived from the shape's:
text.width = shape.width - 40 (20px padding each side)
text.height = a table value ≤ shape.height - 40
text.left = shape.left + (shape.width - text.width) / 2
text.top = shape.top + (shape.height - text.height) / 2Centre points should agree within 2px. So moving the shape is always two edits —
move the shape, then re-derive the label — and a text height that steps up to the
next table row may force the card to grow with it. The classic
wrong repair is giving the label the shape's own left/top, which pins it
to the top-left corner instead of centring it.
Parallel things use identical values, not close ones: three cards in a row
share one width, one height, one top, and one gap. The eye resolves 5px,
so approximation is visible. When you delete one card of a row or duplicate one
into it, respace all of them from the row's own arithmetic rather than
dropping the newcomer next to its neighbour.
The spacing standards the page was built to:
Diagnosing density from the inventory. The boxes tell you the truth
without a render: sort the content elements by top and read the gaps.
A crowded page shows gaps under ~20px and a bottom edge near 512; an empty one
shows one cluster and 150px of dead space below it. Fix crowding by cutting
words and merging elements, not by shrinking font sizes below the scale — a
page whose body text has dropped to 12px is a page with too much content on
it. Fix emptiness by growing the type one level and re-centring the block
vertically, not by adding filler.
The page has ten element types and they are not interchangeable. Getting this wrong is the failure that renders as literal source code on a slide.
\frac{a}{b}.
This holds for the small ones too (x^2, a/b).latex and the server re-renders the cached html the renderer
actually paints. Verify the result with a preview.width is stroke thickness, not length. Length comes
from start/end. Keep stroke at 2-4 (never above 6): the arrowhead is
width × 3 across, so width: 60 draws a 180px arrowhead.width and height together;
writing a new src does not touch the box, so an image of a different shape
needs the box re-derived.Underlines, dividers and highlight bars are shapes whose geometry was computed from the text they decorate. Move or resize the text and they do not follow — recompute them:
left = text.left + 10, width = text.width - 20,
top = text.top + text.height + 8..12, height = 2..4.width 700-900, height 1-2, with 25-35px of clear
space above and below.left = text.left - 15, top = text.top + 0.1 × text.height, height = 0.8 × text.height, width 3-6.An orphaned rule floating beside moved text is one of the most visible signs of a careless patch.
Elements paint in array order; later ones sit on top. Background shapes come before the text they hold. When something is hidden behind something else, the fix is to rewrite the element array in the order you want — never move a box to escape the overlap, and never delete the backdrop.
Check only the elements you touched, and check these:
left/top ≥ 50, right and bottom edges ≤ 950 /
512.5.characters_per_line.Where a preview is available, spend it on the changes this list cannot settle: a formula, a density judgement, or text you suspect overflows.
slide-dsl is the field reference under this one — every element type's
fields, which of them holds the words, what values are legal, and what the
renderer actually does with each of them. It says what you may write; this skill says
what is worth writing. Load it when you need a field name or a legal value.page-clone is the procedure for building a page out of an existing
one. It decides which elements are content and which are skeleton; this skill
decides whether the content you put in them is well made.pro-editing is the procedure for revising a page that already exists —
which operation to reach for, how small to keep it, how to verify. This skill
is what "well made" means once that operation lands.stage-design still governs the build of the stage as a whole.<p> per line, bullet characters instead
of <ul>, inline font-size instead of heading tags.© THU-MAIC, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/agent-runtime/slide-craft of THU-MAIC/OpenMAIC.
Open the folder on GitHubat commit 7d324aa
Slide Page Design Rules next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Slide Page Design Rules this skillTHU-MAIC/OpenMAIC | 40k | — | ~3.8k | Automated safety check: Pass | MIT | |
| Make A Deckmanalkaff/opendesign | 261 | — | ~1.2k | Automated safety check: Pass | MIT | |
| World Class Carouselhappycapy-ai/Happycapy-skills | 137 | — | ~16k | Automated safety check: Notes | MIT | |
| Revealjs Presenterjwynia/agent-skills | 170 | — | ~11k | Automated safety check: Pass | MIT | |
| BrandingIgorWarzocha/Opencode-Workflows | 122 | — | ~586 | Automated safety check: Pass | None | |
| Theme Factoryanthropics/skills | 180k | 47 repos | ~781 | Automated safety check: Pass | Apache-2.0 |
manalkaff/opendesign
A skill your agent uses when the user asks for a slide presentation.
happycapy-ai/Happycapy-skills
Generate world-class Instagram carousel content on any topic.
jwynia/agent-skills
Generate RevealJS HTML presentations with reliable layout, professional typography, and effective visual communication.
IgorWarzocha/Opencode-Workflows
Apply official brand colors and typography to professional artifacts.
anthropics/skills
Applies one of ten preset color and font themes to slide decks, documents or HTML pages, or creates a new theme on the fly after you choose from a showcase.
VectifyAI/OpenKB
A skill your agent uses when the user asks the openkb chat to make a deck / slide presentation / PPT / slides / 演示稿 / 幻灯片 from their compiled KB content AND wants a dark, high-tech, neon / glow /…
THU-MAIC/OpenMAIC
Guides setup, classroom generation and secondary development for OpenMAIC, the multi-agent interactive classroom, one confirmed phase at a time.
THU-MAIC/OpenMAIC
Designs a Chinese K-12 classroom for one OpenMAIC stage around the core-literacy model, using authentic tasks, performance assessment and observable evidence.
THU-MAIC/OpenMAIC
Maps the structure of an OpenMAIC stage document so an agent can find the right path, read it and patch quizzes, widgets, actions and project pages without guessing.
THU-MAIC/OpenMAIC
Designs a review-and-practice lesson around an independent first attempt, targeted feedback, supported practice, a fresh independent check and a next step.
THU-MAIC/OpenMAIC
Derives a reusable personal skill for course-making from a representative sample of the user's own past classrooms and chat history, confirmed with them before saving.
THU-MAIC/OpenMAIC
Plans a multi-classroom series such as a seven-day course, clarifies the brief in rounds, gets sign-off on the full lesson list, then builds each stage in a shared folder.
Categories
Design rules for editing a slide page: canvas geometry, text height table, type scale, contrast pairs, spacing rhythm and which element type carries which content. This is a standard to edit against, not a procedure: page-clone and pro-editing decide which pages to change, and this skill decides what a good page looks like afterward. It restates the rules the generator used, because patching one element gives you only that page's numbers.
Slide Page Design Rules fits situations like: patching slide elements one at a time without breaking the page; fixing a colour or contrast problem on a slide; resizing text inside a box or fixing a crowded or empty page; writing replacement content that needs real rich-text structure.
Run `npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a claude-code`. Or copy the skill folder (skills/agent-runtime/slide-craft in THU-MAIC/OpenMAIC) into .claude/skills/slide-craft in your project. Claude Code loads it when a task matches its description.
Run `npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a codex`. Or copy the skill folder (skills/agent-runtime/slide-craft in THU-MAIC/OpenMAIC) into .agents/skills/slide-craft in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add THU-MAIC/OpenMAIC --skill slide-craft -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/slide-craft, .gemini/skills/slide-craft, .github/skills/slide-craft and .opencode/skills/slide-craft in your project.
SKILL.md names no scripts, command-line tools or credentials: Slide Page Design Rules is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Slide Page Design Rules is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.8k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Slide Page Design Rules: Make A Deck (manalkaff/opendesign, 261 stars), World Class Carousel (happycapy-ai/Happycapy-skills, 137 stars), Revealjs Presenter (jwynia/agent-skills, 170 stars) and Branding (IgorWarzocha/Opencode-Workflows, 122 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
THU-MAIC (a GitHub organization) maintains it in THU-MAIC/OpenMAIC, which has 40,274 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 10, 2026.
Source: THU-MAIC/OpenMAIC on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.