Theme Factory
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.
Create polished HTML slide decks and PDF-ready documents for consulting deliverables.
$ npx skills add thatrebeccarae/claude-marketing --skill pro-deck-builder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install thatrebeccarae/claude-marketing pro-deck-builder --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/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pro-deck-builder .claude/skills/pro-deck-builder && 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 "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .claude/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builderType 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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install thatrebeccarae/claude-marketing pro-deck-builder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/pro-deck-builder .agents/skills/pro-deck-builder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .agents/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install thatrebeccarae/claude-marketing pro-deck-builder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/pro-deck-builder .cursor/skills/pro-deck-builder && 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 "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .cursor/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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/thatrebeccarae/claude-marketing.git --path skills/pro-deck-builder--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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install thatrebeccarae/claude-marketing pro-deck-builder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/pro-deck-builder .gemini/skills/pro-deck-builder && 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 "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .gemini/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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 thatrebeccarae/claude-marketing pro-deck-builderInstalls 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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/pro-deck-builder .github/skills/pro-deck-builder && 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 "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .github/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install thatrebeccarae/claude-marketing pro-deck-builder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thatrebeccarae/claude-marketing.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/pro-deck-builder .opencode/skills/pro-deck-builder && 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 "pro-deck-builder" agent skill from https://github.com/thatrebeccarae/claude-marketing/tree/main/skills/pro-deck-builder into .opencode/skills/pro-deck-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pro-deck-builder", 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.
pro-deck-builderCreate polished HTML slide decks and PDF-ready documents for consulting deliverables.
Pro Deck Builder is an agent skill from thatrebeccarae/claude-marketing. Create polished HTML slide decks and PDF-ready documents for consulting deliverables. Uses the RRBC design system with warm light mode, dark mode cover pages, Lora/Inter/Roboto Mono typography, and data visualization palette. Trigger on 'deck', 'slides', 'presentation', 'pitch deck', 'keynote', 'report', or 'PDF'.
Its SKILL.md is about 6.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `EXAMPLES.md` and `REFERENCE.md`).
It sits in Frontend & Design, covering Slides and decks, Theming and dark mode and Typography. It works with Microsoft PowerPoint. The repository describes itself as: A full marketing department for Claude Code. Skill packs for Klaviyo, Shopify, GA4, Looker Studio, paid media, and more. Audit, optimize, and report using natural language. The licence is MIT.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a8a63ec. 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.
Shell commands in SKILL.md call:
pythonnpmgitpdftoppmpipFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, git and pip, which can reach the network depending on how they are called.
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.
Pro Deck Builder loads about 6.1k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 2,323 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 thatrebeccarae/claude-marketing at commit a8a63ec, republished under its MIT licence (© thatrebeccarae). 2,323 words, ~6,095 tokens.
.claude/skills/pro-deck-builder/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.VC-backed SaaS design quality for PowerPoint. Think Linear, Attio, Vercel, Raycast — not corporate clip art.
git clone https://github.com/thatrebeccarae/claude-marketing.git && cp -r claude-marketing/skills/pro-deck-builder ~/.claude/skills/| Task | Approach |
|---|---|
| Create from scratch | Read REFERENCE.md, use PptxGenJS |
| Edit existing / use template | Read editing.md |
| Read/extract content | python -m markitdown presentation.pptx |
| Visual overview | python scripts/thumbnail.py presentation.pptx |
Before writing any code, ask:
Check what's installed — premium fonts make a massive difference:
# macOS — list all installed font families
fc-list : family | sort -u
# Search for premium fonts first
fc-list : family | grep -iE "inter|dm.sans|poppins|avenir|futura|geist|sf.pro|sf.mono|jetbrains|fira.code|montserrat|playfair|source.sans"
# Check macOS Font Book directories directly
ls ~/Library/Fonts/ /Library/Fonts/ /System/Library/Fonts/Supplemental/ 2>/dev/nullPriority order for font selection:
For data/mono: JetBrains Mono > Fira Code > SF Mono > Consolas
The user picks one mode for the entire deck. Never mix modes within a deck.
| Token | Value | Use |
|---|---|---|
bg-primary | 0A0A0C | Slide backgrounds (deep space black) |
bg-surface | 17181A | Cards, panels (deep slate) |
bg-elevated | 1E1F23 | Elevated surfaces, hover states |
bg-glass | FFFFFF at 4% opacity | Translucent overlays |
text-primary | FFFFFF | Headlines, key content |
text-secondary | A0A0A0 | Body text, descriptions |
text-muted | 5A5A5E | Captions, metadata, labels |
border-subtle | FFFFFF at 8% opacity | Card borders |
| Token | Value | Use |
|---|---|---|
bg-primary | FFFFFF | Slide backgrounds |
bg-surface | F8F9FA | Cards, panels |
bg-elevated | FFFFFF | Elevated surfaces (use shadow) |
text-primary | 111111 | Headlines, key content |
text-secondary | 555555 | Body text, descriptions |
text-muted | 999999 | Captions, metadata, labels |
border-subtle | E8E8E8 | Card borders |
Each palette defines one accent color (used at 10%) plus semantic status colors. The accent is the personality — everything else is neutral.
| Name | Accent | Hex | Best For |
|---|---|---|---|
| Electric Blue | Intense azure | 0055FF | SaaS, tech, product |
| Neon Lime | Acid green | 39FF14 | Dev tools, performance |
| Hot Coral | Warm energy | FF6B6B | Marketing, creative |
| Indigo | Deep purple | 6366F1 | Startups, AI/ML |
| Teal Trust | Cool confidence | 0D9488 | Healthcare, finance |
| Amber Signal | Warm authority | F59E0B | Consulting, strategy |
| Rose | Refined pink | F43F5E | Design, brand, luxury |
| Emerald | Growth green | 10B981 | Sustainability, success |
| Cyan Edge | Sharp blue-green | 06B6D4 | Data, analytics |
| Violet | Creative depth | 8B5CF6 | Education, innovation |
| Slate | No accent | 64748B | Minimal, understated |
| Gold Standard | Financial premium | D4AF37 | Investor, board decks |
If the user provides brand colors, build a custom palette:
const palette = {
accent: "0055FF", // primary brand color
accentMuted: "0055FF" + " at 15% opacity", // for tinted backgrounds
positive: "10B981", // good, up, success
warning: "F59E0B", // attention, caution
critical: "EF4444", // bad, down, error
};Run font discovery (Step 2 above), then pick:
| Priority | Header | Body | Data/Mono | Vibe |
|---|---|---|---|---|
| 1st | Inter 700 | Inter 400 | JetBrains Mono | Linear/Vercel |
| 2nd | DM Sans 700 | DM Sans 400 | Fira Code | Geometric startup |
| 3rd | Avenir Next Bold | Avenir 400 | SF Mono | Apple-adjacent |
| 4th | Poppins 700 | Poppins 400 | JetBrains Mono | Friendly modern |
| Safe | Calibri Bold | Calibri | Consolas | Always available |
For editorial/financial decks:
| Header | Body | Vibe |
|---|---|---|
| DM Serif Display | DM Sans | Sophisticated editorial |
| Playfair Display | Source Sans Pro | Luxury, financial |
| Georgia | Calibri | Classic corporate |
| Role | Size | Weight | Use |
|---|---|---|---|
| Hero title | 54-72pt | Bold (700) | Title slide only |
| Slide title | 32-40pt | Bold (700) | Every content slide |
| Section header | 20-24pt | Semibold (600) | Within-slide sections |
| Body text | 14-16pt | Regular (400) | Paragraphs, bullets |
| Captions/meta | 10-12pt | Regular (400) | Footnotes, sources |
| Big KPI number | 48-72pt | Bold (700) | Dashboard callouts |
| KPI label | 9-10pt | Semibold, ALL CAPS, +tracking | Below KPI numbers |
| Data/numbers | 11-14pt | Mono regular | Tables, data labels |
Big numbers and titles WILL overflow if you use a fixed font size without checking content length. Use these rules:
Big KPI Numbers — scale font to character count:
| Characters | Example | Max Font Size (card) | Max Font Size (standalone) |
|---|---|---|---|
| 1–4 | $4.2M | 48pt | 72pt |
| 5–7 | $5,307K | 36pt | 54pt |
| 8–10 | $5,307,540 | 28pt | 44pt |
| 11+ | $12,345,678 | 22pt | 36pt |
Rule: prefer abbreviated numbers. $5.3M > $5,307,540. Only use full numbers in tables or footnotes where precision matters.
Slide Titles — max characters before wrapping:
| Font Size | Max Chars (~9" wide) | If Longer |
|---|---|---|
| 54pt | ~30 | Reduce to 44pt or rewrite shorter |
| 44pt | ~38 | Reduce to 36pt or rewrite shorter |
| 36pt | ~46 | Reduce to 32pt or rewrite shorter |
| 32pt | ~52 | Use subtitle for overflow |
Rule: count characters before setting fontSize. Never let content slide titles wrap to 2 lines. Section dividers can wrap.
Body Text in Narrow Containers (Insight Panels, Sidebars):
Text overflow in narrow panels (< 4" wide) is a common problem. PptxGenJS does not auto-shrink text. Apply these rules:
| Container Width | Max fontSize | Max chars per line (~) | Max lines at 1.25x spacing |
|---|---|---|---|
| 4.0"+ | 14pt | ~55 | Height ÷ 0.22" |
| 3.0-3.9" | 11pt | ~45 | Height ÷ 0.18" |
| 2.0-2.9" | 10pt | ~35 | Height ÷ 0.16" |
| < 2.0" | 9pt | ~25 | Height ÷ 0.15" |
Rule: estimate line count before adding text. Count characters in your text, divide by max chars per line to get line count, then verify it fits in the container height. If it doesn't fit: (1) reduce fontSize, (2) shorten the text, or (3) increase the container. Never let text silently overflow — it gets clipped or overlaps adjacent elements.
// ✅ CORRECT: 2.8" panel → max 10pt, ~35 chars/line
// "Welcome series dominates at 62%..." = 90 chars ≈ 3 lines
// Container h: 1.6" → fits ~10 lines at 10pt. Safe.
s.addText("Short, edited copy.", {
x: 6.55, y: 1.45, w: 2.7, h: 1.6,
fontSize: 10, fontFace: theme.font.body,
});
// ❌ WRONG: 2.8" panel with 14pt font and 200+ char paragraph
s.addText("Very long paragraph that will overflow...", {
x: 6.55, y: 1.45, w: 2.8, h: 1.6,
fontSize: 14, fontFace: theme.font.body, // too large for narrow panel
});Always format chart numbers for readability — raw numbers like "1000000" are never acceptable on axes OR data labels.
CRITICAL: valAxisLabelFormatCode only formats the AXIS. Data labels from showValue: true are formatted separately via dataLabelFormatCode. If you set valAxisLabelFormatCode but not dataLabelFormatCode, data labels will show raw unformatted numbers like "2888000". numFmt is NOT a valid PptxGenJS property — always use dataLabelFormatCode.
Preferred approach — OOXML conditional format with raw values: Use raw (unscaled) values and let OOXML conditional number formatting handle the display. This is the most reliable approach and handles mixed-magnitude data (e.g., a chart with both $2.9M and $3.6K values).
// ✅ BEST: Raw values + OOXML conditional format
// Under 1K: whole number ($500)
// 1K-999K: X.XXK ($540.18K, $57.72K)
// 1M+: X.XM ($2.9M)
const currFmt = '[>=1000000]"$"#,##0.0,,"M";[>=1000]"$"#,##0.00,"K";"$"#,##0';
values: [2888000, 717734, 425467, 3655], // raw dollar values
dataLabelFormatCode: currFmt, // conditional brackets OK here
valAxisLabelFormatCode: '"$"#,##0.0,,"M"', // simple format only (no brackets)// ✅ ALSO OK: Pre-scale when all values are same magnitude
values: [2888, 718, 425], // raw values divided by 1000
dataLabelFormatCode: '"$"#,##0"K"',
valAxisLabelFormatCode: '"$"#,##0"K"',// ❌ WRONG: Raw values with axis-only format
values: [2888000, 718000, 425000],
valAxisLabelFormatCode: "$#,##0,K", // axis may format but data labels show 2888000
// ❌ WRONG: numFmt (not a valid PptxGenJS property)OOXML conditional format reference (use with RAW values):
| Data Range | Format Code | Renders As |
|---|---|---|
| Currency (auto-scale) | '[>=1000000]"$"#,##0.0,,"M";[>=1000]"$"#,##0.00,"K";"$"#,##0' | $2.9M, $540.18K, $500 |
| Plain number (auto-scale) | '[>=1000000]#,##0.0,,"M";[>=1000]#,##0.00,"K";#,##0' | 2.9M, 540.18K, 500 |
| Percentage | '0%' | 50%, 85% |
Format code syntax: OOXML supports up to 2 conditions in brackets + a default: [condition1]format1;[condition2]format2;defaultFormat. Each trailing , divides by 1,000 (so ,, divides by 1M).
IMPORTANT: valAxisLabelFormatCode does NOT support OOXML conditional brackets [>=1000]. Use a simple format for the axis based on the data range:
| Axis Range | valAxisLabelFormatCode | Renders As |
|---|---|---|
| Up to ~999K | '"$"#,##0,"K"' | $0K, $100K, $500K |
| Up to ~10M+ | '"$"#,##0.0,,"M"' | $0.0M, $0.5M, $1.0M |
| Up to ~999 | '"$"#,##0' | $0, $100, $500 |
Use the conditional currFmt for dataLabelFormatCode (which supports brackets), but a simple format for valAxisLabelFormatCode. Always set showValue: true with dataLabelPosition: "outEnd" on bar charts so readers can see exact values without tracing to the axis.
| Token | Value | Use |
|---|---|---|
xs | 0.125" | Within grouped elements |
sm | 0.25" | Label to value, icon to text |
md | 0.375" | Between sections within a card |
lg | 0.5" | Between cards, major sections |
xl | 0.75" | Between content zones |
Margins: 0.5" from all edges
Content area: 9.0" wide × ~4.5" tall
Title zone: y = 0.3"
Content zone: y = 1.0" to y = 5.0"
Footer zone: y = 5.2"
Card gap: 0.25" - 0.3"find ~/Desktop ~/Downloads ~/Documents -maxdepth 3 -iname "*logo*" \( -name "*.png" -o -name "*.svg" -o -name "*.jpg" \) 2>/dev/null| Slide Type | Position | Size | Notes |
|---|---|---|---|
| Title slide (top-left) | x:0.5, y:0.4 | w:1.5, h:0.5 | Subtle brand mark |
| Title slide (centered) | x:4.0, y:0.8 | w:2.0, h:0.7 | Above title text |
| Content slides | x:8.5, y:0.2 | w:1.0, h:0.35 | Top-right corner, every slide |
| Closing slide | x:3.5, y:1.5 | w:3.0, h:1.0 | Centered, hero size |
sizing: { type: "contain", w, h } to preserve aspect rationpm install -g react-icons react react-dom sharpPrefer Lucide (react-icons/lu) or Feather (react-icons/fi) — they match the Linear/Vercel icon language.
| Package | Import | Style |
|---|---|---|
react-icons/lu | Lucide | Linear-style, clean |
react-icons/fi | Feather | Thin, modern |
react-icons/hi2 | Heroicons v2 | Apple-ish |
react-icons/tb | Tabler | Consistent strokes |
| Context | Display Size | Color |
|---|---|---|
| KPI card icon | 0.35" × 0.35" | Accent on dark, muted on light |
| Feature row icon | 0.4" × 0.4" | White inside accent circle |
| Section divider | 0.5" × 0.5" | Accent color |
| Inline bullet | 0.25" × 0.25" | text-secondary |
Many slides end with a highlighted callout box (recommendation, key insight, total impact). These must be visually identical across all slides:
| Property | Value | Notes |
|---|---|---|
| Box height | 0.6" | Always 0.6" — never 0.5", 0.7", 0.9" |
| Text height | 0.5" | Fits inside 0.6" box with padding |
| Font size | 11pt | Always 11pt bold — never 12pt or 13pt |
| Font | theme.font.body | Bold, left-aligned, valign: "middle" |
| Box x/w | x: 0.5, w: 9.0 | Full content width |
| Text x/w | x: 0.7, w: 8.6 | Inset 0.2" from box edges |
| Text y offset | box y + 0.05" | Centers text vertically in box |
| Corner radius | 0.06" | Consistent across all callouts |
// Standard bottom callout — copy this pattern exactly
s.addShape(pres.shapes.RECTANGLE, {
x: 0.5, y: calloutY, w: 9.0, h: 0.6,
fill: { color: "DCFCE7" }, // or theme.accentMuted, "FEF3C7", etc.
line: { color: theme.status.positive, width: 0.75 },
rectRadius: 0.06,
});
s.addText("Callout text here.", {
x: 0.7, y: calloutY + 0.05, w: 8.6, h: 0.5,
fontSize: 11, fontFace: theme.font.body, bold: true,
color: "166534", align: "left", valign: "middle",
});Always calculate the table bottom position before placing a callout below it. PptxGenJS tables don't auto-report their height, so you must compute it:
tableBottom = tableY + (rowCount × rowH)
calloutY = tableBottom + 0.15" // minimum 0.15" gapVerify calloutY + 0.6" (callout height) < 5.2" (footer zone). If it doesn't fit, reduce rowH or table font sizes — never let the callout overlap the footer.
| Rows (incl header) | rowH: 0.32" | rowH: 0.36" | rowH: 0.42" | rowH: 0.48" | rowH: 0.55" |
|---|---|---|---|---|---|
| 6 rows | 1.92" | 2.16" | 2.52" | 2.88" | 3.30" |
| 7 rows | 2.24" | 2.52" | 2.94" | 3.36" | 3.85" |
| 8 rows | 2.56" | 2.88" | 3.36" | 3.84" | 4.40" |
| 11 rows | 3.52" | 3.96" | 4.62" | — | — |
With table starting at y: 1.0" and callout needing 0.75" (0.15" gap + 0.6" box), the table height limit is 3.45" to stay above footer. Choose rowH accordingly.
Repeated elements MUST use identical dimensions across all slides:
dataLabelFontSize, catAxisLabelFontSize, and valAxisLabelFontSize across all of themhdr()) and cell style (cell()) should be defined once as helpers and reusedRule: define reusable constants at the top of the script for any dimension that appears on more than one slide.
Never repeat the same layout more than twice consecutively. Rotate through:
| Type | When | Elements |
|---|---|---|
| Title Slide | Opening/closing | Hero text, subtitle, logo, date |
| KPI Dashboard | Executive summary | 3-5 cards, big numbers |
| Chart + Insight | Data with context | 60/40 split |
| Full-Width Chart | Chart IS the story | Full span, callout overlay |
| Icon Feature Grid | Features, pillars | 3-4 icon+text rows |
| Data Table | Financials, comparisons | Styled rows, mono numbers |
| Section Divider | Between sections | Bold title on dark/accent bg |
| Quote | Testimonials | Large italic, attribution |
| Big Number | Single key stat | Huge centered metric |
| Comparison | Before/after, vs. | Side-by-side columns |
| Image + Text | Products, case studies | Half-bleed image |
| Closing | End | Logo, CTA, contact |
bg-surface + subtle borderbullet: trueshowValue: true, you MUST also set dataLabelFormatCode. valAxisLabelFormatCode alone does NOT format data labels. Use OOXML conditional formats with raw values for best results.tableBottom = tableY + (rows × rowH) and place the callout at tableBottom + 0.15" minimum. Never hardcode callout y-positions without verifying they clear the table.dataLabelFontSize, catAxisLabelFontSize, and valAxisLabelFontSize values. Define these as constants and reuse them.Assume there are problems. First render is never correct.
python -m markitdown output.pptx
python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|placeholder|click to"python scripts/office/soffice.py --headless --convert-to pdf output.pptx
pdftoppm -jpeg -r 150 output.pdf slideSubagent prompt:
Inspect these slides. Assume issues exist — find them.
Look for:
- TEXT OVERFLOW: Numbers or titles that wrap to a second line inside their container. Also check body text in narrow panels (<4" wide) — long paragraphs at font sizes >11pt will overflow.
- ACCENT LINES: Any thin horizontal bars/lines under titles or headings (must be removed)
- CHART DATA LABELS: Raw unformatted numbers on data labels (e.g., "2888000" instead of "$2,889K"). This is the #1 chart bug — valAxisLabelFormatCode does NOT format data labels.
- CHART AXES: Raw unformatted numbers on axes (should be $500K not 500000)
- Overlapping elements, cramped spacing (<0.3"), insufficient margins (<0.5")
- Low contrast, text-only slides, repeated layouts, placeholder text
- Mode inconsistency (light elements on dark or vice versa)
- Big numbers that should be abbreviated ($5.3M not $5,307,540)
- CALLOUT INCONSISTENCY: Bottom callout boxes with different heights, font sizes, or padding across slides (all must be h:0.6", fontSize:11)
- TABLE-CALLOUT OVERLAP: Callout boxes overlapping tables — calculate tableY + (rows × rowH) and verify callout clears it
- CHART FONT INCONSISTENCY: Different dataLabelFontSize, catAxisLabelFontSize, or valAxisLabelFontSize between charts on different slidesFix → re-render → inspect → repeat until clean. Complete at least one fix cycle.
npm install -g pptxgenjs # Creation
npm install -g react-icons react react-dom sharp # Icons
pip install "markitdown[pptx]" Pillow # Reading + QA
# Also: LibreOffice (soffice) + Poppler (pdftoppm) for visual QARead REFERENCE.md for PptxGenJS API patterns and complete slide composition code for both light and dark modes.
If brand-profile.json exists in the working directory, read it before building decks. Override the default RRBC palette with the brand's colors (primary, secondary, background), use brand fonts when available (fall back to system fonts), and include the brand name on title slides and headers. This profile is produced by the brand-dna skill.
© thatrebeccarae, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files in skills/pro-deck-builder of thatrebeccarae/claude-marketing.
Open the folder on GitHubat commit a8a63ec
Pro Deck Builder 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 |
|---|---|---|---|---|---|---|
| Pro Deck Builder this skillthatrebeccarae/claude-marketing | 162 | — | ~6.1k | Automated safety check: Pass | MIT | |
| Theme Factoryanthropics/skills | 180k | 48 repos | ~781 | Automated safety check: Pass | Apache-2.0 | |
| Visual Brand Extractorgooseworks-ai/goose-skills | 1.2k | 1 repos | ~3.8k | Automated safety check: Pass | MIT | |
| Refactoring UIwondelai/skills | 2.4k | — | ~3.9k | Automated safety check: Pass | MIT | |
| Design System Generatemohitagw15856/pm-claude-skills | 1.4k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Openkb Deck NeonVectifyAI/OpenKB | 4.8k | 1 repos | ~4.3k | Automated safety check: Pass | Apache-2.0 |
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.
gooseworks-ai/goose-skills
Extract visual branding (colors, typography, layout patterns) from a client's website and generate a style preset compatible with the HTML slides skill and a brand config JSON for the content asset…
wondelai/skills
Audit and fix visual hierarchy, spacing, color, and depth in web UIs.
mohitagw15856/pm-claude-skills
Generate a complete, accessibility-checked design system from scratch — colour ramps, type scale, spacing, elevation, and exports for CSS, Tailwind, design tokens, Figma, VS Code and PowerPoint.
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 /…
DejavuMoe/Smoji
Create polished design artifacts as self-contained HTML: UI mockups, interactive prototypes, wireframes, landing pages, dashboards, app screens, mobile apps, slide decks (a.k.a.
thatrebeccarae/claude-marketing
Analyze Google Analytics data, review website performance metrics, identify traffic patterns, and suggest data-driven improvements.
thatrebeccarae/claude-marketing
Comprehensive content marketing toolkit with brand voice analysis, SEO optimization scripts, content frameworks, social media strategy, and content calendar planning.
thatrebeccarae/claude-marketing
Klaviyo marketing operations and analyst expertise. An agent skill from thatrebeccarae/claude-marketing.
thatrebeccarae/claude-marketing
Klaviyo API and developer integration expertise. An agent skill from thatrebeccarae/claude-marketing.
thatrebeccarae/claude-marketing
Looker Studio (formerly Google Data Studio) expertise. An agent skill from thatrebeccarae/claude-marketing.
thatrebeccarae/claude-marketing
Shopify e-commerce platform marketing expertise. An agent skill from thatrebeccarae/claude-marketing.
Works with
Categories
Create polished HTML slide decks and PDF-ready documents for consulting deliverables. Pro Deck Builder is an agent skill from thatrebeccarae/claude-marketing. Create polished HTML slide decks and PDF-ready documents for consulting deliverables.
Pro Deck Builder fits situations like: tasks that involve Slides and decks; tasks that involve Theming and dark mode; tasks that involve Typography.
Run `npx skills add thatrebeccarae/claude-marketing --skill pro-deck-builder -a claude-code`. Or copy the skill folder (skills/pro-deck-builder in thatrebeccarae/claude-marketing) into .claude/skills/pro-deck-builder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add thatrebeccarae/claude-marketing --skill pro-deck-builder -a codex`. Or copy the skill folder (skills/pro-deck-builder in thatrebeccarae/claude-marketing) into .agents/skills/pro-deck-builder 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 thatrebeccarae/claude-marketing --skill pro-deck-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pro-deck-builder, .gemini/skills/pro-deck-builder, .github/skills/pro-deck-builder and .opencode/skills/pro-deck-builder in your project.
Going by SKILL.md and its folder, Pro Deck Builder needs the command-line tools its instructions call (python, npm, git, pdftoppm and pip). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use npm, git and pip, which can reach the network depending on how they are called. 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.
Pro Deck Builder is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.1k tokens (SKILL.md is roughly 24k 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 Pro Deck Builder: Theme Factory (anthropics/skills, 180k stars), Visual Brand Extractor (gooseworks-ai/goose-skills, 1.2k stars), Refactoring UI (wondelai/skills, 2.4k stars) and Design System Generate (mohitagw15856/pm-claude-skills, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
thatrebeccarae (a GitHub user) maintains it in thatrebeccarae/claude-marketing, which has 162 GitHub stars. The repository holds 55 skills in this directory. The repository was last updated on May 14, 2026.
Source: thatrebeccarae/claude-marketing on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.