.agents/skills/html-to-ppt/SKILL.md
Convert HTML/Markdown to PowerPoint presentations using Marp
npx skillsauth add 305s/magicallesson html-to-pptInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill enables conversion from Markdown or HTML to professional PowerPoint presentations using Marp (Markdown Presentation Ecosystem). Create beautiful, consistent slides using simple Markdown syntax with CSS-based themes.
Example prompts:
Marp uses a simple syntax where --- separates slides:
---
marp: true
theme: default
---
# Slide 1 Title
Content for first slide
---
# Slide 2 Title
Content for second slide
# Convert to PowerPoint
marp slides.md -o presentation.pptx
# Convert to PDF
marp slides.md -o presentation.pdf
# Convert to HTML
marp slides.md -o presentation.html
# With specific theme
marp slides.md --theme gaia -o presentation.pptx
---
marp: true
---
# Title
- Bullet point 1
- Bullet point 2
- Bullet point 3
---
marp: true
theme: gaia
class: lead
---
# Presentation Title
## Subtitle
Author Name
Date
---
marp: true
theme: default # default, gaia, uncover
size: 16:9 # 4:3, 16:9, or custom
paginate: true # Show page numbers
header: 'Company Name' # Header text
footer: 'Confidential' # Footer text
backgroundColor: #fff
backgroundImage: url('bg.png')
---
---
marp: true
theme: default # Clean, minimal
---
---
marp: true
theme: gaia # Colorful, modern
---
---
marp: true
theme: uncover # Bold, presentation-focused
---
---
marp: true
theme: gaia
class: lead # Centered title slide
---
---
marp: true
theme: gaia
class: invert # Inverted colors
---
# Heading 1
## Heading 2
**Bold text** and *italic text*
`inline code`
> Blockquote for emphasis
- Unordered item
- Another item
- Nested item
1. Ordered item
2. Second item
1. Nested numbered
# Code Example
\`\`\`python
def hello():
print("Hello, World!")
\`\`\`
| Feature | Status |
|---------|--------|
| Tables | ✅ |
| Charts | ✅ |
| Images | ✅ |




---
marp: true
backgroundImage: url('background.jpg')
---
# Slide with Background
---
marp: true
style: |
.columns {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
---
# Two Column Layout
<div class="columns">
<div>
## Left Column
- Point 1
- Point 2
</div>
<div>
## Right Column
- Point A
- Point B
</div>
</div>
---
marp: true
theme: gaia
class: gaia
---
<!--
_backgroundImage: linear-gradient(to right, #4a90a4, #4a90a4 50%, white 50%)
-->
<div class="columns">
<div style="color: white;">
# Dark Side
</div>
<div>
# Light Side
</div>
</div>
---
marp: true
---
<!--
_backgroundColor: #123
_color: white
_paginate: false
-->
# Special Slide
---
marp: true
---
<style scoped>
h1 {
color: red;
}
</style>
# This Title is Red
import subprocess
import tempfile
import os
def markdown_to_pptx(md_content, output_path, theme='default'):
"""Convert Markdown to PowerPoint using Marp."""
# Add marp directive if not present
if '---\nmarp: true' not in md_content:
md_content = f"---\nmarp: true\ntheme: {theme}\n---\n\n" + md_content
# Write to temp file
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
f.write(md_content)
temp_path = f.name
try:
# Convert using marp
subprocess.run([
'marp', temp_path, '-o', output_path
], check=True)
return output_path
finally:
os.unlink(temp_path)
# Usage
md = """
# Welcome
Introduction slide
---
# Agenda
- Topic 1
- Topic 2
- Topic 3
"""
markdown_to_pptx(md, 'presentation.pptx')
const { marpCli } = require('@marp-team/marp-cli');
// Convert file
marpCli(['slides.md', '-o', 'output.pptx']).then(exitCode => {
console.log('Done:', exitCode);
});
def create_presentation(title, sections, output_path, theme='gaia'):
"""Generate presentation from structured data."""
md_content = f"""---
marp: true
theme: {theme}
paginate: true
---
<!-- _class: lead -->
# {title}
{sections.get('subtitle', '')}
{sections.get('author', '')}
"""
for section in sections.get('slides', []):
md_content += f"""---
# {section['title']}
"""
for point in section.get('points', []):
md_content += f"- {point}\n"
if section.get('notes'):
md_content += f"\n<!-- Notes: {section['notes']} -->\n"
md_content += """---
<!-- _class: lead -->
# Thank You!
Questions?
"""
return markdown_to_pptx(md_content, output_path, theme)
def generate_report_slides(data_list, template, output_dir):
"""Generate multiple presentations from data."""
import os
for data in data_list:
content = template.format(**data)
output_path = os.path.join(output_dir, f"{data['name']}_report.pptx")
markdown_to_pptx(content, output_path)
---
marp: true
theme: gaia
class: lead
paginate: true
---
# API Documentation
## REST API Best Practices
Engineering Team
January 2024
---
# Agenda
1. Authentication
2. Endpoints Overview
3. Error Handling
4. Rate Limiting
5. Examples
---
# Authentication
All requests require an API key:
```http
Authorization: Bearer YOUR_API_KEY
| Method | Endpoint | Description | |--------|----------|-------------| | GET | /users | List all users | | POST | /users | Create user | | GET | /users/:id | Get user details | | PUT | /users/:id | Update user | | DELETE | /users/:id | Delete user |
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid email format",
"details": ["email must be valid"]
}
}
### Example 2: Business Pitch
```python
def create_pitch_deck(company_data):
"""Generate investor pitch deck."""
md = f"""---
marp: true
theme: uncover
paginate: true
---
<!-- _class: lead -->
<!-- _backgroundColor: #2d3748 -->
<!-- _color: white -->
# {company_data['name']}
{company_data['tagline']}
---
# The Problem
{company_data['problem_statement']}
**Market Pain Points:**
"""
for pain in company_data['pain_points']:
md += f"- {pain}\n"
md += f"""
---
# Our Solution
{company_data['solution']}
})
---
# Market Opportunity
- **TAM:** {company_data['tam']}
- **SAM:** {company_data['sam']}
- **SOM:** {company_data['som']}
---
# Traction
| Metric | Value |
|--------|-------|
| Monthly Revenue | {company_data['mrr']} |
| Customers | {company_data['customers']} |
| Growth Rate | {company_data['growth']} |
---
# The Ask
**Seeking:** {company_data['funding_ask']}
**Use of Funds:**
- Product Development: 40%
- Sales & Marketing: 35%
- Operations: 25%
---
<!-- _class: lead -->
# Let's Build the Future Together
{company_data['contact']}
"""
return md
# Generate deck
pitch_data = {
'name': 'TechStartup Inc',
'tagline': 'AI-Powered Document Processing',
'problem_statement': 'Businesses waste 20% of time on manual document work',
'pain_points': ['Manual data entry', 'Error-prone processes', 'Slow turnaround'],
'solution': 'Automated document processing with 99.5% accuracy',
'tam': '$50B',
'sam': '$10B',
'som': '$500M',
'mrr': '$100K',
'customers': '50',
'growth': '20% MoM',
'funding_ask': '$5M Series A',
'contact': '[email protected]'
}
md_content = create_pitch_deck(pitch_data)
markdown_to_pptx(md_content, 'pitch_deck.pptx', theme='uncover')
# Using npm
npm install -g @marp-team/marp-cli
# Using Homebrew
brew install marp-cli
# Verify installation
marp --version
tools
Automate customer support workflows with Zendesk ticket management, routing, and analytics
tools
Automate YouTube content workflows including video management, analytics, scheduling, and channel optimization
content-media
Create, edit, and manipulate Excel spreadsheets programmatically using openpyxl
testing
Use when creating new skills, editing existing skills, or verifying skills work before deployment