| name | Keynote Creator |
| description | Guide for creating and editing Keynote presentations using AppleScript via bash |
Keynote Creator Skill
This skill guides you on how to create and manipulate Keynote presentations on macOS using AppleScript.
When to Use
Create a Keynote presentation when the user asks to:
- Create a presentation/slideshow/PPT
- Generate slides from documents, reports, or data
- Make a pitch deck, proposal, or summary presentation
- Convert content into visual presentation format
Workflow
- Open Keynote (for visual demo): Use
macos_show(app: "keynote") if visual mode is enabled
- Create presentation: Use bash with AppleScript
- Add slides: Use AppleScript to add and configure slides
- Set content: Add titles, body text, and images
- Export: Save as .key or export to PDF
CRITICAL: Stability Best Practices
ALWAYS use a SINGLE AppleScript to create the entire presentation. Do NOT run multiple separate scripts.
Why this matters:
- Each
osascript invocation may restart Keynote's scripting bridge
- Multiple rapid scripts cause Keynote to crash or become unresponsive
- A single comprehensive script is much more stable
Bad approach (causes crashes):
osascript -e 'tell application "Keynote" to make new document'
osascript -e 'tell application "Keynote" to tell front document to make new slide'
osascript -e 'tell application "Keynote" to tell front document to ...'
Good approach (stable):
osascript << 'EOF'
tell application "Keynote"
activate
delay 1 -- Wait for Keynote to fully launch
-- Do ALL operations in ONE script
set newDoc to make new document with properties {document theme:theme "White"}
delay 0.5 -- Brief pause after creating document
tell newDoc
-- All slides and content in one block
...
end tell
end tell
EOF
Required delays:
- After
activate: delay 1 (let app fully launch)
- After
make new document: delay 0.5
- After adding each slide:
delay 0.3 (optional but recommended for many slides)
AppleScript Patterns
Create New Presentation
osascript << 'EOF'
tell application "Keynote"
activate
set newDoc to make new document with properties {document theme:theme "White"}
return name of newDoc
end tell
EOF
Available themes: "White", "Black", "Gradient", "Classic", "Modern Type", "Showcase", "Photo Essay", "Bold", "Industrial", "Blueprint"
Add a Slide
osascript << 'EOF'
tell application "Keynote"
tell front document
-- Add slide with specific layout
set newSlide to make new slide with properties {base slide:master slide "Title - Center"}
end tell
end tell
EOF
Common master slides (layouts):
"Title - Center" - Title and subtitle centered
"Title - Top" - Title at top with content area
"Title & Subtitle" - Classic title slide
"Title & Bullets" - Title with bullet points
"Title, Bullets & Photo" - Title, bullets, and image
"Bullets" - Full slide bullet points
"Photo" - Full slide image
"Photo - Horizontal" - Landscape photo layout
"Quote" - Quote layout
"Blank" - Empty slide
Set Slide Title and Body
osascript << 'EOF'
tell application "Keynote"
tell front document
tell current slide
-- Set title
set object text of default title item to "Your Title Here"
-- Set body text (for slides with body placeholder)
set object text of default body item to "• Point 1
• Point 2
• Point 3"
end tell
end tell
end tell
EOF
Add Text Box with Custom Position
osascript << 'EOF'
tell application "Keynote"
tell front document
tell current slide
set newText to make new text item with properties {object text:"Custom text here"}
set position of newText to {100, 200}
set width of newText to 400
set height of newText to 100
end tell
end tell
end tell
EOF
Add Image to Slide
osascript << 'EOF'
tell application "Keynote"
tell front document
tell current slide
set imgFile to POSIX file "/path/to/image.jpg"
set newImage to make new image with properties {file:imgFile}
set position of newImage to {300, 200}
set width of newImage to 400
end tell
end tell
end tell
EOF
Navigate to Specific Slide
osascript << 'EOF'
tell application "Keynote"
tell front document
set current slide to slide 3
end tell
end tell
EOF
Get Slide Count
osascript -e 'tell application "Keynote" to count slides of front document'
Export to PDF
osascript << 'EOF'
tell application "Keynote"
tell front document
set exportPath to POSIX file "/Users/username/Desktop/presentation.pdf"
export to exportPath as PDF
end tell
end tell
EOF
Save Presentation
osascript << 'EOF'
tell application "Keynote"
tell front document
set savePath to POSIX file "/Users/username/Desktop/my_presentation.key"
save in savePath
end tell
end tell
EOF
Complete Example: Multi-Slide Presentation
This is the recommended pattern - ALL operations in ONE script with proper delays:
osascript << 'EOF'
tell application "Keynote"
activate
delay 1 -- IMPORTANT: Wait for Keynote to fully launch
-- Create new document
set newDoc to make new document with properties {document theme:theme "White"}
delay 0.5 -- Wait for document to initialize
tell newDoc
-- First slide is created automatically, set it as title slide
tell slide 1
set base slide to master slide "Title - Center"
set object text of default title item to "Q1 2026 Business Review"
set object text of default body item to "Financial Services Division"
end tell
delay 0.3
-- Add Overview slide
set slide2 to make new slide with properties {base slide:master slide "Title & Bullets"}
delay 0.3
tell slide2
set object text of default title item to "Executive Summary"
set object text of default body item to "• Revenue increased 15% YoY
• New client acquisition: $15M AUM
• Client satisfaction: 4.8/5.0
• All portfolios outperforming benchmarks"
end tell
-- Add Performance slide
set slide3 to make new slide with properties {base slide:master slide "Title & Bullets"}
delay 0.3
tell slide3
set object text of default title item to "Investment Performance"
set object text of default body item to "• Growth Portfolio: +3.2% (Benchmark +2.8%)
• Balanced Portfolio: +2.1% (Benchmark +1.9%)
• Income Portfolio: +0.9% (Benchmark +0.7%)
• Average Alpha: +0.3%"
end tell
-- Add Next Steps slide
set slide4 to make new slide with properties {base slide:master slide "Title & Bullets"}
delay 0.3
tell slide4
set object text of default title item to "Q2 Priorities"
set object text of default body item to "• Complete endowment fund implementation
• Expand alternative investment offerings
• Launch client education seminar series
• Target: $25M total new AUM"
end tell
delay 0.5 -- Wait before saving
-- Save the presentation
set savePath to POSIX file "~/Desktop/Q1_Review.key"
save in savePath
end tell
return "Presentation created with 4 slides"
end tell
EOF
Key points about this example:
- Single
osascript command containing everything
delay 1 after activate to let Keynote fully launch
delay 0.5 after creating document
delay 0.3 after each make new slide
delay 0.5 before save operation
Tips for Better Presentations
- Structure: Always start with a title slide, then overview, details, and conclusion
- Bullet Points: Keep to 4-6 points per slide for readability
- Titles: Use clear, action-oriented titles
- Consistency: Use the same master slide for similar content types
- Images: Position images consistently across slides
Error Handling
When Keynote operations fail, common issues are:
- Crashes/Freezes: Almost always caused by running multiple separate scripts. Solution: Combine into ONE script.
- App not running: Use
macos_show(app: "keynote") first, then wait 1-2 seconds before running the creation script.
- Invalid master slide name: Check available layouts with document's master slides
- File path issues: Always use POSIX file syntax and expand ~ to full path (e.g.,
/Users/username/Desktop/)
- "Keynote got an error": Add more
delay statements, especially after make new slide
If the script times out or crashes:
- First, check if Keynote is still open - it may have created partial content
- Try adding longer delays (e.g.,
delay 1 instead of delay 0.3)
- For very long presentations (10+ slides), consider splitting into two separate runs
Recommended Workflow for Generating from Reports
- Read the source (reports, documents)
- Plan slide structure (identify key sections)
- Create presentation with appropriate theme
- Add slides iteratively - one at a time with content
- Save and Export - save as .key AND export to PDF
- Close Keynote - always close the app after finishing (see below)
- Send BOTH files to user via messaging platform (.key for editing, PDF for viewing)
Closing Keynote After Creation
IMPORTANT: Always close Keynote after you finish creating and saving the presentation.
If you have macos_close tool available (Visual Demo Mode), use:
macos_close(target: "keynote", delay_ms: 500)
Alternatively, use AppleScript:
osascript -e 'tell application "Keynote" to quit'
This keeps the user's desktop clean and shows a complete workflow.
File Handling
- Save .key files to
~/Desktop/ or user's preferred location
- Export PDF to the same location with same base name
- Use descriptive filenames with dates (e.g.,
Q1_2026_Review.key and Q1_2026_Review.pdf)
- IMPORTANT: Always send both .key and .pdf files to the user