Slides
fcakyon/claude-codex-settings
Create and edit presentation slide decks (.pptx) with PptxGenJS, bundled layout helpers, and render/validation utilities.
Create professional PowerPoint presentations with python-pptx.
$ npx skills add LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills claw-presentation-creator --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/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/claw-presentation-creator .claude/skills/claw-presentation-creator && 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 "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .claude/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creatorType 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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills claw-presentation-creator --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/claw-presentation-creator .agents/skills/claw-presentation-creator && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .agents/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills claw-presentation-creator --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/claw-presentation-creator .cursor/skills/claw-presentation-creator && 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 "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .cursor/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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/LeoYeAI/openclaw-master-skills.git --path skills/claw-presentation-creator--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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills claw-presentation-creator --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/claw-presentation-creator .gemini/skills/claw-presentation-creator && 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 "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .gemini/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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 LeoYeAI/openclaw-master-skills claw-presentation-creatorInstalls 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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/claw-presentation-creator .github/skills/claw-presentation-creator && 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 "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .github/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills claw-presentation-creator --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/claw-presentation-creator .opencode/skills/claw-presentation-creator && 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 "claw-presentation-creator" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/claw-presentation-creator into .opencode/skills/claw-presentation-creator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claw-presentation-creator", 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.
claw-presentation-creatorCreate professional PowerPoint presentations with python-pptx.
Claw Presentation Creator is an agent skill from LeoYeAI/openclaw-master-skills. Create professional PowerPoint presentations with python-pptx. Supports slides, charts, tables, images, and templates.
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `_meta.json`).
It sits in Documents & Office, covering Slides and decks and PowerPoint presentations. It works with python-pptx. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. 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:
pipnpmpythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip and npm, 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.
Claw Presentation Creator loads about 4.5k tokens when it runs. Until then it costs about 36 tokens; SKILL.md has 121 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 LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 121 words, ~4,488 tokens.
.claude/skills/claw-presentation-creator/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Complete PowerPoint presentation creation and editing using python-pptx. Supports all common slide operations including text, images, charts, tables, and animations.
pip install python-pptx pillow# For advanced chart support
pip install numpy
# For HTML conversion (advanced)
npm install puppeteer dom-to-pptxfrom pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Hello World"
prs.save('presentation.pptx')
print("✓ Presentation created!")from pptx import Presentation
prs = Presentation()
# Title slide
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "My Presentation"
slide.placeholders[1].text = "Subtitle here"
# Content slide
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Agenda"
slide.placeholders[1].text = "• Point 1\n• Point 2\n• Point 3"
prs.save('output.pptx')from pptx import Presentation
prs = Presentation()
# Available layouts (indices may vary by template)
# 0 - Title Slide
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Title"
slide.placeholders[1].text = "Subtitle"
# 1 - Title and Content
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Heading"
slide.placeholders[1].text = "Content here"
# 2 - Section Header
slide = prs.slides.add_slide(prs.slide_layouts[2])
# 3 - Two Content
slide = prs.slides.add_slide(prs.slide_layouts[3])
# 4 - Comparison
slide = prs.slides.add_slide(prs.slide_layouts[4])
# 5 - Title Only
slide = prs.slides.add_slide(prs.slide_layouts[5])
# 6 - Blank
slide = prs.slides.add_slide(prs.slide_layouts[6])from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])
# Title formatting
title = slide.shapes.title
title.text = "Formatted Title"
title.text_frame.paragraphs[0].font.name = 'Arial'
title.text_frame.paragraphs[0].font.size = Pt(36)
title.text_frame.paragraphs[0].font.bold = True
title.text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 0, 0)
# Content formatting
content = slide.placeholders[1]
tf = content.text_frame
tf.text = "First paragraph"
# Add paragraph with formatting
p = tf.add_paragraph()
p.text = "Second paragraph"
p.level = 0 # Indentation level
p.alignment = PP_ALIGN.LEFT
# Run-level formatting (within paragraph)
run = p.add_run()
run.text = "Bold text"
run.font.bold = True
run.font.size = Pt(14)
run.font.name = 'Arial'
run.font.color.rgb = RGBColor(0, 112, 192) # Blue
run = p.add_run()
run.text = " and "
run = p.add_run()
run.text = "italic text"
run.font.italic = Truefrom pptx import Presentation
from pptx.util import Inches
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5]) # Blank layout
# Add image
left = top = Inches(1)
slide.shapes.add_picture(
'image.jpg',
left,
top,
width=Inches(5),
height=Inches(3) # Optional, maintains aspect ratio if omitted
)
# Add image with caption
slide.shapes.add_picture('logo.png', Inches(1), Inches(5), width=Inches(2))
# Add textbox for caption
txBox = slide.shapes.add_textbox(Inches(3.2), Inches(5), Inches(3), Inches(1))
tf = txBox.text_frame
tf.text = "Image caption here"
prs.save('with-image.pptx')from pptx import Presentation
from pptx.util import Inches
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
# Add table: 3 rows, 3 columns
rows = cols = 3
left = top = Inches(2)
width = Inches(6)
height = Inches(2)
table = slide.shapes.add_table(rows, cols, left, top, width, height).table
# Set column widths
table.columns[0].width = Inches(2)
table.columns[1].width = Inches(2)
table.columns[2].width = Inches(2)
# Fill data
table.cell(0, 0).text = 'Header 1'
table.cell(0, 1).text = 'Header 2'
table.cell(0, 2).text = 'Header 3'
table.cell(1, 0).text = 'Row 1'
table.cell(1, 1).text = 'Data 1'
table.cell(1, 2).text = 'Data 2'
table.cell(2, 0).text = 'Row 2'
table.cell(2, 1).text = 'Data 3'
table.cell(2, 2).text = 'Data 4'
# Format cells
cell = table.cell(0, 0)
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192) # Blue header
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
cell.text_frame.paragraphs[0].font.bold = True
# Center align all cells
for row in table.rows:
for cell in row.cells:
cell.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
prs.save('with-table.pptx')from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
# Prepare chart data
chart_data = CategoryChartData()
chart_data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
chart_data.add_series('Revenue', (100000, 150000, 200000, 250000))
chart_data.add_series('Expenses', (80000, 100000, 120000, 140000))
# Add chart
x, y, cx, cy = Inches(1), Inches(1), Inches(8), Inches(5)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, # Chart type
x, y, cx, cy,
chart_data
).chart
# Customize chart
chart.has_title = True
chart.chart_title.text_frame.text = 'Quarterly Financials'
chart.value_axis.has_major_gridlines = True
chart.category_axis.tick_labels.font.size = Pt(10)
prs.save('with-chart.pptx')from pptx.enum.chart import XL_CHART_TYPE
# Available chart types
XL_CHART_TYPE.COLUMN_CLUSTERED # Clustered column
XL_CHART_TYPE.COLUMN_STACKED # Stacked column
XL_CHART_TYPE.BAR_CLUSTERED # Clustered bar
XL_CHART_TYPE.LINE # Line chart
XL_CHART_TYPE.PIE # Pie chart
XL_CHART_TYPE.PIE_EXPLODED # Exploded pie
XL_CHART_TYPE.AREA # Area chart
XL_CHART_TYPE.XY_SCATTER # Scatter plot
XL_CHART_TYPE.BUBBLE # Bubble chart
XL_CHART_TYPE.DOUGHNUT # Doughnut chart
XL_CHART_TYPE.RADAR # Radar chartfrom pptx import Presentation
from pptx.util import Inches
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
# Add rectangle
shape = slide.shapes.add_shape(
MSO_SHAPE.ROUNDED_RECTANGLE,
Inches(1), Inches(1), Inches(3), Inches(2)
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0, 112, 192)
shape.line.color.rgb = RGBColor(0, 0, 0)
# Add text to shape
tf = shape.text_frame
tf.text = "Click Shape"
tf.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
# Add arrow
arrow = slide.shapes.add_shape(
MSO_SHAPE.RIGHT_ARROW,
Inches(4.5), Inches(1.5), Inches(2), Inches(1)
)
# Add ellipse
ellipse = slide.shapes.add_shape(
MSO_SHAPE.OVAL,
Inches(1), Inches(4), Inches(2), Inches(2)
)
prs.save('with-shapes.pptx')from pptx import Presentation
# Use existing template
prs = Presentation('template.pptx')
# Add slides with template layouts
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Using Template"
# Access slide master
slide_master = prs.slide_master
print(f"Template has {len(slide_master.slide_layouts)} layouts")
prs.save('customized.pptx')from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Slide with Notes"
# Add speaker notes
notes_slide = slide.notes_slide
notes_slide.notes_text_frame.text = """
Speaker Notes:
- Key point 1
- Key point 2
- Remember to mention Q3 results
"""
prs.save('with-notes.pptx')from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def create_business_presentation(output_file):
prs = Presentation()
# Slide 1: Title
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Q4 Business Review"
slide.placeholders[1].text = "December 2024\nPresented by: John Doe"
# Slide 2: Agenda
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Agenda"
tf = slide.placeholders[1].text_frame
tf.text = "Business Overview"
for item in ["Financial Performance", "Key Achievements", "Challenges", "Next Steps"]:
p = tf.add_paragraph()
p.text = item
p.level = 0
# Slide 3: Financial Table
slide = prs.slides.add_slide(prs.slide_layouts[5])
title = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(9), Inches(1))
title.text_frame.text = "Financial Summary"
title.text_frame.paragraphs[0].font.size = Pt(24)
title.text_frame.paragraphs[0].font.bold = True
# Add table
rows, cols = 5, 4
left, top, width, height = Inches(0.5), Inches(1.5), Inches(9), Inches(4)
table = slide.shapes.add_table(rows, cols, left, top, width, height).table
# Headers
headers = ['Metric', 'Q1', 'Q2', 'Q3']
for i, header in enumerate(headers):
cell = table.cell(0, i)
cell.text = header
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192)
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
cell.text_frame.paragraphs[0].font.bold = True
# Data
data = [
['Revenue', '$1.2M', '$1.5M', '$1.8M'],
['Expenses', '$0.8M', '$0.9M', '$1.0M'],
['Profit', '$0.4M', '$0.6M', '$0.8M'],
['Margin', '33%', '40%', '44%']
]
for row_idx, row_data in enumerate(data, 1):
for col_idx, value in enumerate(row_data):
table.cell(row_idx, col_idx).text = value
# Slide 4: Closing
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Thank You"
slide.placeholders[1].text = "Questions?\n\ncontact@company.com"
prs.save(output_file)
print(f"✓ Presentation created: {output_file}")
# Usage
create_business_presentation('business-review.pptx')from pptx import Presentation
from pptx.util import Inches
import os
def create_photo_gallery(image_folder, output_file):
"""Create a photo gallery presentation"""
prs = Presentation()
# Title slide
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Photo Gallery"
slide.placeholders[1].text = f"Images from {image_folder}"
# Get images
images = [f for f in os.listdir(image_folder) if f.endswith(('.jpg', '.png', '.jpeg'))]
# Add images (2 per slide)
for i in range(0, len(images), 2):
slide = prs.slides.add_slide(prs.slide_layouts[5])
# First image
if i < len(images):
img_path = os.path.join(image_folder, images[i])
slide.shapes.add_picture(img_path, Inches(0.5), Inches(1.5), width=Inches(4.5))
# Caption
txBox = slide.shapes.add_textbox(Inches(0.5), Inches(5.5), Inches(4.5), Inches(1))
tf = txBox.text_frame
tf.text = images[i]
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
# Second image
if i + 1 < len(images):
img_path = os.path.join(image_folder, images[i + 1])
slide.shapes.add_picture(img_path, Inches(5), Inches(1.5), width=Inches(4.5))
# Caption
txBox = slide.shapes.add_textbox(Inches(5), Inches(5.5), Inches(4.5), Inches(1))
tf = txBox.text_frame
tf.text = images[i + 1]
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
prs.save(output_file)
print(f"✓ Gallery created with {len(images)} images: {output_file}")
# Usage
# create_photo_gallery('./photos', 'gallery.pptx')from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
def create_invoice_pptx(invoice_data, output_file):
"""Create invoice as PowerPoint slide"""
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
# Title
title = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(9), Inches(1))
title.text_frame.text = "INVOICE"
title.text_frame.paragraphs[0].font.size = Pt(36)
title.text_frame.paragraphs[0].font.bold = True
title.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
# Invoice details
details = slide.shapes.add_textbox(Inches(0.5), Inches(1.5), Inches(4), Inches(2))
tf = details.text_frame
tf.text = f"Invoice #: {invoice_data['number']}\n"
tf.text += f"Date: {invoice_data['date']}\n"
tf.text += f"Due: {invoice_data['due_date']}"
# Client info
client = slide.shapes.add_textbox(Inches(5.5), Inches(1.5), Inches(4), Inches(2))
tf = client.text_frame
tf.text = f"Bill To:\n{invoice_data['client_name']}\n{invoice_data['client_address']}"
# Items table
rows = len(invoice_data['items']) + 2
table = slide.shapes.add_table(rows, 4, Inches(0.5), Inches(4), Inches(9), Inches(3)).table
# Headers
headers = ['Description', 'Qty', 'Rate', 'Amount']
for i, header in enumerate(headers):
cell = table.cell(0, i)
cell.text = header
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192)
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
cell.text_frame.paragraphs[0].font.bold = True
# Items
total = 0
for row_idx, item in enumerate(invoice_data['items'], 1):
amount = item['qty'] * item['rate']
total += amount
table.cell(row_idx, 0).text = item['description']
table.cell(row_idx, 1).text = str(item['qty'])
table.cell(row_idx, 2).text = f"${item['rate']:.2f}"
table.cell(row_idx, 3).text = f"${amount:.2f}"
# Total row
table.cell(rows-1, 2).text = "Total:"
table.cell(rows-1, 2).text_frame.paragraphs[0].font.bold = True
table.cell(rows-1, 3).text = f"${total:.2f}"
table.cell(rows-1, 3).text_frame.paragraphs[0].font.bold = True
prs.save(output_file)
print(f"✓ Invoice created: {output_file}")
# Usage
invoice = {
'number': 'INV-2024-001',
'date': '2024-01-15',
'due_date': '2024-02-15',
'client_name': 'ABC Corporation',
'client_address': '123 Business St\nCity, State 12345',
'items': [
{'description': 'Web Development', 'qty': 40, 'rate': 100},
{'description': 'Design', 'qty': 20, 'rate': 80},
{'description': 'Consulting', 'qty': 10, 'rate': 150}
]
}
create_invoice_pptx(invoice, 'invoice.pptx')# Solution: Check layout has the placeholder
slide = prs.slides.add_slide(prs.slide_layouts[0])
if len(slide.placeholders) > 1:
slide.placeholders[1].text = "Subtitle"# Solution: Check file exists before adding
import os
if os.path.exists('image.jpg'):
slide.shapes.add_picture('image.jpg', Inches(1), Inches(1))
else:
print("Image file not found!")# Solution: Ensure data categories and series match
chart_data = CategoryChartData()
chart_data.categories = ['Q1', 'Q2', 'Q3'] # Must match series length
chart_data.add_series('Revenue', (100, 150, 200))# Edit slide master for consistent branding
slide_master = prs.slide_master
title_layout = slide_master.slide_layouts[0]# Compress images before adding
from PIL import Image
img = Image.open('large.jpg')
img.thumbnail((1920, 1080))
img.save('compressed.jpg', quality=85)# Use fonts available on most systems
title.text_frame.paragraphs[0].font.name = 'Arial' # Safe choice# python-pptx has limited animation support
# Create simple, clean slides instead# test-pptx.py
from pptx import Presentation
from pptx.util import Inches
import os
print("Testing PPTX setup...")
# Test 1: Create basic presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Test Presentation"
prs.save('test-output.pptx')
assert os.path.exists('test-output.pptx')
print("✓ Basic creation test passed")
# Test 2: Add content
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Content Slide"
slide.placeholders[1].text = "Test content"
prs.save('test-output.pptx')
print("✓ Content addition test passed")
# Test 3: Load and verify
prs = Presentation('test-output.pptx')
assert len(prs.slides) == 2
print("✓ Load and verify test passed")
# Cleanup
os.remove('test-output.pptx')
print("✓ All tests passed!")Run test:
python test-pptx.pyMIT License - See LICENSE file for details.
© LeoYeAI, 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 1 other file in skills/claw-presentation-creator of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Claw Presentation Creator 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 |
|---|---|---|---|---|---|---|
| Claw Presentation Creator this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.5k | Automated safety check: Pass | MIT | |
| Slidesfcakyon/claude-codex-settings | 1.2k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Powerpoint SlidesNoi1r/powerpoint-skill | 124 | — | ~12k | Automated safety check: Notes | MIT | |
| PPTX HTML Fidelity Auditsanqiufong/slides-from-anything | 132 | 1 repos | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| Slide Making Skillhaojing8312/WorkClaw | 141 | 1 repos | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Ppt Generationpeintune/runjam | 228 | — | ~7.1k | Automated safety check: Pass | MIT |
fcakyon/claude-codex-settings
Create and edit presentation slide decks (.pptx) with PptxGenJS, bundled layout helpers, and render/validation utilities.
Noi1r/powerpoint-skill
Create visually rich PowerPoint (.pptx) presentations from academic papers, research notes, or any content the user wants in slide format.
sanqiufong/slides-from-anything
Audit a python-pptx export against its source HTML deck, identify layout/content drift (footer overflow, cropped content, missing italic/em, lost styling, off-rhythm spacing), and re-export with…
haojing8312/WorkClaw
Implement single-slide PowerPoint pages with PptxGenJS. An agent skill from haojing8312/WorkClaw.
peintune/runjam
A skill your agent uses when the user requests to generate, create, or make presentations (PPT/PPTX).
ymx10086/ResearchClaw
Create, edit, and analyze PowerPoint presentations — research talks, conference presentations, lecture slides, and poster summaries.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Works with
Categories
Create professional PowerPoint presentations with python-pptx. Claw Presentation Creator is an agent skill from LeoYeAI/openclaw-master-skills. Create professional PowerPoint presentations with python-pptx.
Claw Presentation Creator fits situations like: tasks that involve Slides and decks; tasks that involve PowerPoint presentations.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a claude-code`. Or copy the skill folder (skills/claw-presentation-creator in LeoYeAI/openclaw-master-skills) into .claude/skills/claw-presentation-creator in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a codex`. Or copy the skill folder (skills/claw-presentation-creator in LeoYeAI/openclaw-master-skills) into .agents/skills/claw-presentation-creator 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 LeoYeAI/openclaw-master-skills --skill claw-presentation-creator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/claw-presentation-creator, .gemini/skills/claw-presentation-creator, .github/skills/claw-presentation-creator and .opencode/skills/claw-presentation-creator in your project.
Going by SKILL.md and its folder, Claw Presentation Creator needs the command-line tools its instructions call (pip, npm and python). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use pip and npm, 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.
Claw Presentation Creator is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k 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 Claw Presentation Creator: Slides (fcakyon/claude-codex-settings, 1.2k stars), Powerpoint Slides (Noi1r/powerpoint-skill, 124 stars), PPTX HTML Fidelity Audit (sanqiufong/slides-from-anything, 132 stars) and Slide Making Skill (haojing8312/WorkClaw, 141 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,160 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.