SKILL.md
Automating Keynote (JXA-first, AppleScript discovery)
Contents
- [Relationship to the macOS automation skill](#relationship-to-the-macos-automation-skill)
- [Core framing](#core-framing)
- [Workflow (default)](#workflow-default)
- [Quick Examples](#quick-examples)
- [What to load](#what-to-load)
Relationship to the macOS automation skill
- This skill focuses on Keynote-specific automation (documents, slides, charts).
- Use
automating-mac-apps for cross-app workflows or general macOS scripting foundations.
- Assumes Apple Events knowledge from the related skill.
- PyXA Installation: To use PyXA examples in this skill, see the installation instructions in
automating-mac-apps skill (PyXA Installation section).
Core Framing
- JXA (JavaScript for Automation) enables macOS app scripting with JavaScript syntax.
- AppleScript dictionaries define Keynote's object model—discover via Script Editor.
- JXA objects are specifiers: read with methods like
.name(), write with assignments.
- Production scripts use JXA for reliability; AppleScript for prototyping.
- Important: The JXA
Path() function is required when specifying file paths to Keynote (e.g., for images, exports, or opening documents). Use Path("/path/to/file") instead of plain strings.
Workflow (default)
- Discover terms in Script Editor > File > Open Dictionary > Keynote.
- Prototype minimal AppleScript:
tell application "Keynote" to get name of document 1.
- Port to JXA:
Application("Keynote").documents[0].name() with try-catch blocks.
- Validate with read-only probes:
Application("Keynote").documents.length > 0.
- Use UI scripting only when dictionary lacks features (e.g.
Application("System Events")).
Quick Examples
Prototype (AppleScript):
tell application "Keynote"
get name of document 1
end tell
Production (JXA):
const keynote = Application("Keynote");
if (keynote.documents.length > 0) {
console.log(keynote.documents[0].name());
}
Create Slide:
const doc = keynote.documents[0];
const slide = doc.slides.push(keynote.Slide({baseSlide: doc.masterSlides['Title - Center']}));
slide.defaultTitleItem.objectText = "New Slide";
Add Image to Slide (note Path() usage):
const slide = doc.slides[0];
const img = keynote.Image({
file: Path("/Users/you/Desktop/diagram.png"), // Path() required!
position: { x: 100, y: 100 },
width: 800
});
slide.images.push(img);
Validation Checklist
After implementing Keynote automation:
When Not to Use
- For cross-platform presentation automation (use PowerPoint with Python libraries)
- When AppleScript alone suffices (skip JXA complexity)
- For web-based presentations (Google Slides, reveal.js)
- For non-macOS platforms
What to load
- Keynote JXA basics + runtime caveats:
automating-keynote/references/keynote-basics.md
- Keynote recipes (slides, text, images, export):
automating-keynote/references/keynote-recipes.md
- Deck generator example:
automating-keynote/references/keynote-deck-generator.md
- Chart-aware deck pattern:
automating-keynote/references/keynote-chart-aware-deck.md
- Advanced workflows (charts bridge, magic move, UI scripting):
automating-keynote/references/keynote-advanced.md
- PyXA (Python) practical examples:
automating-keynote/references/keynote-pyxa.md
- PyXA API Reference (complete class/method docs):
automating-keynote/references/keynote-pyxa-api-reference.md